日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

log4j2的使用

發(fā)布時(shí)間:2024/9/19 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 log4j2的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Apache Log4j 2是對Log4j的升級版,參考了logback的一些優(yōu)秀的設(shè)計(jì),并且修復(fù)了一些問題,因此帶
來了一些重大的提升,主要有:
異常處理,在 logback中,Appender中的異常不會被應(yīng)用感知到,但是在log4j2中,提供了一些異常處理機(jī)制。
性能提升, log4j2相較于log4j 和logback都具有很明顯的性能提升,后面會有官方測試的數(shù)據(jù)。
自動(dòng)重載配置,參考了 logback的設(shè)計(jì),當(dāng)然會提供自動(dòng)刷新參數(shù)配置,最實(shí)用的就是我們在生產(chǎn)
上可以動(dòng)態(tài)的修改日志的級別而不需要重啟應(yīng)用。
無垃圾機(jī)制, log4j2在大部分情況下,都可以使用其設(shè)計(jì)的一套無垃圾機(jī)制,避免頻繁的日志收集導(dǎo)致的jvm gc。

官網(wǎng): https://logging.apache.org/log4j/2.x/
Log4j2入門
目前市面上最主流的日志門面就是SLF4J,雖然Log4j2也是日志門面,因?yàn)樗娜罩緦?shí)現(xiàn)功能非常強(qiáng)
大,性能優(yōu)越。所以大家一般還是將Log4j2看作是日志的實(shí)現(xiàn),Slf4j + Log4j2應(yīng)該是未來的大勢所趨。
1. 添加依賴

        <!--log4j2日志門面-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <!--log4j2 日志實(shí)現(xiàn)-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
public class Log4j2Test {

    // 定義日志記錄器對象
    public static final Logger LOGGER = LogManager.getLogger(Log4j2Test.class);

    // 快速入門
    @Test
    public void testQuick()throws Exception{
        // 日志消息輸出
        LOGGER.fatal("fatal");
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("inf");
        LOGGER.debug("debug");
        LOGGER.trace("trace");


    }
}

2. 使用slf4j作為日志的門面,使用log4j2作為日志的實(shí)現(xiàn)

 <!--使用slf4j 作為日志門面-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>


        <!--使用 log4j2 的適配器進(jìn)行綁定-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.9.1</version>
        </dependency>
public class Slf4jTest {

    public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);

    // 快速入門
    @Test
    public void test01()throws Exception{
        // 日志輸出
        LOGGER.error("error");
        LOGGER.warn("wring");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");

    }
}

Log4j2配置
log4j2默認(rèn)加載classpath下的 log4j2.xml 文件中的配置。

<?xml version="1.0" encoding="UTF-8"?>
<!--
    status="warn" 日志框架本身的輸出日志級別
    monitorInterval="5" 自動(dòng)加載配置文件的間隔時(shí)間,不低于 5 秒
-->
<Configuration status="debug" monitorInterval="5">

    <!--
        集中配置屬性進(jìn)行管理
        使用時(shí)通過:${name}
    -->
    <properties>
        <property name="LOG_HOME">/logs</property>
    </properties>

    <!--日志處理-->
    <Appenders>
        <!--控制臺輸出 appender-->
        <Console name="Console" target="SYSTEM_ERR">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" />
        </Console>

        <!--日志文件輸出 appender-->
        <File name="file" fileName="${LOG_HOME}/myfile.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
        </File>

        <!--<Async name="Async">-->
            <!--<AppenderRef ref="file"/>-->
        <!--</Async>-->

        <!--使用隨機(jī)讀寫劉的日志文件輸出 appender,性能提高-->
        <RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
        </RandomAccessFile>

        <!--按照一定規(guī)則拆分的日志文件的 appender-->
        <RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"
                     filePattern="/logs/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
            <!--日志級別過濾器-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
            <!--日志消息格式-->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n" />
            <Policies>
                <!--在系統(tǒng)啟動(dòng)時(shí),出發(fā)拆分規(guī)則,生產(chǎn)一個(gè)新的日志文件-->
                <OnStartupTriggeringPolicy />
                <!--按照文件大小拆分,10MB -->
                <SizeBasedTriggeringPolicy size="10 MB" />
                <!--按照時(shí)間節(jié)點(diǎn)拆分,規(guī)則根據(jù)filePattern定義的-->
                <TimeBasedTriggeringPolicy />
            </Policies>
            <!--在同一個(gè)目錄下,文件的個(gè)數(shù)限定為 30 個(gè),超過進(jìn)行覆蓋-->
            <DefaultRolloverStrategy max="30" />
        </RollingFile>

    </Appenders>

    <!--logger 定義-->
    <Loggers>


        <!--自定義異步 logger 對象
            includeLocation="false" 關(guān)閉日志記錄的行號信息
            additivity="false" 不在繼承 rootlogger 對象
        -->
        <AsyncLogger name="com.topcheer" level="trace" includeLocation="false" additivity="false">
            <AppenderRef ref="Console"/>
        </AsyncLogger>


        <!--使用 rootLogger 配置 日志級別 level="trace"-->
        <Root level="trace">
            <!--指定日志使用的處理器-->
            <AppenderRef ref="Console" />

            <!--使用異步 appender-->
            <AppenderRef ref="Async" />
        </Root>
    </Loggers>
