亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

log4j2 項目日志組件的實例代碼

2024-07-13 10:15:04
字體:
來源:轉載
供稿:網友

在項目運行過程中,常常需要進行功能調試以及用戶行為的跟蹤和記錄,部分人習慣使用System.out,但這并不建議,它僅僅是使用方便但不便于維護也無擴展性。相比log4j的話,log4j可以控制日志信息的輸送目的地、輸出格式以及級別等等,使我們能夠更加細致地控制日志的生成過程。

Log4j2是對Log4j1的升級,在性能和功能上有顯著的改進,包括多線程中吞吐量的增強、占位符的支持、配置文件自動重新加載等

一、入門介紹

1、下載jar包

pox.xml

<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> </dependency></dependencies>

2、配置文件

Log4j包含四個配置工廠實現:JSON、YAML、properties、XML,本文介紹常用的方式XML。

Log4j具有在初始化期間自動配置自身的能力。當Log4j啟動時,它將定位類路徑下所有符合名稱的文件,優先級順序:log4j2-test.properties > log4j2-test.xml > log4j2.properties > log4j2.xml

3、一個簡單的實例

xml配置:

<?xml version="1.0" encoding="UTF-8"?><Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers></Configuration>

java代碼:

private static final Logger logger = LogManager.getLogger(MyApp.class); @Test public void testLog4j(){ logger.info("hello world!"); }}

控制臺信息

22:17:47.146 [main] INFO MyApp - hello world!

二、模塊介紹

<Configuration>

 

屬性 描述
monitorInterval 如果文件被修改了,指定時間后會重新加載配置。單位秒,最小值是5
packages 以逗號隔開的包名列表,用于搜索插件,比如自定義filter、appender等。插件僅會加載一次,所以要想修改后生效必須重啟項目
status 內部日志級別,設置值為debug可以在控制臺上清晰地看到整個日志事件流程,所使用的Logger是org.apache.logging.log4j.core.LOGGER
strict 允許使用嚴格的XML格式。不支持JSON配置
verbose 在加載插件時啟用診斷信息

 

<Appenders>

Log4j允許將日志請求打印到多個目的地。在log4j語言中,輸出目的地稱為Appender。目前,appender存在于控制臺、文件、遠程套接字服務器、Apache Flume、JMS、遠程UNIX Syslog守護進程和各種數據庫api中。以下介紹幾種比較常用的appender,如需了解更多可以到官網上進行查閱。

1、ConsoleAppender

輸出到控制臺,<Console>

 

參數名稱

類型

描述

filter

Filter

過濾器

layout

Layout

日志輸出格式

follow

boolean

 

direct

boolean

 

name

String

Appender的名稱

ignoreExceptions

boolean

默認true,忽略寫入異常

target

String

SYSTEM_OUT或SYSTEM_ERR,默認是SYSTEM_OUT

 

2、FileAppender

輸出到文件,<File>

 

參數

類型

描述

append

boolean

默認是true,新記錄將追加到文件尾部

bufferedIO

boolean

默認是true,使用緩沖區可以顯著地提高性能

bufferSize

int

當bufferedIO是true時,這個屬性緩沖區大小,默認是8192字節。

createOnDemand

boolean

appender按需創建文件。只有當一個日志事件通過所有過濾器并被路由到這個appender時,appender才會創建這個文件。默認值為假

filter

Filter

一個過濾器來確定事件是否應該由這個Appender處理。使用復合過濾器可以使用多個篩選器

fileName

String

要寫入的文件的名稱。如果文件或它的任何父目錄不存在,它們將被創建

immediateFlush

boolean

默認true,每次寫入后都將有一個刷新。這將保證緩沖區的數據被寫入磁盤,但可能會影響性能。

layout

Layout

日志格式

locking

boolean

文件鎖,默認false

name

String

Appender的名稱

ignoreExceptions

boolean

默認true,忽略寫入異常

filePermissions

String

定義文件權限

例: rw------- or rw-rw-rw- etc...

fileOwner

String

定義文件所有者

fileGroup

String

定義文件組

 

3、JDBCAppender

JDBCAppender使用標準JDBC將日志事件寫入到關系數據庫表中。它可以配置為使用JNDI數據源或自定義工廠方法獲得JDBC連接。無論采用哪種方法,都必須由連接池來支持。

否則,日志記錄性能將受到極大的影響。

