如果你做過(guò)類(lèi)似的資料搜索工作, 你會(huì)容易找到相關(guān)的配置方法. 然而, 但是, 大部分都是你抄我, 我抄你的, 并沒(méi)有仔細(xì)檢測(cè), 就寫(xiě)的教程.
其中重要的就是刪除過(guò)期日志文件的配置. 很多都說(shuō)通過(guò)max=數(shù)字
控制.
這是扯淡, 這個(gè)只是控制某時(shí)間段內(nèi)(根據(jù)配置不同)文件的數(shù)目.
它并不會(huì)關(guān)心你的目錄下一共有多少個(gè)日志文件了. 可想而知, 這樣隨著時(shí)間的推移, 雖然每個(gè)時(shí)間區(qū)間內(nèi)日志數(shù)目控制在范圍內(nèi), 但是, 總?cè)罩疚募€(gè)數(shù), 依然日益膨脹.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300"> <!-- debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/"-->
<properties>
<property name="LOG_HOME">logs/kg</property>
<property name="FILE_NAME">kg</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36}:%M(%L)] - %msg%xEx%n"/>
</Console>
<RollingRandomAccessFile name="MyFile"
fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.log">
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36}:%M(%L)] - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/> <!--每1小時(shí)/分/... 生成一個(gè)文件, 時(shí)間依據(jù)filePattern的配置-->
<SizeBasedTriggeringPolicy size="5 MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="${LOG_HOME}/$${date:yyyy-MM}/" maxDepth="2">
<IfFileName glob="*.log" />
<!--!Note: 這里的age必須和filePattern協(xié)調(diào), 后者是精確到HH, 這里就要寫(xiě)成xH, xd就不起作用
另外, 數(shù)字最好>2, 否則可能造成刪除的時(shí)候, 最近的文件還處于被占用狀態(tài),導(dǎo)致刪除不成功!-->
<!--7天-->
<IfLastModified age="168H" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--過(guò)濾掉spring和mybatis的一些無(wú)用的DEBUG信息-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<Logger name="mylog" level="debug" additivity="false">
<AppenderRef ref="MyFile"/>
<AppenderRef ref="Console"/>
</Logger>
<Root level="debug">
<AppenderRef ref="MyFile"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
注意:
-
filePattern
定義的日志文件后綴精確的時(shí)間決定了定期生成日志文件. 精確到dd
, 即%d{yyyy-MM-dd}
, 則會(huì)每天生成一個(gè)文件, 精確到HH
, 則會(huì)每時(shí)生成一個(gè)文件, ... -
Delete
標(biāo)簽內(nèi)決定了刪除過(guò)期文件的規(guī)則. 需要注意這里的IfLastModified .age
要和filePattern
精確的時(shí)間一致, 否則貌似無(wú)效.
我這里日志文件會(huì)按日期放入子文件夾內(nèi), 所以要想統(tǒng)計(jì)總數(shù), 需要遞歸統(tǒng)計(jì), 故設(shè)置maxDepth=2
.
依賴(lài)jar包
我這里的依賴(lài)可以實(shí)現(xiàn), 將sfl4j
類(lèi)的日志委托給log4j2實(shí)現(xiàn). 所以項(xiàng)目中可以同時(shí)使用sfl4j
和log4j
類(lèi)的日志系統(tǒng).
<properties>
<log4j2.version>2.8</log4j2.version>
</properties>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
<!--log4j2-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--用于與sfl4j保持橋接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--//log4j2-->