关注微信公众号:CodingTechWork,一起学习进步。
对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维。而日志的输出需要有一定的规划,如日志命名、日志大小,日志分割的文件个数等。在Spring的框架下,我们可以使用log4j
来进行日志的设置,高版本的SpringBoot会使用log4j2
。
截取官网的原话:Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
Log4j其实可以理解为log for java
,所以是java的日志框架,提供日志服务,而Log4j 2是Log4j的升级版本,性能比logback
好。
日志级别优先级从低到高:ALL、DEBUG、 INFO、 WARN、 ERROR、FATAL、 OFF
。一般官网建议就使用DEBUG、INFO、WARN和ERROR
这四个,但是我们可以加一个ALL
最低级别的来进行总日志的输出。日志的登记越高,打出的日志越少。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
这边要注意的是:
spring-boot-starter-logging
1.3.x及以下版本
的Spring Boot才支持log4j
的日志配置。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j
log4j2一般可以通过xml,json,yaml
或者properties
形式文件来实现,我们这边主要介绍xml
文件格式。
引入log4j2
依赖后,默认在src/main/resources目录
下加入log4j2.xml配置文件
对日志进行配置即可,然后在application.yml
中进行访问路径的配置。
示例如下:
#日志配置 无特殊需求无需更改
logging:
config: classpath:log4j2.xml
level:
root: INFO
javax.activation: info
org.apache.catalina: INFO
org.apache.commons.beanutils.converters: INFO
org.apache.coyote.http11.Http11Processor: INFO
org.apache.http: INFO
org.apache.tomcat: INFO
org.springframework: INFO
com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG
当然我们也可以在微服务部署的config/
目录下放置,然后在application.yml
中进行访问路径的配置。
示例如下:我们的micro-service01部署中配置的log4j2.xml路径。
[userA@linux01 config]$ pwd
/home/userA/SpringBoot/micro-service01/config
[userA@linux01 config]$ ll
total 24
-rwxr-xr-x 1 userA userA 5938 Sep 9 16:30 application.yml
-r-------- 1 userA userA 8342 Sep 8 16:33 log4j2.xml
#日志配置 无特殊需求无需更改
logging:
config: /home/userA/SpringBoot/micro-service01/config/log4j2.xml
level:
root: INFO
javax.activation: info
org.apache.catalina: INFO
org.apache.commons.beanutils.converters: INFO
org.apache.coyote.http11.Http11Processor: INFO
org.apache.http: INFO
org.apache.tomcat: INFO
org.springframework: INFO
com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG
<Configuration>
<properties>
<property name="LOG_HOME">./service-logsproperty>
properties>
<Appenders>
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout
pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
disableAnsi="false" noConsoleNoAnsi="false"/>
Console>
<RollingFile name="allFileAppender"
fileName="${LOG_HOME}/all.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%npattern>
PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy/>
Policies>
<DefaultRolloverStrategy max="100"/>
RollingFile>
<RollingFile name="debugFileAppender"
fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
Filters>
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%npattern>
PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy/>
Policies>
<DefaultRolloverStrategy max="100"/>
RollingFile>
<RollingFile name="infoFileAppender"
fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
Filters>
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%npattern>
PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
Policies>
RollingFile>
<RollingFile name="warnFileAppender"
fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
Filters>
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%npattern>
PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy/>
Policies>
<DefaultRolloverStrategy max="100"/>
RollingFile>
<RollingFile name="errorFileAppender"
fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<pattern>%d %p %C{} [%t] %m%npattern>
PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy/>
Policies>
<DefaultRolloverStrategy max="100"/>
RollingFile>
<RollingFile name="errorJsonAppender"
fileName="${LOG_HOME}/error-json.log"
filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
<JSONLayout compact="true" eventEol="true" locationInfo="true"/>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
Policies>
RollingFile>
Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="allFileAppender" level="all"/>
<AppenderRef ref="consoleAppender" level="debug"/>
<AppenderRef ref="debugFileAppender" level="debug"/>
<AppenderRef ref="infoFileAppender" level="info"/>
<AppenderRef ref="warnFileAppender" level="warn"/>
<AppenderRef ref="errorFileAppender" level="error"/>
<AppenderRef ref="errorJsonAppender" level="error"/>
Root>
<Logger name="org.springframework" level="debug"/>
<Logger name="druid.sql.Statement" level="warn"/>
<Logger name="com.mybatis" level="warn"/>
<Logger name="org.hibernate" level="warn"/>
<Logger name="com.zaxxer.hikari" level="info"/>
<Logger name="org.quartz" level="info"/>
<Logger name="com.andya.demo" level="debug"/>
Loggers>
Configuration>
根节点Configuration
中有两个常用的属性:status和monitorterval。如:
属性
status
:是用于指定log4j的级别;monitorterval
:是用于指定log4j自动重新检测读取配置内容的间隔时间,单位为秒(s),最小值为5秒。
<Configuration status="warn" name="MyApp" packages="">
<properties>
<property name="LOG_HOME">./service-logsproperty>
properties>
<Appenders>
<File name="MyFile" fileName="${LOG_HOME}/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
File>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
Root>
Loggers>
Configuration>
变量配置,如模板中的
,我们可以配置日志的路径。后续日志存放的前缀路径即为./service-logs
下,
中配置了前缀,app.log就会存放在./service-logs
下。
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
Console>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="STDOUT"/>
Root>
Loggers>
Configuration>
Console节点用于定义输出控制台的Appender。
属性
name
:用于指定Appender的名称;target
:用于指定输出目标,一般是SYSTEM_OUT
或SYSTEM_ERR
,默认是SYSTEM_OUT
;
节点
PatternLayout
:用于指定输出格式,不设置的话,默认为:%m%n
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<File name="MyFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
File>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MyFile"/>
Root>
Loggers>
Configuration>
File节点用于将日志输出到指定文件,一般不用该节点,而使用RollingFile
节点。
属性
name
:用于指定Appender的名称;fileName
:用于指定日志文件的全路径;
节点
PatternLayout
:用于指定输出格式,不设置的话,默认为:%m%n
RollingFile节点用于实现日志文件更动更新的Appender,当满足条件(日志大小、指定时间等)重命名或打包原日志文件进行归档,生成新日志文件用于日志写入。
我们可以设置ALL、DEBUG、 INFO、 WARN、 ERROR
这些级别的RollingFileAppender。
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB"/>
Policies>
<DefaultRolloverStrategy max="10"/>
RollingFile>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
Root>
Loggers>
Configuration>
上述模板中,日志先写入logs/app.log
中,每当文件大小达到100MB时或经过1天,按照在logs/2020-09/
目录下以app-2020-09-09-1.log.gz
格式对该日志进行压缩重命名并归档,并生成新的文件app.log
进行日志写入。
其中,filePattern
属性的文件格式中%i
就类似于一个整数计数器,受到
控制,要特别注意的是:当文件个数达到10个的时候会循环覆盖
前面已归档的1-10个文件。若不设置该参数,默认为7
。
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
Policies>
RollingFile>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
Root>
Loggers>
Configuration>
上述模板中,日志先写入logs/app.log
中,每当文件的时间间隔到达6小时(由%d{yyyy-MM-dd-HH}
决定,也可以设置成%d{yyyy-MM-dd-HH-mm}
,则间隔为分钟级别),触发rollover操作。
如上配置设置好后,10点的日志开始重启服务,则从11点触发一次rollover操作,生成2020-09-09-10.log.gz
对该日志进行压缩重命名并归档,并生成新的文件app.log
进行日志写入;然后,每间隔6小时,则下一次是17点触发一次,生成2020-09-09-17.log.gz
对该日志进行压缩重命名并归档,并生成新的文件app.log
进行日志写入。
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%nPattern>
PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
Policies>
RollingFile>
Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
Root>
Loggers>
Configuration>
上述模板中,日志先写入logs/app.log
中,每当文件大小达到100MB或者当时间间隔到达6小时(由%d{yyyy-MM-dd-HH}
决定),触发rollover操作,按照在logs/2020-09/
目录下以app-2020-09-09-1.log.gz
格式对该日志进行压缩重命名并归档,并生成新的文件app.log
进行日志写入。
属性
name
:用于指定Appender的名称;fileName
:用于指定日志文件的全路径;filePattern
:用于指定分割文件的日志全路径(命名规则)。
节点
PatternLayout
:用于指定输出格式,不设置的话,默认为:%m%n
;Policies
:设置日志文件切割参数;SizeBasedTriggeringPolicy
:Policies的子节点,用于设置基于日志文件大小触发的滚动策略,size
属性用来指定每个分割的日志文件大小。TimeBasedTriggeringPolicy
:Policies的子节点,用于设置基于时间间隔触发的滚动策略,interval
属性用于指定滚动时间间隔,默认是1小时,modulate
属性是用于对interval进行偏移调节,默认为false。若为true,则第一次触发时是第一个小时触发,后续以interval间隔触发。CronTriggeringPolicy
:Policies的子节点,用于设置基于Cron表达式触发的滚动策略。DefaultRolloverStrategy
:设置默认策略设置。
节点
Root
:用于指定项目的根日志,level
属性表示日志输出级别,子节点AppenderRef
用于指定输出到某个Appender,子节点的ref
属性也就是前面的RollingFile中指定的name名称,子节点的level
也是日志输出级别。Logger
:用于指定日志的形式,指定不同包的日志级别,level
属性表示日志输出级别,name
属性用来指定该Logger所适用的类或者类的全路径。子节点AppenderRef
用于指定日志输出到哪个Appender,若没有指定,默认集成自Root。参考
log4j2的官网地址