如果已配置的JDBC驅動程序支持批處理語句,并且將緩沖區大小配置為一個正數,那么日志事件將被批處理。

(1)<JDBC>

 

參數

類型

描述

name

String

必須,appender的名稱

ignoreExceptions

boolean

默認true,忽略日志事件異常

filter

Filter

過濾器

bufferSize

int

如果一個大于0的整數,這將導致appender緩沖日志事件,并在緩沖區達到該大小時刷新寫入數據

connectionSource

ConnectionSource

必須,可被檢索到的數據庫連接

tableName

String

必須,插入日志事件的數據表名

columnConfigs

ColumnConfig[]

必須,需要插入到數據庫的字段,由多個<Column>元素組成

columnMappings

ColumnMapping[]

必須,字段映射配置

 

(2)使用<DataSource>來獲得JDBC的連接,這里僅列出jndi:

 

參數 類型 描述
jndiName String 必需的,如已配置的jndi為jdbc/LoggingDatabase,那此處的值為java:comp/env/jdbc/LoggingDatabase。數據源必須由連接池來支持;否則,日志記錄將非常緩慢。

 

(3)使用<Column>來指定要寫入表中的哪些列,以及如何對它們進行寫入。它沒有SQL注入漏洞。

 

參數 類型 描述
name String

必須,表字段名稱

pattern String

使用PatternLayout模式插入值,注:同一個Column元素中,patter、literal、isEventTimestamp3個屬性只能存在一個

literal String

該值將直接包含在SQL語句中執行,比如:rand()函數將生成隨機數,類似myibats中的${}

isEventTimestamp boolean

是否時間格式java.sql.Types.TIMESTAMP

isUnicode boolean

除非指定pattern,否則該屬性將被忽略。如果是true,該值將插入Unicode。否則,該值將被插入非Unicode。

isClob boolean

除非指定pattern,否則該屬性將被忽略。如果是true,該值將插入CLOB,否則將插入varchar、nvarchar

 

實例:

<?xml version="1.0" encoding="UTF-8"?><Configuration status="error"> <Appenders> <JDBC name="databaseAppender" tableName="dbo.application_log">  <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />  <Column name="eventDate" isEventTimestamp="true" />  <Column name="level" pattern="%level" />  <Column name="logger" pattern="%logger" />  <Column name="message" pattern="%message" />  <Column name="exception" pattern="%ex{full}" /> </JDBC> </Appenders> <Loggers> <Root level="warn">  <AppenderRef ref="databaseAppender"/> </Root> </Loggers></Configuration>

<PatternLayout>

(1)日期,%d / %date

 

Pattern

示例

%d{DEFAULT}

2012-11-02 14:34:02,781

%d{ISO8601}

2012-11-02T14:34:02,781

%d{ISO8601_BASIC}

20121102T143402,781

%d{ABSOLUTE}

14:34:02,781

%d{DATE}

02 Nov 2012 14:34:02,781

%d{COMPACT}

20121102143402781

%d{HH:mm:ss,SSS}

14:34:02,781

%d{dd MMM yyyy HH:mm:ss,SSS}

02 Nov 2012 14:34:02,781

%d{HH:mm:ss}{GMT+0}

18:34:02

%d{UNIX}

1351866842

%d{UNIX_MILLIS}

1351866842781

 

當然你也可以自定義格式,比如 %d{yyyy-MM-dd HH:mm:ss}

(2)記錄器,%c / %logger

 

Conversion Pattern

Logger Name

結果

%c{1}

org.apache.commons.Foo

Foo

%c{2}

org.apache.commons.Foo

commons.Foo

%c{10}

org.apache.commons.Foo

org.apache.commons.Foo

%c{-1}

org.apache.commons.Foo

apache.commons.Foo

%c{-2}

org.apache.commons.Foo

commons.Foo

%c{-10}

org.apache.commons.Foo

org.apache.commons.Foo

%c{1.}

org.apache.commons.Foo

o.a.c.Foo

%c{1.1.~.~}

org.apache.commons.test.Foo

o.a.~.~.Foo

%c{.}

org.apache.commons.test.Foo

....Foo

 

{?} - ?是正整數時表示從右邊開始取n個部分,負整數表示從左邊開始移除n個部分,那為什么%c{-10}是完整的名稱我也不清楚,歡迎留言

(3)日志信息,%m / %msg / %message

(4)日志級別,%level

<Filter>

log4j2自帶多種filter供直接使用,也可以由我們自己來定義filter:

