最近也在研究项目🀄️的日志配置,发现的问题有:
1.项目启动时提示日志冲突。
2.log4j配置文件不管用。
3.生产环境日志分割方法。(有的分割了,有的没有分割)
4.生产环境日志名称不是我在日志文件中配置的。
为了解决这些问题,我查阅了Spring boot的日志相关配置。
原来Spring boot用的默认就是logback。关于logback,原来是log4j的作者又一经典日志框架。我就不详细赘述了。
产生上述问题的原因是:
1.查看我的pom文件,原来我引用了多个日志框架,才导致项目启动时日志冲突,
2.但是我的项目默认使用的还是logback,(spring-boot-starter-logging)所以我的log4j配置文件不起作用。
3.生产环境的日志原来是在项目启动的时候在一个config文件里配置的,和项目名称一样,并且默认打印的是控debug级别的日志。它的分割也是运维人员用的linux脚本。
我的解决方式:
1.我就用logback了,所以删除其他的log框架,排除其他的log框架(如果其他的jar里有多余的话)
2.创建logback-spring.xml在resources目录下。
3.我并没有删除原来的服务器上配置的文件,运维人员已经分割了,我就同时保留吧。
下面是logback-spring.xml的配置模版:
<?xml version="1.0" encoding="UTF-8"?>
<!--
根节点包含的属性
- scan:当此属性设置为
true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当
scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug:当此属性设置为
true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
debug="false" scan="true" scanPeriod="30 second">
<property name="PROJECT" value="ua-admin" />
<property name="ROOT" value="/logs/${PROJECT}/" />
<!--日志最大限制-->
<property name="FILESIZE" value="50MB" />
<!--日志保留15天-->
<property name="MAXHISTORY" value="15"/>
<!-- 控制台打印 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %date{yyyy-MM-dd HH:mm:ss} [%thread] %c:%L %M : %m%n
</pattern>
</encoder>
</appender>
<!-- ERROR 输入到文件,按日期和文件大小 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %date{yyyy-MM-dd HH:mm:ss} [%thread] %c:%L %M : %m%n
</pattern>
</encoder>
<!--默认的日志名称 -->
<file>${ROOT}/error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<!--<timeBasedFileNamingAndTriggeringPolicy-->
<!--class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--<maxFileSize>${FILESIZE}</maxFileSize>-->
<!--</timeBasedFileNamingAndTriggeringPolicy>-->
</rollingPolicy>
</appender>
<!-- WARN 输入到文件,按日期和文件大小 -->
<!--<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--<encoder charset="utf-8">-->
<!--<pattern>[%-5level] %date{yyyy-MM-dd HH:mm:ss} [%thread] %logger{36} - %m%n-->
<!--</pattern>-->
<!--</encoder>-->
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--<level>WARN</level>-->
<!--<onMatch>ACCEPT</onMatch>-->
<!--<onMismatch>DENY</onMismatch>-->
<!--</filter>-->
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--<fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>-->
<!--<maxHistory>${MAXHISTORY}</maxHistory>-->
<!--<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--<maxFileSize>${FILESIZE}</maxFileSize>-->
<!--</timeBasedFileNamingAndTriggeringPolicy>-->
<!--</rollingPolicy>-->
<!--</appender>-->
<!-- INFO 输入到文件,按日期和文件大小 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %date{yyyy-MM-dd HH:mm:ss} [%thread] %c:%L %M : %m%n
</pattern>
</encoder>
<file>${ROOT}/info.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<!--<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--<maxFileSize>${FILESIZE}</maxFileSize>-->
<!--</timeBasedFileNamingAndTriggeringPolicy>-->
</rollingPolicy>
</appender>
<!-- DEBUG 输入到文件,按日期和文件大小 -->
<!--<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--<encoder charset="utf-8">-->
<!--<pattern>[%-5level] %date{yyyy-MM-dd HH:mm:ss} [%thread] %logger{36} - %m%n-->
<!--</pattern>-->
<!--</encoder>-->
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--<level>DEBUG</level>-->
<!--<onMatch>ACCEPT</onMatch>-->
<!--<onMismatch>DENY</onMismatch>-->
<!--</filter>-->
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--<fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>-->
<!--<maxHistory>${MAXHISTORY}</maxHistory>-->
<!--<timeBasedFileNamingAndTriggeringPolicy-->
<!--class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--<maxFileSize>${FILESIZE}</maxFileSize>-->
<!--</timeBasedFileNamingAndTriggeringPolicy>-->
<!--</rollingPolicy>-->
<!--</appender>-->
<!-- TRACE 输入到文件,按日期和文件大小 -->
<!--<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--<encoder charset="utf-8">-->
<!--<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n-->
<!--</pattern>-->
<!--</encoder>-->
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--<level>TRACE</level>-->
<!--<onMatch>ACCEPT</onMatch>-->
<!--<onMismatch>DENY</onMismatch>-->
<!--</filter>-->
<!--<rollingPolicy-->
<!--class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--<fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>-->
<!--<maxHistory>${MAXHISTORY}</maxHistory>-->
<!--<timeBasedFileNamingAndTriggeringPolicy-->
<!--class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--<maxFileSize>${FILESIZE}</maxFileSize>-->
<!--</timeBasedFileNamingAndTriggeringPolicy>-->
<!--</rollingPolicy>-->
<!--</appender>-->
<!-- SQL相关日志输出-->
<!--<logger name="org.apache.ibatis" level="INFO" additivity="false" />-->
<!--<logger name="org.mybatis.spring" level="INFO" additivity="false" />-->
<!--<logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false" />-->
<!-- Logger 根目录 上面的配置写到这个里面就会生成相应的日志文件 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<!--<appender-ref ref="DEBUG" />-->
<appender-ref ref="ERROR" />
<!--<appender-ref ref="WARN" />-->
<appender-ref ref="INFO" />
<!--<appender-ref ref="TRACE" />-->
</root>
</configuration>
彩🥚:可以在类名上添加@slf4j 替代 我们经常写的 private static final Logger logger = LoggerFactory.getLogger(XXX.class); 这句话。这样们就可以使用log.info("")啦。
但是要加入lombok依赖。 因为@slf4j是lombok提供的。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
我参考了:看这里。
错误的写法导致生产环境日志打印的时间一直是项目启动时间。
(日志格式中的日期不可以写成 %d{${DATETIME}})
DATETIME引用timestamp
<timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss" />
这样引用打印日志的时间不会变。