提供一個log4j2的配置文件樣例,樣例會把日誌按照級別,分別打印在各自的文件中,並且按照每天進行劃分,每天最多分割10個文件。另外,還有一個單獨的日誌,會記錄特定的日誌。
樣例代碼如下
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
static Logger logger = LogManager.getLogger(Main.class);
static Logger logger2 = LogManager.getLogger("COMBAUSERINFO");
public static void main(String[] args) throws InterruptedException {
int i=0;
while(true){
Thread.sleep(2);
logger.debug("DEBUG Message "+i); //不會打印
logger.info("INFO Message "+i); //打印在 INFO.log
logger.warn("WARN Message "+i); //打印在 WARN.log
logger.error("ERROR Message "+i); //打印在 ERROR.log
if((i++)%100==0) {
System.out.println("i="+i);
// 以下日誌全部打印在 USERINFOFILE.log,同時每個等級會打印在對應的INFO.log 或 WARN.log 或 ERROR.log,並在控制檯中打印
logger2.debug("User debug Message "+i);
logger2.info("User Info Message "+i);
logger2.warn("User warn Message "+i);
logger2.error("User error Message "+i);
}
}
}
}
樣例的日誌效果
INFO.log的內容
WARN.log的內容
USERINFOFILE.log的內容
最後,附上log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="logdir">logs</Property>
<!-- <Property name="logdir">${sys:catalina.base}/logs</Property> -->
</Properties>
<Appenders>
<!-- fileName中不知道怎麼帶上日期 -->
<RollingFile name="INFO"
fileName="${logdir}/INFO.log"
filePattern="${logdir}/INFO_%d{yyyy-MM-dd}_%i.log">
<Filters>
<!--
定義兩個過濾器,第一個過濾器過濾掉warn以上級別的日誌,然後warn級別以下的日誌,繼續使用第二個過濾器
第二個過濾器接收info以上級別的日誌,兩個過濾器組合起來就只剩下info日誌了
onMismatch="NEUTRAL" 表示沒匹配到的日誌級別,將繼續使用下一個過濾器
-->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
<!--
定義每個文件最大30M,在每天0點生成新一天的文件
interval=1,表示週期是1,因爲filterPattern中的日期格式最後一位是天,所以這裏表示週期是1天
modulate="true" 表示整點觸發,也就是每天的0點
如果是yyyy-MM-dd-HH-mm ,則表示是在一分鐘的0秒觸發
-->
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="30MB" />
</Policies>
<!-- 定義每天最多10個分割文件,最多保留30天-->
<DefaultRolloverStrategy max="10">
<Delete basePath="${logdir}" maxDepth="1">
<IfFileName glob="INFO_*.log" />
<IfLastModified age="30d" />
<!--
<IfLastModified age="24H" /> 保留24小時,這個單位需要和filePattern中的日期保持同一粒度
<IfLastModified age="60m" /> 保留 60分鐘
-->
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="WARN"
fileName="${logdir}/WARN.log"
filePattern="${logdir}/WARN_%d{yyyy-MM-dd}_%i.log">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="30MB" />
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="{logdir}/" maxDepth="1">
<IfFileName glob="WARN_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="ERROR"
fileName="${logdir}/ERROR.log"
filePattern="${logdir}/ERROR_%d{yyyy-MM-dd}_%i.log">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-3p %5c %3x %C %L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="30M" />
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="{logdir}/" maxDepth="1">
<IfFileName glob="ERROR_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="USERINFOFILE"
fileName="${logdir}/USERINFOFILE.log"
filePattern="${logdir}/USERINFOFILE_%d{yyyy-MM-dd}.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} \t %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
<SizeBasedTriggeringPolicy size="128KB" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="{logdir}/" maxDepth="1">
<IfFileName glob="USERINFOFILE_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<Console name="USERINFO" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} \t %m%n"/>
</Console>
</Appenders>
<loggers >
<logger name="COMBAUSERINFO" level="INFO">
<appender-ref ref="USERINFO" />
<appender-ref ref="USERINFOFILE" />
</logger>
<root level="INFO">
<appender-ref ref="INFO" />
<appender-ref ref="WARN" />
<appender-ref ref="ERROR" />
</root>
</loggers>
</Configuration>
上面的INFO日誌節點,我把每個文件大小設置成30M了
劃分週期也改成天了,如果想要改回分鐘,就將
filePattern="${logdir}/INFO_%d{yyyy-MM-dd}_%i.log" 改成filePattern="${logdir}/INFO_%d{yyyy-MM-dd-HH-mm}_%i.log" 將<IfLastModified age="30d" /> 改成<IfLastModified age="7m" />
最後,提一下log4j2的3個坑,暫時還沒找到解決辦法
1.首個日誌文件無法帶上日誌,只能是INFO.log,而不能是INFO_yyyy-MM-dd.log
2.日誌文件的名稱中不能同時使用中括號和序號,比如[yyyy-MM-dd]-%i-INFO.log,會報錯
3.日誌文件分割的序號無法倒序,也就是INFO_1.log記錄的日誌,比INFO_2.log的日誌早
如果你們知道怎麼解決這三個問題,可以回覆一下我