在项目中,一般都是把日志记录到一个日志文件中。
对应的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">
<PatternLayout
pattern="%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">
<!-- 输出格式 -->
<PatternLayout
pattern="%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">
<!-- 输出格式 -->
<PatternLayout
pattern="%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节点进行配置的)。