</Configuration>

Log4j2異步日志
log4j2最大的特點(diǎn)就是異步日志,其性能的提升主要也是從異步日志中受益,我們來看看如何使用
log4j2的異步日志。
同步日志

異步日志

Log4j2 提供了兩種實(shí)現(xiàn)日志的方式,一個(gè)是通過AsyncAppender,一個(gè)是通過AsyncLogger,分別對應(yīng)
前面我們說的Appender組件和Logger組件。
注意:配置異步日志需要添加依賴

<!--異步日志依賴-->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>

1. AsyncAppender方式

        <!--日志文件輸出 appender-->
        <File name="file" fileName="${LOG_HOME}/myfile.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
        </File>

        <!--<Async name="Async">-->
            <!--<AppenderRef ref="file"/>-->
        <!--</Async>-->
 <!--使用 rootLogger 配置 日志級別 level="trace"-->
        <Root level="trace">
            <!--指定日志使用的處理器-->
            <AppenderRef ref="Console" />

            <!--使用異步 appender-->
            <AppenderRef ref="Async" />
        </Root>

2 . AsyncLogger方式
AsyncLogger才是log4j2 的重頭戲,也是官方推薦的異步方式。它可以使得調(diào)用Logger.log返回的
更快。你可以有兩種選擇:全局異步和混合異步。
全局異步就是,所有的日志都異步的記錄,在配置文件上不用做任何改動(dòng),只需要添加一個(gè)
log4j2.component.properties 配置;

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

混合異步 就是,你可以在應(yīng)用中同時(shí)使用同步日志和異步日志,這使得日志的配置方式更加
靈活。

 <!--自定義異步 logger 對象
            includeLocation="false" 關(guān)閉日志記錄的行號信息
            additivity="false" 不在繼承 rootlogger 對象
        -->
        <AsyncLogger name="com.topcheer" level="trace" includeLocation="false" additivity="false">
            <AppenderRef ref="Console"/>
        </AsyncLogger>

如上配置: com.topcheer日志是異步的,root日志是同步的。
使用異步日志需要注意的問題:
1. 如果使用異步日志,AsyncAppender、AsyncLogger和全局日志,不要同時(shí)出現(xiàn)。性能會和
AsyncAppender一致,降至最低。
2. 設(shè)置includeLocation=false ,打印位置信息會急劇降低異步日志的性能,比同步日志還要
慢。

Log4j2 的性能
Log4j2最牛的地方在于異步輸出日志時(shí)的性能表現(xiàn),Log4j2在多線程的環(huán)境下吞吐量與Log4j和
Logback的比較如下圖。下圖比較中Log4j2有三種模式:1)全局使用異步模式;2)部分Logger采用異
步模式;3)異步Appender。可以看出在前兩種模式下,Log4j2的性能較之Log4j和Logback有很大的
優(yōu)勢。

無垃圾記錄
垃圾收集暫停是延遲峰值的常見原因,并且對于許多系統(tǒng)而言,花費(fèi)大量精力來控制這些暫停。
許多日志庫(包括以前版本的Log4j)在穩(wěn)態(tài)日志記錄期間分配臨時(shí)對象,如日志事件對象,字符串,
字符數(shù)組,字節(jié)數(shù)組等。這會對垃圾收集器造成壓力并增加GC暫停發(fā)生的頻率。
從版本2.6開始,默認(rèn)情況下Log4j以“無垃圾”模式運(yùn)行,其中重用對象和緩沖區(qū),并且盡可能不分配臨
時(shí)對象。還有一個(gè)“低垃圾”模式,它不是完全無垃圾,但不使用ThreadLocal字段。
Log4j 2.6中的無垃圾日志記錄部分通過重用ThreadLocal字段中的對象來實(shí)現(xiàn),部分通過在將文本轉(zhuǎn)換
為字節(jié)時(shí)重用緩沖區(qū)來實(shí)現(xiàn)。
使用Log4j 2.5:內(nèi)存分配速率809 MB /秒,141個(gè)無效集合。

Log4j 2.6 沒有分配臨時(shí)對象:0(零)垃圾回收。

有兩個(gè)單獨(dú)的系統(tǒng)屬性可用于手動(dòng)控制 Log4j用于避免創(chuàng)建臨時(shí)對象的機(jī)制:
log4j2.enableThreadlocals - 如果“true”(非Web應(yīng)用程序的默認(rèn)值)對象存儲在
ThreadLocal字段中并重新使用,否則將為每個(gè)日志事件創(chuàng)建新對象。
log4j2.enableDirectEncoders - 如果將“true”(默認(rèn))日志事件轉(zhuǎn)換為文本,則將此文本轉(zhuǎn)換
為字節(jié)而不創(chuàng)建臨時(shí)對象。注意: 由于共享緩沖區(qū)上的同步,在此模式下多線程應(yīng)用程序的同步
日志記錄性能可能更差。如果您的應(yīng)用程序是多線程的并且日志記錄性能很重要,請考慮使用異步
記錄器

總結(jié)

以上是生活随笔為你收集整理的log4j2的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。