在项目中,一般都是把日志记录到一个日志文件中。
对应的log4j2.xml内容如下图所示:只有一个RollingFile节点,整个系统只会生成一个log日志文件。
生成的日志文件如下图:
当系统不断扩大,业务越来越复杂,所有接口或者方法的日志内容都放在一个文件中,内容比较乱,不方便查看。
这时候就考虑把日志拆分成多个文件,不同的业务内容放到不同的日志文件中。
修改后的log4j2.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL -->
<!-- configure.monitorInterval 监控间隔 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->
<configuration status="DEBUG" monitorInterval="600"><properties><property name="LOG_HOME">D:/webbase/logs</property><!-- D:/webbase/logs --><property name="LOG_BACK_HOME">${LOG_HOME}/backup</property></properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayoutpattern="%d{HH:mm:ss.SSS} {%t} %-5level %logger{36} - %msg%n" /></Console><!-- 配置日志输出文件名字 追加读写 --><!-- 系统日志,不包括其他RollingFile节点对应的单独日志内容 --><RollingFile name="AllLog"fileName="${LOG_HOME}/Web/Log-${date:yyyy-MM-dd}-newest.log"filePattern="${LOG_HOME}/Web/backup/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}-%i-newest.log"append="true"><!-- 输出格式 --><PatternLayoutpattern="%r %d [%t] %-5p %c - %m%n%n" /><!-- 设置策略 --><Policies><SizeBasedTriggeringPolicy size="20MB" /><TimeBasedTriggeringPolicy interval="1"modulate="true" /></Policies><Filters><ThresholdFilter level="ALL" onMatch="ACCEPT"onMismatch="DENY" /></Filters><DefaultRolloverStrategy max="100" /></RollingFile><!-- 单独记录发票接口日志 --><RollingFile name="InvoiceRollingFile"fileName="${LOG_HOME}/Invoice/Log-${date:yyyy-MM-dd}-invoice.log"filePattern="${LOG_HOME}/Invoice/backup/invoice/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}-%i-invoice.log"append="true"><!-- 输出格式 --><PatternLayoutpattern="%r %d [%t] %-5p %c - %m%n%n" /><!-- 设置策略 --><Policies><SizeBasedTriggeringPolicy size="20MB" /><TimeBasedTriggeringPolicy interval="1"modulate="true" /></Policies><Filters><ThresholdFilter level="ALL" onMatch="ACCEPT"onMismatch="DENY" /></Filters><DefaultRolloverStrategy max="100" /></RollingFile></Appenders><Loggers><!-- 生产环境此处的level设置成info,不记录debug的日志 --><Root level="debug"><AppenderRef ref="AllLog" /><AppenderRef ref="Console" /></Root><!--将logger中的 additivity 属性配置为 false,则这个logger不会将日志流反馈到root中。--><!--记录 发票接口 相关的日志--><Logger name="InvoiceLogger" additivity="false" level="debug"><appender-ref ref="InvoiceRollingFile" level="debug" /></Logger></Loggers></configuration>
文件内容解读:
以上配置表达的是,系统整体日志使用一个文件记录,发票接口使用一个文件记录。同时发票接口日志的信息不会记录到整体的日志里面,这是由Logger节点的additivity属性决定的(additivity 属性配置为 false,则这个logger不会将日志流反馈到root中)。
如果有其他接口或者类,仿照InvoiceRollingFile,单独添加对应的RollingFile节点和Logger节点。这两个节点是一 一对应的,只要新加了RollingFile,就需要在下面配上Logger,同时Logger节点的 appender-ref属性中ref的值需要与RollingFile节点的name属性值保持一致。
记录log信息的代码示例:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;private static final Logger logger = LogManager.getLogger("InvoiceLogger");logger.info("我是info级别的日志信息");
InvoiceLogger对应的是log4j2.xml配置文件中,Logger节点name属性值。
按照以上方式配置后,生成的日志文件就会是下面这个样子的
如果要找发票接口相关的日志,就在Invoice文件夹中找对应日期的文件。查找其他日志内容,在Web文件夹中查找(Invoice、Web,是在log4j2.xml配置文件中fileName节点进行配置的)。