MyFilter.java

import org.apache.logging.log4j.Level;import org.apache.logging.log4j.Marker;import org.apache.logging.log4j.ThreadContext;import org.apache.logging.log4j.core.LogEvent;import org.apache.logging.log4j.core.Logger;import org.apache.logging.log4j.core.config.plugins.Plugin;import org.apache.logging.log4j.core.config.plugins.PluginAttribute;import org.apache.logging.log4j.core.config.plugins.PluginFactory;import org.apache.logging.log4j.core.filter.AbstractFilter;import org.apache.logging.log4j.message.Message;@Plugin(name = "MyFilter", category = "Core", elementType = "filter", printObject = true)public final class MyFilter extends AbstractFilter { private final Level level; private MyFilter(Level level, Result onMatch, Result onMismatch) {  super(onMatch, onMismatch);  this.level = level; } public Result filter(Logger logger, Level level, Marker marker, String msg, Object[] params) {  return filter(level); } public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) {  return filter(level); } public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) {  return filter(level); } @Override public Result filter(LogEvent event) {  return filter(event.getLevel()); } private Result filter(Level level) {  /*  * 業務邏輯  * */    return level.isMoreSpecificThan(this.level) ? onMatch : onMismatch; } @Override public String toString() {  return level.toString(); } @PluginFactory public static MyFilter createFilter(@PluginAttribute(value = "level", defaultString = "ERROR") Level level,            @PluginAttribute(value = "onMatch", defaultString = "NEUTRAL") Result onMatch,            @PluginAttribute(value = "onMismatch", defaultString = "DENY") Result onMismatch) {  return new MyFilter(level, onMatch, onMismatch); }}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?><Configuration status="warn" monitorInterval="5" packages="your packages" verbose="false" strict="true"> <Appenders> <Console name="Console" target="SYSTEM_OUT" ignoreExceptions="true">  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %level %logger{10} - %msg"/>  <MyFilter level="info" onMatch="ACCEPT"/> </Console> </Appenders> <Loggers> <Root level="info">  <AppenderRef ref="Console"/> </Root> </Loggers></Configuration>

補充:

在實際應用中,有時需要對用戶的訪問信息進行記錄,比如請求參數、用戶id等等。在log4j1中我們會使用MDC和NDC來存儲應用程序的上下文信息,而log4j2使用ThreadContext來實現MDC和NDC兩者的功能。

(1)NDC采用類似棧的機制來存儲上下文信息,線程獨立。

在PatternLayout中使用 %x 來輸出,注意x是小寫。

實例:

Test.java

ThreadContext.push("hello world!");

log4j2.xml

<Column name="tip" pattern="%x" />

(2)MDC采用類似map的機制來存儲信息,線程獨立。

在PatternLayout中使用 %X{userId} 來輸出,注意X是大寫。

實例:

Test.java

ThreadContext.put("userId","1");

log4j2.xml

<Column name="userId" pattern="%X{userId}" />

注意使用完后調用clearAll()清除上下文映射和堆棧。

api:http://logging.apache.org/log4j/2.x/javadoc.html

官網地址:https://logging.apache.org/log4j/2.x/index.html

