springboot使用log4j2代替內置log4j


前言

  • log4j是apache實現的一個開源日志組件
  • logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現
  • log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,並解決了一些死鎖的bug,而且配置更加簡單靈活

slf4j是對所有日志框架制定的一種規范、標准、接口,並不是一個框架的具體的實現,因為接口並不能獨立使用,需要和具體的日志框架實現配合使用(如log4j、logback),使用接口的好處是當項目需要更換日志框架的時候,只需要更換jar和配置,不需要更改相關java代碼

log4j、logback、log4j2都是一種日志具體實現框架,所以既可以單獨使用也可以結合slf4j一起搭配使用。

使用Log4j2

  • 在pom文件中排除掉spring-boot-starter-web下的spring-boot-starter-logging依賴,並添加log4j2依賴,如下:
            <!--排除依賴-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <artifactId>spring-boot-starter-logging</artifactId>
                        <groupId>org.springframework.boot</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--添加依賴-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
  • 在resources新增log4j2.xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出,默認是OFF-->
    <!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
    <configuration status="WARN" monitorInterval="30">
        <Properties>
            <!--自定義一些常量,之后使用${變量名}引用-->
            <Property name="logFilePath">./applogs</Property>
        </Properties>
        <!--定義所有的appender-->
        <!--appenders:定義輸出內容,輸出格式,輸出方式,日志保存策略等,常用其下三種標簽[console,File,RollingFile]-->
        <appenders>
            <!--console :控制台輸出的配置-->
            <console name="Console" target="SYSTEM_OUT">
                <!--設置控制台打印級別-->
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
                <!--PatternLayout :輸出日志的格式,LOG4J2定義了輸出代碼,詳細解釋見下文-->
                <!--<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %M [%L] - %msg%n"/>-->
                <!--<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} %-5p %processId -&#45;&#45; [%t] - %logger - %m%n"/>-->
                <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %-40.40logger{39} - %m%n"/>
            </console>
    
            <!--File :同步輸出日志到本地文件-->
            <!--append="false":這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用-->
            <File name="log" fileName="${logFilePath}/log_all.log" append="false">
                <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
            </File>
    
            <!--SMTP :郵件發送日志-->
            <!--<SMTP name="Mail" subject="****SaaS系統正式版異常信息" to="message@message.info" from="message@lengjing.info" smtpUsername="message@message.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>-->
            <!-- ${sys:user.home} windows下指C:\Users\用戶名\logs路徑 -->
            <!-- 這個會打印出所有的debug及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
            <RollingFile name="RollingFileDebug" fileName="${logFilePath}/log_debug.log"
                         filePattern="${logFilePath}/debug/debug-%d{yyyy-MM-dd-HH-mm}-%i.log">
                <!--ThresholdFilter :日志輸出過濾-->
                <!--level="info" :日志級別,onMatch="ACCEPT" :級別在info之上則接受,onMismatch="DENY" :級別在info之下則拒絕-->
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
                <!-- Policies :日志滾動策略-->
                <Policies>
                    <!--關鍵點在於 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精確到哪一位,interval也精確到哪一個單位-->
                    <!-- TimeBasedTriggeringPolicy :時間滾動策略,每一天生成一個新的文件, modulate="true" : 產生文件是否以0點偏移時間-->
                    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                    <!-- SizeBasedTriggeringPolicy :文件大小滾動策略-->
                    <SizeBasedTriggeringPolicy size="100MB"/>
                </Policies>
                <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 -->
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
            <RollingFile name="RollingFileInfo" fileName="${logFilePath}/log_info_now.log"
                         filePattern="${logFilePath}/info/info-%d{yyyy-MM-dd-HH-mm}-%i.log">
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
            <RollingFile name="RollingFileWarn" fileName="${logFilePath}/log_warn_now.log"
                         filePattern="${logFilePath}/warn/warn-%d{yyyy-MM-dd-HH-mm}-%i.log">
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n1"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
            <RollingFile name="RollingFileError" fileName="${logFilePath}/log_error_now.log"
                         filePattern="${logFilePath}/error/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                    <SizeBasedTriggeringPolicy size="100 MB"/>
                </Policies>
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
        </appenders>
        <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效-->
        <loggers>
            <!-- Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出 -->
            <root level="info">
                <appender-ref ref="Console"/>
                <appender-ref ref="log"/>
                <appender-ref ref="RollingFileDebug"/>
                <appender-ref ref="RollingFileInfo"/>
                <appender-ref ref="RollingFileWarn"/>
                <appender-ref ref="RollingFileError"/>
            </root>
            <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
            <!--Logger節點用來單獨指定日志的形式,name為包路徑,比如要為org.springframework包下所有日志指定為INFO級別等。 -->
            <logger name="org.springframework" level="INFO"/>
            <logger name="org.mybatis" level="INFO"/>
            <!--log4j2 自帶過濾日志-->
            <Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
            <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
            <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
            <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
            <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
            <Logger name="org.crsh.plugin" level="warn"/>
            <logger name="org.crsh.ssh" level="warn"/>
            <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error"/>
            <Logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
            <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
            <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
            <logger name="org.thymeleaf" level="warn"/>
            <!--AsyncLogger :異步日志,LOG4J有三種日志模式,全異步日志,混合模式,同步日志,性能從高到底,線程越多效率越高,也可以避免日志卡死線程情況發生-->
            <!--additivity="false" : additivity設置事件是否在root logger輸出,為了避免重復輸出,可以在Logger 標簽下設置additivity為”false”-->
            <!--        <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true" additivity="false">
                        <appender-ref ref="RollingFileError"/>
                    </AsyncLogger>-->
        </loggers>
    </configuration>
  • 再在SpringBoot配置文件中引入該配置
    logging:
      config: classpath:log4j2.xml
    

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM