本文主要讲解:
1、一个日志配置文件如何拆分
2、不同服务的日志如何划分
3、日志如何滚动
4、日志过期策略
5、异步日志
日志配置文件拆分,例如以下完整的日志配置文件
<?xml version="1.0" encoding="UTF-8"?> <configuration status="DEBUG"> <properties> <!--日志格式--> <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{TRACE_ID} [%thread] %-5level %logger[%L] - %m%n"/> <!--日志编码--> <property name="CHARSET" value="utf-8"/> <!--单个日志文件大小--> <property name="MAX_FILE_SIZE" value="200MB"/> <!--日志保存时间--> <property name="MAX_HISTORY" value="P30D"/> <!--日志根路径--> <property name="BASE_LOG_PATH" value="/data/logs"/> <!--日志应用名,例如拼接完整的日志路径:/data/logs/app/app-info.log--> <property name="SERVER_NAME" value="${sys:SERVICE_NAME}"/> </properties> <appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> </Console> <RollingRandomAccessFile name="FILE-INFO" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log" filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.%d{yyyy-MM-dd}-%i.log.gz"> <LevelRangeFilter minLevel="WARN" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> <Policies> <!--每天滚动一次--> <TimeBasedTriggeringPolicy interval="1"/> <!--或者日志达到10KB 滚动一次--> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <!--日志删除策略--> <DefaultRolloverStrategy fileIndex="nomax"> <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2"> <IfFileName glob="*-info.*.log.gz"/> <IfLastModified age="P1D"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> <RollingRandomAccessFile name="FILE-ERROR" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.log" filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.%d{yyyy-MM-dd}-%i.log.gz"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> <Policies> <!--每天滚动一次--> <TimeBasedTriggeringPolicy interval="1"/> <!--或者日志达到10KB 滚动一次--> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <!--日志删除策略--> <DefaultRolloverStrategy fileIndex="nomax"> <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2"> <IfFileName glob="*-error.*.log.gz"/> <IfLastModified age="P1D"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> </appenders> <loggers> <AsyncRoot level="DEBUG" includeLocation="true" > <AppenderRef ref="CONSOLE"/> </AsyncRoot> <AsyncLogger name="com.luna" level="INFO" includeLocation="true" > <appender-ref ref="FILE-INFO"/> <appender-ref ref="FILE-ERROR"/> </AsyncLogger> <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" > <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE-INFO"/> </AsyncLogger> </loggers> </configuration>
在单个项目中这个配置文件可以直接使用,但是在聚合项目中,我们不可能在每个项目都写一遍完整的日志配置文件。如果这样做,1,容易写错造成日志格式的不统一、2,假如你更改了日志配置,需要更改多个配置文件容易遗漏
所以我们常规做法是将这些公共的配置抽取出来,然后直接引用即可。log4j2的日志拆分和其它日志拆分基本差不多(logback,log4j),官方文档:http://logging.apache.org/log4j/2.x/manual/configuration.html#XInclude
从官方文档看出,log4j2的拆分,依赖XInclude
新建log4j-xinclude-property.xml,抽取Properties
<?xml version="1.0" encoding="UTF-8"?> <properties> <!--日志格式--> <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X{TRACE_ID} [%thread] %-5level %logger[%L] - %m%n"/> <!--日志编码--> <property name="CHARSET" value="utf-8"/> <!--单个日志文件大小--> <property name="MAX_FILE_SIZE" value="200MB"/> <!--日志保存时间--> <property name="MAX_HISTORY" value="P30D"/> <!--日志根路径--> <property name="BASE_LOG_PATH" value="/data/logs"/> <!--日志应用名,例如/data/logs/app/app-info.log--> <property name="SERVER_NAME" value="${sys:SERVICE_NAME}"/> </properties>
新建log4j-xinclude-appenders.xml,抽取appenders
<?xml version="1.0" encoding="UTF-8"?> <appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}"/> </Console> <RollingRandomAccessFile name="FILE-INFO" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log" filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.%d{yyyy-MM-dd}-%i.log.gz"> <LevelRangeFilter minLevel="WARN" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}" /> <Policies> <!--每天滚动一次--> <TimeBasedTriggeringPolicy interval="1"/> <!--或者日志达到10KB 滚动一次--> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <!--日志删除策略--> <DefaultRolloverStrategy fileIndex="nomax"> <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2"> <IfFileName glob="*-info.*.log.gz"/> <IfLastModified age="P1D"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> <RollingRandomAccessFile name="FILE-ERROR" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.log" filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.%d{yyyy-MM-dd}-%i.log.gz"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${PATTERN}" charset="${CHARSET}" /> <Policies> <!--每天滚动一次--> <TimeBasedTriggeringPolicy interval="1"/> <!--或者日志达到10KB 滚动一次--> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <!--日志删除策略--> <DefaultRolloverStrategy fileIndex="nomax"> <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2"> <IfFileName glob="*-error.*.log.gz"/> <IfLastModified age="P1D"/> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> </appenders>
新建log4j-xinclude-loggers.xml,抽取loggers
<?xml version="1.0" encoding="UTF-8"?> <loggers> <AsyncRoot level="DEBUG" includeLocation="true" > <AppenderRef ref="CONSOLE"/> </AsyncRoot> <AsyncLogger name="com.luna" level="INFO" includeLocation="true" > <appender-ref ref="FILE-INFO"/> <appender-ref ref="FILE-ERROR"/> </AsyncLogger> <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" > <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE-INFO"/> </AsyncLogger> </loggers>
最后新建log4j2.xml引用即可
<?xml version="1.0" encoding="UTF-8"?> <configuration xmlns:xi="http://www.w3.org/2001/XInclude" status="DEBUG" name="XIncludeDemo"> <!--常量配置--> <xi:include href="log4j-xinclude-property.xml"/> <!--appenders--> <xi:include href="log4j-xinclude-appenders.xml" /> <!--loggers--> <xi:include href="log4j-xinclude-loggers.xml" /> </configuration>
完整的配置截图
2、
【log4j2】springboot使用log4j2详细配置
原文:https://www.cnblogs.com/gyjx2016/p/13667726.html