以上這篇log4j2 項目日志組件的實例代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品视频在线观看| 亚洲第一区第二区| 国产成人精品电影久久久| 亚洲自拍欧美色图| 在线视频欧美性高潮| 亚洲精品日韩在线| 91亚洲国产成人精品性色| 中文字幕久热精品在线视频| 亚洲bt天天射| 亚洲视频免费一区| 国产成人精品在线观看| 久久久久久网址| 精品久久久久久国产| 国产免费一区二区三区在线观看| 一区二区欧美在线| 亚洲精品国产精品久久清纯直播| 国产精品久久久久久av福利软件| 成人福利免费观看| 国产在线播放91| 亚洲成色999久久网站| 久久久国产成人精品| 欧美性猛交xxxx偷拍洗澡| 精品二区三区线观看| 亚洲欧美激情精品一区二区| 欧美美最猛性xxxxxx| 97涩涩爰在线观看亚洲| 欧美国产日韩精品| 九九热精品视频国产| 国产精品免费福利| 亚洲色图av在线| 国自在线精品视频| 成人精品久久一区二区三区| 日韩在线观看免费网站| 欧亚精品中文字幕| 精品久久久久久国产91| 久久久久久久久久久成人| 6080yy精品一区二区三区| 2019日本中文字幕| 久久久亚洲影院| 久久亚洲国产精品成人av秋霞| 高跟丝袜欧美一区| 久久综合九色九九| 久久精品电影一区二区| 日韩www在线| 日韩欧美主播在线| 欧美在线不卡区| 97免费视频在线| 久久久精品久久| 亚洲小视频在线| 欧美巨猛xxxx猛交黑人97人| 色综合老司机第九色激情| 成人动漫网站在线观看| 中文字幕在线视频日韩| 亚洲最大的av网站| 国产精品久久久久久婷婷天堂| 日韩精品中文字幕久久臀| 亚洲天堂av高清| 青青久久av北条麻妃黑人| 欧美性极品少妇精品网站| 91探花福利精品国产自产在线| 懂色av中文一区二区三区天美| 欧美富婆性猛交| 国产日韩欧美日韩| 欧美在线视频免费观看| 国产精品91免费在线| 欧美视频二区36p| 国产免费亚洲高清| 国产精品第一视频| 夜夜躁日日躁狠狠久久88av| 狠狠躁夜夜躁久久躁别揉| 亚洲精品动漫100p| 欧美亚洲国产另类| 国产精品视频网| 91精品免费视频| 亚洲精品国产精品久久清纯直播| 中文字幕少妇一区二区三区| 久久91亚洲精品中文字幕奶水| 日本国产欧美一区二区三区| 国精产品一区一区三区有限在线| 日韩中文第一页| 国产精品久久久久久久久久久不卡| 国产在线拍揄自揄视频不卡99| 亚洲成人黄色在线观看| 97婷婷大伊香蕉精品视频| 国产精品极品美女在线观看免费| 国产在线观看91精品一区| 日韩av免费在线观看| 久久久久久欧美| 韩国三级电影久久久久久| 亚洲最大激情中文字幕| 亚洲最大成人网色| 国产91精品网站| 亚洲成人久久久| 国产婷婷97碰碰久久人人蜜臀| 国产精品一区二区av影院萌芽| 亚洲天堂男人天堂女人天堂| 黑人巨大精品欧美一区免费视频| 成人欧美在线视频| 亚洲精品免费一区二区三区| 亚洲男女自偷自拍图片另类| 欧美激情videoshd| 欧美午夜精品伦理| 亚洲国产精品久久久久秋霞蜜臀| 成人日韩av在线| 中文字幕欧美专区| 欧美大成色www永久网站婷| 日韩免费观看高清| 国产精品美乳在线观看| 性欧美xxxx视频在线观看| 社区色欧美激情 | 亚洲男人天堂视频| 欧美激情久久久久| 日韩av在线直播| 亚洲理论在线a中文字幕| 国产精品电影久久久久电影网| 日韩中文字幕在线| 亚洲欧美精品一区| 中文日韩电影网站| 欧美午夜xxx| 久久久欧美精品| 欧美性xxxx极品hd满灌| 中文字幕亚洲字幕| 亚洲一区二区三区在线视频| 中文字幕日韩av| 国产裸体写真av一区二区| 亚洲加勒比久久88色综合| 亚洲综合成人婷婷小说| 亚洲成年人影院在线| 国产精品第七影院| 国产欧美最新羞羞视频在线观看| 色综合久久久888| 欧美另类极品videosbestfree| 日韩欧美在线中文字幕| 中文字幕一区二区三区电影| 欧美国产高跟鞋裸体秀xxxhd| 欧洲亚洲妇女av| 国产亚洲精品久久久久久牛牛| 国产精品久久77777| 日韩av网站导航| 尤物tv国产一区| 国产一区深夜福利| 欧美国产精品日韩| 欧美极品少妇xxxxx| 亚洲视频电影图片偷拍一区| 最好看的2019的中文字幕视频| 国产精品欧美一区二区三区奶水| 精品国产成人在线| 97在线视频免费观看| 欧美性受xxx| 国模极品一区二区三区| 成人福利在线视频| 精品高清美女精品国产区| 久久久人成影片一区二区三区| 97婷婷涩涩精品一区| 国产又爽又黄的激情精品视频| 欧美在线国产精品| 亚洲午夜精品视频| 91国内揄拍国内精品对白| 97久久精品人人澡人人爽缅北| 国产精品自产拍在线观看| 黑人精品xxx一区一二区| 青青久久aⅴ北条麻妃| 日韩av片免费在线观看| 国产第一区电影|