SpringBoot多环境日志配置

news/2024/9/18 15:11:51/ 标签: spring boot, 后端, java

SpringBoot 默认使用 LogBack 日志系统

默认情况下,SpringBoot项目的日志只会在控制台输入。

如果想查询历史日志则无法找到,我们需要一个日志系统来统一管理日志。

一般正式项目会有单独日志系统,将日志操作存入数据库。

第一种方式是

在 application.propertiesapplication.yml文件 中添加

同时设置logging.file.namelogging.file.path,则logging.file.name会被忽略。

# 设置日志文件的具体名称
logging.file.name=./logfile.log# 或者设置日志文件的目录
logging.file.path=/logfile/

更详细的配置也可在这个配置文件中写

第二种方式 使用配置文件

1、引入依赖

引入slf4j-api 是为了使用 @Slf4j 注解简化操作

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

2、多环境配置

image

3、创建 logback xml

在 resource 下创建 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><springProperty scope="context" name="applicationName"source="spring.application.name" defaultValue="spring-restful-api"/><!-- 单个日志文件的最大,尺寸 --><springProperty scope="context" name="maxFileSize"source="logging.file.max-size" defaultValue="10MB"/><!-- 日志保留时长 (天) --><springProperty scope="context" name="maxHistory"source="logging.file.max-history" defaultValue="180"/><!-- 日志文件路径 --><springProperty scope="context" name="logDir"source="logging.file.path" defaultValue="./logs"/><contextName>${applicationName}</contextName><!-- 彩色日志 --><!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRule conversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }) %clr(---){faint} %clr([%10t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wex"/><property name="FILE_LOG_PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8"><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- info日志 appender  --><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${logDir}/info.log</file><!-- 追加方式记录日志默认是true 日志被追加到文件结尾 --><append>true</append><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 --><fileNamePattern>${logDir}/info/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 日志最大的历史 180天 --><maxHistory>${maxHistory}</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为20MB --><maxFileSize>1MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印info日志 --><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- DEBUG日志 appender  --><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${logDir}/debug.log</file><!-- 追加方式记录日志默认是true 日志被追加到文件结尾 --><append>true</append><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${logDir}/debug/debug-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 日志最大的历史 180天 --><maxHistory>${maxHistory}</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为20MB --><maxFileSize>${maxFileSize}</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 --><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- WARN日志 appender  --><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${logDir}/warn.log</file><!-- 追加方式记录日志默认是true 日志被追加到文件结尾 --><append>true</append><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${logDir}/warn/warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 日志最大的历史 180天 --><maxHistory>${maxHistory}</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为20MB --><maxFileSize>${maxFileSize}</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 --><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- error 日志 appender  --><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${logDir}/error.log</file><!-- 追加方式记录日志默认是true 日志被追加到文件结尾 --><append>true</append><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${logDir}/error/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern><!-- 日志最大的历史 180天 --><maxHistory>${maxHistory}</maxHistory><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为20MB --><maxFileSize>1MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8"><pattern>${FILE_LOG_PATTERN}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--  开发环境和测试环境,日志输出到控制台  --><springProfile name="dev|test"><!--控制台和日志文件输出级别--><root level="INFO"><appender-ref ref="STDOUT"/></root><logger name="com.pyb.demo" level="debug"/> <!-- 开发和测试环境, 指定某包日志为debug级 --></springProfile><!--  生产环境,日志输出到文件 --><springProfile name="prod"><root level="INFO"><appender-ref ref="INFO"/><appender-ref ref="ERROR"/><appender-ref ref="DEBUG"/><appender-ref ref="WARN"/></root><logger name="com.pyb.demo" level="warn"/> <!-- 生产环境, 指定某包日志为warn级 --><logger name="com.pyb.demo.Application" level="info"/> <!-- 特定某个类打印info日志, 比如application启动成功后的提示语 --></springProfile></configuration>

解释

 <!--<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。name:用来指定受此logger约束的某一个包或者具体的某一个类。level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。addtivity:是否向上级logger传递打印信息。默认是true。<logger name="org.springframework.web" level="info"/><logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>--><!--使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:【logging.level.org.mybatis=debug logging.level.dao=debug】--><!--root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG可以包含零个或多个元素,标识这个appender将会添加到这个logger。-->

4.使用

image

缺点(启动项目可能会报错)

spring会优先加载项目中或者jar包中的logback.xml并读取里边的路径(/workspace/api-default.log),然后再加载application.yml之后再加载我们的日志文件logback-spring.xml,项目部署在服务器上运行一般不会用root这种权限很大的用户执行,权限小的会对logback.xml里的路径可能会没有操作权限就会导致项目启动失败。

文章转载自:进击的乌拉

原文链接:https://www.cnblogs.com/pyb999/p/18381241

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


http://www.ppmy.cn/news/1517214.html

相关文章

力扣hot100-动态规划

文章目录 概念动态规划基本思想常见步骤常用技巧常见问题类型 动态规划题目题目&#xff1a; 爬楼梯题解 概念 动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是一种解决问题的算法思想&#xff0c;通常用于优化问题。它的核心思想是将一个…

PTA L1-019 谁先倒

L1-019 谁先倒&#xff08;15分&#xff09; 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就输了&#xff0c;输家罚…

sqli-labs靶场通关攻略(36-40关)

第36关&#xff08;宽字节注入&#xff08;Bypass MySQL Real Escape String&#xff09;&#xff09; 查数据库 ?id-1%df%27%20union%20select%202,database(),3%20-- 查表 ?id-1%df union select 1,group_concat(table_name),3 from information_schema.tables where tab…

图片生成box-shadow并下载

把图片生成由box-shadow拼接成的阴影组成的图片 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><titl…

【焕新】同为科技(TOWE)23周年庆典

每年的8月23日&#xff0c;都是一个值得铭记、守护、欢庆的日子。这一天同为科技&#xff08;TOWE&#xff09;迎来公司成立23周年纪念日&#xff0c;是属于TOWE品牌向前、长远的里程碑。从2001到2024&#xff0c;从品牌与文化&#xff0c;从产品到服务。 同为科技&#xff08;…

Python自动化办公2.0 课程更新

之前的课程&#xff0c;包含了Python pandassklearn 数据分析&#xff0c;和Stremlit 可视化仪表盘的开发 和一系列自动化项目案例的开发&#xff0c;包括我们封装了ztl-uia 模块&#xff0c;可以同时自动化操控windows 软件和浏览器, 封装的模块&#xff0c;针对为付费学员使…

【AI模型:追求全能还是专精?】

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 ​编辑 一&#xff1a;AI模型的全面评估和比较 二&#xff1a;AI模型的专精化和可扩展性…

微软正式确认将在近期关闭经典Windows控制面板

微软在不断测试并为 Windows 添加新功能的同时&#xff0c;也在不断淘汰一些公司认为不再需要的功能。这些功能会被添加到Windows 过时功能的列表中&#xff0c;最近的一项功能是 Paint 3D&#xff0c;该公司宣布它很快就会被淘汰。 与微软似乎希望尽早取消的"3D 画图&quo…

uniapp video标签无法播放视频

当video标签路径含有中文以及特殊字符视频就会无法播放 解决方法使用encodeURIComponent对路径进行加密处理 videoSrc data.coursewareFile? ${appConfig.apiUrl encodeURIComponent(data.coursewareFile)}: "";最后效果

内衣洗衣机和手洗哪个干净?五款高评分内衣洗衣机实测分享!

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

增材制造(3D打印):为何备受制造业瞩目?

在科技浪潮的推动下&#xff0c;增材制造——即3D打印技术&#xff0c;正逐步成为制造业领域的璀璨新星&#xff0c;吸引了航空航天、汽车、家电、电子等众多行业的目光。那么&#xff0c;是什么让3D打印技术如此引人注目并广泛应用于制造领域&#xff1f;其背后的核心优势又是…

应用软件初始化的优缺点,读写ini,json,xml...

读写 INI 文件和读写 JSON 文件是两种常见的数据存储方式&#xff0c;它们各自有不同的优缺点&#xff0c;适用于不同的应用场景。以下是它们的一些比较&#xff1a; 读写 INI 文件 优点&#xff1a; 人类可读性&#xff1a;INI 文件格式简单&#xff0c;易于人类阅读和编辑…

2024前端面试题-js篇

1.js有哪些数据类型 基础数据类型&#xff1a;string,number,boolean&#xff0c;null&#xff0c;undefined&#xff0c;bigInt&#xff0c;symbol 引用数据类型&#xff1a;Object 2.js检测数据类型的方式 typeof&#xff1a;其中数组、对象、null都会被判断为object&…

Jupyter 的可视化 Debug

Jupyter 这种工具虽然有很好的交互性能&#xff0c;但其也明白&#xff0c;对于大型代码库&#xff0c;最好还是用传统的 IDE 比较靠谱。 因此为了弥补这一缺陷&#xff0c;Jupyter 项目在过去几年也希望通过 JupyterLab 来加强对大型代码库的处理过程。 然而&#xff0c;Jup…

vue中实现图片裁剪

在现代Web应用中&#xff0c;图片处理是一个常见的需求。本文将介绍如何使用Vue.js结合Cropper.js实现一个简单的图片裁剪功能。以下是实现该功能的完整代码。 代码实现 <template><div class"c-copper-container" :class"{wd260 : type articlesub…

零知识证明-非对称加解密算法(三)

前言 非对称加解密算法 &#xff0c;就有对称加解密算法 1:对称算法 定义 对称算法&#xff0c;加解密双方使用一个密钥。即加密秘钥和解密秘钥相同。 对称加密又分为&#xff1a;分组加密和流加密 分组加密 分组加密是每次只能处理特定长度的一块数据的一类密码算法&#xff0…

WPF 手撸插件 五 消息总线

虽然暂时不知道该如何将消息总线集成到插件系统中&#xff0c;但是让我先学习起来吧&#xff0c;本文主要来说说我最近学习的Reface.EventBus Reface.EventBus有两个版本&#xff0c;分别支持.Net Framework和 .Net Core。 我们这里先说支持.Net Framework的版本&#xff0c;先…

【问题记录】mysql报错 ,mysql2 和 mysql 5.

错误2 和 错误5 都是由于注册表有问题&#xff1a; 由于我之前安装过MySQL&#xff0c;导致之前的配置没有删除。 解决&#xff1a; 搜索打开注册表编辑器&#xff1a; 注册表中找到MySQL: 修改路径&#xff1a; "D:\develop\mysql-8.0.39-winx64\bin\mysqld&quo…

边缘物联网平台AIoTedge推荐

AIoTedge是一个创新的智能边缘计算平台&#xff0c;它通过边云协同的架构设计&#xff0c;实现了多点部署和分布式计算&#xff0c;提高了数据处理的速度和效率&#xff0c;同时确保了数据的安全性和隐私性。平台具备强大的分布式AIoT处理能力&#xff0c;适用于多种场景&#…

【中学教资-信息技术】图像/音频/视频文件大小的计算

图像/音频/视频文件大小的计算 1 图像文件2 音频文件3 视频文件4 例题5 总结 视频讲解&#xff1a;音频文件大小/视频文件大小计算-失舵之舟 1 图像文件 压缩比原始大小/被压缩之后大小 颜色深度&#xff1a;指图像中每个像素所占的二进制位数&#xff08;bit&#xff09; n位…