log4j2.xml文件詳解及在日志中加入全局guid
log4j2.xml文件及在日志中加入全局guid
<Configuration status="WARN" monitorInterval="30">
<Appenders>
<!-- 輸出到控制臺(tái) -->
<Console name="STDOUT" target="SYSTEM_OUT">
<!--
%d 日期
%p 日志級(jí)別
%c 輸出所屬的類目,通常就是所在類的全名
[%t] 線程
- %m 輸出代碼中指定的消息
%n 換行
%L : 日志輸出所在行數(shù)
%M : 日志輸出所在方法名
-->
<PatternLayout pattern="%d %p %c [%t] - %m%n"/>
</Console>
<!-- 這個(gè)會(huì)打印出所有的info及以下級(jí)別的信息,每次大小超過(guò)size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份-日建立的文件夾下面并進(jìn)行壓縮,作為存檔 -->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/provider/${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log.gz">
<!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
<!-- 切割文件的話最多切割多少個(gè) -->
<DefaultRolloverStrategy max="20"/>
</Policies>
</RollingFile>
<!-- 按照天來(lái)存儲(chǔ),過(guò)了這天的東西會(huì)被保存為壓縮包,并且配置了大小分割 -->
<RollingFile name="InfoFileAppender" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/provider/${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d %-5p %c:%L [%t] - %m%n"/>
<Policies>
<!-- 時(shí)間滾動(dòng)策略,默認(rèn)1小時(shí) -->
<TimeBasedTriggeringPolicy modulate="true" interval="24"/>
</Policies>
</RollingFile>
</Appenders>
<!--然后定義logger,只有定義了logger并引入的appender,appender才會(huì)生效-->
<Loggers>
<Logger name="com.opensymphony.xwork2.ognl.OgnlValueStack" level="ERROR"/>
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<Logger name="net.sf.ehcache" level="INFO"/>
<Logger name="com.alisoft.xplatform.asf" level="WARN"/>
<Logger name="com.mbi" level="ERROR"/>
<Logger name="net.mlw" level="INFO"/>
<Logger name="java.sql" level="INFO"/>
<Logger name="org.hibernate.type" level="ERROR"/>
<Logger name="com.opensymphony.webwork" level="ERROR"/>
<Logger name="org.apache" level="INFO"/>
<Logger name="org.jgroups" level="WARN"/>
<Logger name="org.jboss.axis" level="INFO"/>
<Logger name="org.jboss.management" level="INFO"/>
<Logger name="org.apache.commons.httpclient" level="ERROR"/>
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.springboot" level="INFO" />
<!-- 缺省日志級(jí)別,如果package有定制級(jí)別,則按package的定制級(jí)別走,即使package級(jí)別更低 -->
<Root level="INFO">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingFileInfo"/>
<!-- <AppenderRef ref="InfoFileAppender"/> -->
</Root>
</Loggers>
</Configuration>
<AppenderRef ref="STDOUT"/>
只有定義了這個(gè),上面的才會(huì)真實(shí)有效
- 日志信息輸出到文件中,超過(guò)指定大小壓縮存檔
- 日志信息輸出到文件中,按照日期來(lái)壓縮存檔
想在日志中加入全局guid需要修改日志的格式
加入自定義參數(shù)H
<PatternLayout pattern="%d %-5p %c:%L [%t] -%H %n"/>
/**
* 有時(shí)候需要在日志中實(shí)現(xiàn)類似aop的效果,統(tǒng)一加進(jìn)去某些參數(shù)。對(duì)于這種需要,log4j2則可以使用插件機(jī)制
* Plugin 表示的是這是一個(gè)插件,name是名稱,category為PatternConverter.CATEGORY(目前插件只有這個(gè)選擇)
ConverterKeys表示的就是自定義的參數(shù),可以多個(gè)
* @author yp-tc-m-7129
*
*/
@Plugin(name = "LogPatternConverter", category = PatternConverter.CATEGORY)
@ConverterKeys({ "H" })
public class LogPatternConverter extends LogEventPatternConverter {
/**
* 檢查全局guid是否正確 - GUID[45a696c385f341efbebf05fd0b3b1344] - TYPE[MANUAL]
* @param args
*/
/*public static void main(String[] args) {
System.out.println(getPayplusLogUUID());
}*/
private static final LogPatternConverter INSTANCE = new LogPatternConverter();
public static LogPatternConverter newInstance(final String[] options) {
return INSTANCE;
}
private LogPatternConverter(){
super("LogId", "logId");
}
/**
* 另外的格式化日志,在日志中加入一個(gè)全局guid
* 這里有兩個(gè)參數(shù),LogEvent是系統(tǒng)已經(jīng)存在的一些可選數(shù)據(jù),StringBuilder 表示的是最終的輸出字符流。一般都是將自定義的append進(jìn)去
*/
@Override
public void format(LogEvent event, StringBuilder builder) {
final Message msg = event.getMessage();
if (msg != null) {
String result = msg.getFormattedMessage();
result = getPayplusLogUUID() + result;
builder.append(result);
}
}
/**
* 業(yè)務(wù)日志全局UUID
*
* @return
*/
protected String getPayplusLogUUID() {
StringBuilder builder = new StringBuilder();
if (!ThreadContextUtils.contextInitialized()) {
ThreadContextUtils.initContext("applicationName", null, ThreadContextType.MANUAL);
}
builder.append("- GUID[");
builder.append(ThreadContextUtils.getContext().getThreadUID());
builder.append("] - TYPE[");
builder.append(ThreadContextUtils.getContext().getType());
builder.append("] ");
return builder.toString();
}
}
這樣就在日志中加入了全局guid用于查詢?nèi)罩咎幚韱?wèn)題了。
log4j2.x配置文件中各標(biāo)簽
log4j2.0以后我們通常在log4j2.xml中配置相關(guān)參數(shù),在配置的時(shí)候我們需要理解這些參數(shù)的具體含義,下面列出了這些參數(shù)的解釋。
1、Logger 完成日志信息的處理
<logger name="com.srd.ljzd" level="INFO" additivity="true">
<appender-ref ref="INFO" />
<appender-ref ref="WARN" />
<appender-ref ref="ERROR" />
<appender-ref ref="Mail" />
</logger>
logger中的name是指代碼的包名或類名,路徑要寫(xiě)全,可以配置不同包中的日志輸出到不同的文件中。level是日志輸出級(jí)別,定義輸出的層次和決定信息是否輸出,
DEBUG<INFO<WARN<ERROR
additivity設(shè)置事件是否在root logger輸出,為了避免重復(fù)輸出,可以在Logger 標(biāo)簽下設(shè)置additivity為”false”。
2、Appender 設(shè)置在哪輸出日志信息
FileAppender:普通地輸出到本地文件FlumeAppender:將幾個(gè)不同源的日志匯集、集中到一處。JMSQueueAppenderVS.JMSTopicAppender:與JMS相關(guān)的日志輸出RewriteAppender:對(duì)日志事件進(jìn)行掩碼或注入信息RollingFileAppender:對(duì)日志文件進(jìn)行封存(詳細(xì))RoutingAppender:在輸出地之間進(jìn)行篩選路由SMTPAppender:將LogEvent發(fā)送到指定郵件列表SocketAppender:將LogEvent以普通格式發(fā)送到遠(yuǎn)程主機(jī)SyslogAppender:將LogEvent以RFC 5424格式發(fā)送到遠(yuǎn)程主機(jī)AsynchAppender:將一個(gè)LogEvent異步地寫(xiě)入多個(gè)不同輸出地ConsoleAppender:將LogEvent輸出到命令行FailoverAppender:維護(hù)一個(gè)隊(duì)列,系統(tǒng)將嘗試向隊(duì)列中的Appender依次輸出LogEvent,直到有一個(gè)成功為止
其中ConsoleAppender、RollingFileAppender和SMTPAppender較為常用。如果想詳細(xì)了解,可以參考log4j的官方文檔
ConsoleAppender將輸出寫(xiě)到System.err或System.out。如果想將輸出寫(xiě)到System.out,設(shè)置Console標(biāo)簽下的target為”SYSTEM_OUT”即可;如果想將輸出寫(xiě)到System.err,設(shè)置Console標(biāo)簽下的target為”SYSTEM_ERR “即可。RollingFileAppender跟FileAppender的基本用法一樣。但RollingFileAppender可以設(shè)置log文件的size(單位:KB/MB/GB)上限、數(shù)量上限,當(dāng)log文件超過(guò)設(shè)置的size上限,會(huì)自動(dòng)被壓縮。RollingFileAppender可以理解為滾動(dòng)輸出日志,如果log4j 2記錄的日志達(dá)到上限,舊的日志將被刪除,騰出的空間用于記錄新的日志,DefaultRolloverStrategy 標(biāo)簽的max設(shè)置壓縮文件的上限(默認(rèn)值為7)。SMTPAppender主要用來(lái)給指定的E-mail發(fā)送log event。
<SMTP name="Mail" subject="****SaaS系統(tǒng)正式版異常信息" to="yong.shi@lengjing.info" from="message@lengjing.info" smtpUsername="message@lengjing.info" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false" smtpPort="25" bufferSize="10">
<PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
</SMTP>
SMTPAppender默認(rèn)情況下只發(fā)送ERROR級(jí)別以上的日志,在測(cè)試的時(shí)候會(huì)發(fā)現(xiàn)低級(jí)別的日志是不會(huì)通過(guò)郵箱發(fā)送的。
3、Layout 設(shè)置日志信息的輸出格式
layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)org.apache.log4j.SimpleLayout(包含日志訊息的級(jí)別和訊息字符串)org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、執(zhí)行緒、類別等訊息)org.apache.log4j.PatterLayout(可以靈活地指定布局格式)
詳細(xì)配置可以參考官方文檔。
4、Filters
Filter可以過(guò)濾log事件,并控制log輸出,詳細(xì)配置可以參考官方文檔。
例如ThresholdFilter 可以實(shí)現(xiàn)單個(gè)log級(jí)別的過(guò)濾功能。
5、Status
<Configuration status="OFF" monitorInterval="30">
log4j 2定義的status級(jí)別有8個(gè):ALL,TRACE, DEBUG, INFO, WARN, ERROR ,FATAL,OFF。其實(shí)status屬性是幫助開(kāi)發(fā)者找錯(cuò)用的,它可以檢測(cè)log4j 2的配置文件是否有錯(cuò),也可以檢測(cè)到死循環(huán)的logger。
6、monitorInterval
<Configuration status="OFF" monitorInterval="30">
通過(guò)設(shè)置monitorInterval屬性,即可設(shè)置log4j 2自動(dòng)檢測(cè)配置文件的時(shí)間間隔(單位:秒),最小間隔為5秒。log4j 2檢測(cè)到配置文件有變化,會(huì)重新配置自己。
7、Policies 配置日志相關(guān)策略
SizeBasedTriggeringPolicy:設(shè)置日志大小達(dá)到一定大小后打包生成壓縮文件。TimeBasedTriggeringPolicy:基于時(shí)間的觸發(fā)策略。該策略主要是完成周期性的log文件封存工作。有兩個(gè)參數(shù):interval,integer型,指定兩次封存動(dòng)作之間的時(shí)間間隔。單位:以日志的命名精度來(lái)確定單位,比如yyyy-MM-dd-HH 單位為小時(shí),yyyy-MM-dd-HH-mm 單位為分鐘。modulate,boolean型,說(shuō)明是否對(duì)封存時(shí)間進(jìn)行調(diào)制。若modulate=true,則封存時(shí)間將以0點(diǎn)為邊界進(jìn)行偏移計(jì)算。比如,modulate=true,interval=4hours,那么假設(shè)上次封存日志的時(shí)間為03:00,則下次封存日志的時(shí)間為04:00,之后的封存時(shí)間依次為08:00,12:00,16:00。
這里將我在項(xiàng)目中常用配置貢獻(xiàn)給大家,可以滿足大部分需求。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="30">
<properties>
<!--設(shè)置日志在硬盤(pán)上輸出的目錄-->
<property name="logPath">D:/ljzx_log</property>
</properties>
<Appenders>
<!--設(shè)置在控制臺(tái)打印日志-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
</Console>
<!--設(shè)置級(jí)別為INFO日志輸出到info.log中-->
<RollingFile name="INFO" filename="${logPath}/info.log"
filepattern="${logPath}/%d{YYYYMMdd}-%i-info.log.zip">
<Filters>
<!--設(shè)置只輸出級(jí)別為INFO的日志-->
<ThresholdFilter level="INFO"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
<Policies>
<!--設(shè)置每天打包日志一次-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--設(shè)置日志文件滿1MB后打包-->
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<!--設(shè)置級(jí)別為WARN日志輸出到warn.log中-->
<RollingFile name="WARN" filename="${logPath}/warn.log"
filepattern="${logPath}/%d{YYYYMMdd}-%i-warn.log.zip">
<Filters>
<!--設(shè)置只輸出級(jí)別為WARN的日志-->
<ThresholdFilter level="WARN"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
<Policies>
<!--設(shè)置每天打包日志一次-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--設(shè)置日志文件滿1MB后打包-->
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<!--設(shè)置級(jí)別為ERROR日志輸出到error.log中-->
<RollingFile name="ERROR" filename="${logPath}/error.log"
filepattern="${logPath}/%d{YYYYMMdd}-%i-error.log.zip">
<!--設(shè)置只輸出級(jí)別為ERROR的日志-->
<ThresholdFilter level="ERROR"/>
<PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
<Policies>
<!--設(shè)置每天打包日志一次-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--設(shè)置日志文件滿1MB后打包-->
<SizeBasedTriggeringPolicy size="1 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<!--設(shè)置通過(guò)郵件發(fā)送日志信息-->
<SMTP name="Mail" subject="XXXXSaaS系統(tǒng)正式版異常信息" to="yong.shi@lengjing.info" from="message@lengjing.info"
smtpUsername="message@lengjing.info" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false"
smtpPort="25" bufferSize="10">
<PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
</SMTP>
</Appenders>
<Loggers>
<logger name="com.srd.ljzd" level="INFO" additivity="true">
<appender-ref ref="INFO" />
<appender-ref ref="WARN" />
<appender-ref ref="ERROR" />
<appender-ref ref="Mail" />
</logger>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</Loggers>
</Configuration>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入淺出講解Spring框架中依賴注入與控制反轉(zhuǎn)及應(yīng)用
依賴注入(Dependency?Injection)和控制反轉(zhuǎn)(Inversion?of?Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在?傳統(tǒng)的程序設(shè)計(jì)過(guò)程中,通常由調(diào)用者來(lái)創(chuàng)建被調(diào)用者的實(shí)例2022-03-03
九個(gè)動(dòng)畫(huà)組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表
數(shù)據(jù)結(jié)構(gòu)和算法是密不可分的,兩者往往是相輔相成的存在,所以在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)過(guò)程中,不免會(huì)遇到各種算法,數(shù)據(jù)結(jié)構(gòu)常用操作一般為:增刪改查?;旧纤械臄?shù)據(jù)結(jié)構(gòu)都是圍繞這幾個(gè)操作進(jìn)行展開(kāi),本文用九張動(dòng)圖來(lái)闡述先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)2021-08-08
淺談在頁(yè)面中獲取到ModelAndView綁定的值方法
下面小編就為大家分享一篇淺談在頁(yè)面中獲取到ModelAndView綁定的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Mybatis實(shí)體類對(duì)象入?yún)⒉樵兊墓P記
這篇文章主要介紹了Mybatis實(shí)體類對(duì)象入?yún)⒉樵兊墓P記,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
java使用hadoop實(shí)現(xiàn)關(guān)聯(lián)商品統(tǒng)計(jì)
本篇文章java使用hadoop實(shí)現(xiàn)關(guān)聯(lián)商品統(tǒng)計(jì),可以實(shí)現(xiàn)商品的關(guān)聯(lián)統(tǒng)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10
基于RecyclerChart的KLine繪制Volume實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了基于RecyclerChart的KLine繪制Volume實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
詳解Spring Boot實(shí)戰(zhàn)之單元測(cè)試
本篇文章主要介紹了詳解Spring Boot實(shí)戰(zhàn)之單元測(cè)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07

