使用RollingRandomAccessFile Appender
<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN" monitorInterval="300"><properties><property name="LOG_HOME">/Users/simon/output/log4j2</property><property name="FILE_NAME">mylog</property></properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /></Console><RollingRandomAccessFile name="MyFile"fileName="${LOG_HOME}/${FILE_NAME}.log"filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log"><PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /><Policies><TimeBasedTriggeringPolicy interval="1" /><SizeBasedTriggeringPolicy size="10 MB" /></Policies><DefaultRolloverStrategy max="10" /></RollingRandomAccessFile></Appenders><Loggers><Logger name="mylog" level="trace" additivity="false"><AppenderRef ref="MyFile" /></Logger><Root level="error"><AppenderRef ref="Console" /></Root></Loggers></Configuration>
定义了两个常量方便后面复用
RollingRandomAccessFile的属性:
fileName 指定当前日志文件的位置和文件名称
filePattern 指定当发生Rolling时,文件的转移和重命名规则
SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
DefaultRolloverStrategy 指定最多保存的文件个数,依次按第i个来Roll
TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。
Web配置
<context-param><param-name>log4jConfiguration</param-name><param-value>/WEB-INF/conf/log4j2.xml</param-value></context-param><listener><listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class></listener>
异步写日志
1.异步Appender, 写ArrayBlockingQueue
<Appenders>....<Async name="Async"><AppenderRef ref="MyFile" /></Async></Appenders>
2.异步Logger
<Loggers><AsyncLogger name="com.foo.Bar" level="trace"><AppenderRef ref="RandomAccessFile"/></AsyncLogger></Loggers>
