log4j2.xml输出多文件配置的案例
方式一:多文件输出案例(配合java获取)
<?xml version="1.0" encoding="UTF-8"?> <configuration> <Properties> <!-- 请修改日志存储路径 --> <Property name="logDir">/app/logs/api</Property> <!--<Property name="logDir">D:\/application/logs</Property> --> <property name="openapiLogFile">openapi</property> <property name="abilityRequestLogFile">abilityRequestLog</property> <property name="abilityResponseLogFile">abilityResponseLog</property> <property name="esbRequestLogFile">esbRequestLog</property> <property name="esbResponseLogFile">esbResponseLog</property> <property name="errLogFile">errLog</property> <property name="apiGuarantLogFile">apiGuarantLog</property> <Property name="pattern-format">%-5.5p:%d [ %c:%L ] - %m%n</Property> <Property name="level">debug</Property> <Property name="charset">utf-8</Property> </Properties> <!-- 通过Appenders定义Spring框架和业务模块的日志输出到不同的文件。 在Loggers中指定不同包的日志输出到不同文件,Root指定日志输出到标准输出。 --> <appenders> <!-- 定义控制台输出 --> <Console name="Console" target="SYSTEM_OUT" follow="true"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> </Console> <RollingRandomAccessFile name="openapiLogFile" fileName="${logDir}/${openapiLogFile}.log" append="true" filePattern="${logDir}/${openapiLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> <RollingRandomAccessFile name="abilityRequesFile" fileName="${logDir}/${abilityRequestLogFile}.log" append="true" filePattern="${logDir}/${abilityRequestLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> <RollingRandomAccessFile name="abilityResponseFile" fileName="${logDir}/${abilityResponseLogFile}.log" append="true" filePattern="${logDir}/${abilityResponseLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> <RollingRandomAccessFile name="esbRequestFile" fileName="${logDir}/${esbRequestLogFile}.log" append="true" filePattern="${logDir}/${esbRequestLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> <RollingRandomAccessFile name="esbResponseFile" fileName="${logDir}/${esbResponseLogFile}.log" append="true" filePattern="${logDir}/${esbResponseLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> <RollingRandomAccessFile name="errFile" fileName="${logDir}/${errLogFile}.log" append="true" filePattern="${logDir}/${errLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> <RollingRandomAccessFile name="apiGuarantFile" fileName="${logDir}/${apiGuarantLogFile}.log" append="true" filePattern="${logDir}/${apiGuarantLogFile}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 表示隔1天进行压缩 --> <TimeBasedTriggeringPolicy modulate="true" interval="1" /> <!-- 表示单个文件最大多少容量进行压缩 --> <SizeBasedTriggeringPolicy size="204800 KB" /> </Policies> <!-- 表示压缩包,最多保留30个 --> <DefaultRolloverStrategy max="100" /> <Filters> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> </RollingRandomAccessFile> </appenders> <loggers> <AsyncRoot level="${level}"> <Appender-ref ref="Console" /> <Appender-ref ref="openapiLogFile" /> </AsyncRoot> <!-- 异步:调用openApiLog日志 --> <AsyncLogger name="openApiLog" level="ALL" additivity="TRUE"> <AppenderRef ref="openapiLogFile" /> </AsyncLogger> <!-- 异步:调用openApiLog日志 --> <AsyncLogger name="abilityRequestLog" level="ALL" additivity="TRUE"> <AppenderRef ref="abilityRequesFile" /> </AsyncLogger> <!-- 异步:调用openApiLog日志 --> <AsyncLogger name="abilityResponseLog" level="ALL" additivity="TRUE"> <AppenderRef ref="abilityResponseFile" /> </AsyncLogger> <!-- 异步:调用openApiLog日志 --> <AsyncLogger name="esbRequestLog" level="ALL" additivity="TRUE"> <AppenderRef ref="esbRequestFile" /> </AsyncLogger> <!-- 异步:调用openApiLog日志 --> <AsyncLogger name="esbResponseLog" level="ALL" additivity="TRUE"> <AppenderRef ref="esbResponseFile" /> </AsyncLogger> <!-- 异步:调用openApiLog日志 --> <AsyncLogger name="errLog" level="ALL" additivity="TRUE"> <AppenderRef ref="errFile" /> </AsyncLogger> <!-- 异步:调用apiGuarantLog日志 --> <AsyncLogger name="apiGuarantLog" level="ALL" additivity="TRUE"> <AppenderRef ref="apiGuarantFile" /> </AsyncLogger> <logger name="com.sitech.miso.dao" level="${level}" additivity="TRUE"> <appender-ref ref="Console" /> </logger> <logger name="org.springframework" level="error" /> <logger name="httpclient" level="error" /> <logger name="org.apache" level="error" /> <logger name="com.netflix" level="error" /> <logger name="com.mchange" level="error" /> <!-- Root指定日志输出到标准控制台输出。 --> <!-- 注意Logger配置的additivity=“true”,表示日志信息除了在当前logger输出外还会在Root的Logger输出。这样就实现了同时在文件和控制台输出的目的 --> <Root level="${level}"> <appender-ref ref="Console" /> </Root> </loggers> </configuration>
import org.apache.logging.log4j.Logger;private static Logger abilityRequestLog = LogManager.getLogger("abilityRequestLog"); private static Logger abilityResponseLog = LogManager.getLogger("abilityResponseLog"); private static Logger esbRequestLog = LogManager.getLogger("esbRequestLog"); private static Logger esbResponseLog = LogManager.getLogger("esbResponseLog"); private static Logger errLog = LogManager.getLogger("errLog"); private static Logger apiGuarantLog = LogManager.getLogger("apiGuarantLog");
通过Logger 获取指定名称的日志并将其输出到对应的文件中
方式二:按月打包日志输出
<?xml version="1.0" encoding="UTF-8"?> <!--status用于设置log4j2自身内部的信息输出;monitorInterval:定时重新加载配置--> <Configuration status="WARN" monitorInterval="1800"> <Properties> <Property name="log-path">${log.path}</Property> <!-- 注意:使用%l参数性能会下降1.3 - 5 times(官方数据),并发量不大的情况可以使用 --> <Property name="pattern-format">%d{yyyy-MM-dd HH:mm:ss.SSS}-[%p][%t] %l %m%n</Property> <Property name="charset">UTF-8</Property> <Property name="level">debug</Property> <Property name="ConsoleLevel">debug</Property> <!-- 是否输出行号 --> <Property name="includeLocation">true</Property> </Properties> <Appenders> <!--输出控制台的配置--> <Console name="Console" target="SYSTEM_OUT"> <!--控制台输出level及以上级别的信息(onMatch),其他的xxx --> <ThresholdFilter level="${ConsoleLevel}" onMatch="ACCEPT" onMismatch="DENY" /> <!--输出日志的格式--> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> </Console> <!-- 默认输出日志文件,归档存储的目录是基于当前年和月 --> <RollingFile name="bpmLogger" fileName="${log-path}/bpm-rest.log" filePattern="${log-path}/$${date:yyyy-MM}/bpm-rest-%d{yyyy-MM-dd}-%i.log.gz"> <!-- 这里设置ThresholdFilter的目的是输出SQL,需要指定onMismatch是ACCEPT,否则如果SQL对应的logger级别低于该级别时不输出SQL --> <ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="ACCEPT" /> <PatternLayout charset="${charset}" pattern="${pattern-format}" /> <Policies> <!-- 按大小分文件 --> <SizeBasedTriggeringPolicy size="200 MB"/> <!-- 以filePattern后的日期格式精确到哪一位,interval也精确到哪一位,这里指按天文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <!-- 在rollover时间内匹配删除基本目录下所有满足参数glob等于*/app-*.log.gz和超过半年或更早的文件 --> <DefaultRolloverStrategy> <Delete basePath="${log-path}" maxDepth="2"> <IfFileName glob="*/bpm-rest-*.log.gz" /> <IfLastModified age="180d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- 异常告警日志文件,归档存储的目录是基于当前年和月 --> <RollingFile name="errorLog" fileName="${log-path}/error/bpm-rest-error.log" filePattern="${log-path}/error/$${date:yyyy-MM}/bpm-rest-error-%d{yyyy-MM-dd}-%i.log.gz"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout charset="${charset}" pattern="%m%n" /> <Policies> <!-- 按大小分文件 --> <SizeBasedTriggeringPolicy size="200 MB"/> <!-- 以filePattern后的日期格式精确到哪一位,interval也精确到哪一位,这里指按天文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <!-- 在rollover时间内匹配删除基本目录下所有满足参数glob等于*/app-*.log.gz和超过半年或更早的文件 --> <DefaultRolloverStrategy> <Delete basePath="${log-path}/error" maxDepth="2"> <IfFileName glob="*/bpm-rest-error-*.log.gz" /> <IfLastModified age="180d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <AsyncRoot includeLocation="${includeLocation}" level="${level}"> <AppenderRef ref="Console" /> <AppenderRef ref="bpmLogger" /> </AsyncRoot> <!-- warn级别及以上 输出至异常告警日志 --> <AsyncLogger name="errorLog" level="warn"> <AppenderRef ref="errorLog" /> </AsyncLogger> </Loggers> </Configuration>