首頁 > Java > java教程 > 主體

怎麼在Springboot使用log4j2日誌

WBOY
發布: 2023-05-22 08:58:11
轉載
1049 人瀏覽過

常用日誌框架

  • java.util.logging:是JDK在1.4版本中引入的Java原生日誌框架

  • #Log4j:Apache的一個開源項目,可以控制日誌資訊傳送的目的地是控制台、檔案、GUI元件等,可以控制每個日誌的輸出格式,這些可以透過一個設定檔來靈活地進行配置,而不需要修改應用的程式碼。雖然已經停止維護了,但目前絕大部分企業都是用的log4j。

  • LogBack:是Log4j的改良版本

  • Log4j2:Log4j2已經不只是Log4j的升級版了,它從頭到尾都被重寫了

日誌門面slf4j

上述介紹的是一些日誌框架的實現,這裡我們需要用日誌門面來解決系統與日誌實現框架的耦合性。 SLF4J,即簡單日誌門面(Simple Logging Facade for Java),它不是一個真正的日誌實現,而是一個抽象層( abstraction layer),它允許你在後台使用任何一個日誌實作。

怎麼在Springboot使用log4j2日誌

前面介紹的幾種日誌框架一樣,每一種日誌框架都有自己單獨的API,要使用對應的框架就要使用其對應的API,這就大大的增加應用程式程式碼對於日誌框架的耦合性。

使用了slf4j後,對於應用程式來說,無論底層的日誌框架如何改變,應用程式不需要修改任何一行程式碼,就可以直接上線了。

為什麼選用log4j2

相比與其他的日誌系統,log4j2丟資料這種情況少;disruptor技術,在多執行緒環境下,效能高於logback等10倍以上;利用jdk1.5並發的特性,減少了死鎖的發生;

log4j2優越的性能其原因在於log4j2使用了LMAX,一個無鎖的線程間通信庫代替了,logback和log4j之前的隊列. 並發性能大大提升。

整合步驟

引入Jar套件

#springboot預設是用logback的日誌框架的,所以需要排除logback,不然會出現jar依賴衝突的報錯。

<dependency> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-web</artifactid> 
 <exclusions><!-- 去掉springboot默认配置 --> 
  <exclusion> 
   <groupid>org.springframework.boot</groupid> 
   <artifactid>spring-boot-starter-logging</artifactid> 
  </exclusion> 
 </exclusions> 
</dependency> 

<dependency> <!-- 引入log4j2依赖 --> 
 <groupid>org.springframework.boot</groupid> 
 <artifactid>spring-boot-starter-log4j2</artifactid> 
</dependency>
登入後複製

設定檔

如果自訂了檔名,需要在application.yml中設定

logging:
 config: xxxx.xml
 level:
 cn.jay.repository: trace
登入後複製

預設名log4j2-spring.xml,就省下了在application.yml中配置

設定檔模版

log4j是透過一個.properties的檔案作為主設定檔的,而現在的log4j2則已經棄用了這種方式,採用的是.xml,.json或者.jsn這種方式來做,可能這也是技術發展的一個必然性,因為properties文件的可閱讀性真的是有點差。

<?xml  version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration>
 <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

 <!--变量配置-->
 <properties>
 <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
 <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
 <property></property>
 <!-- 定义日志存储的路径,不要配置相对路径 -->
 <property></property>
 <property></property>
 </properties>

 <appenders>

 <console>
  <!--输出日志的格式-->
  <patternlayout></patternlayout>
  <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
 </console>

 <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
 <file>
  <patternlayout></patternlayout>
 </file>

 <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
 <rollingfile>
  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
  <patternlayout></patternlayout>
  <policies>
  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
  <timebasedtriggeringpolicy></timebasedtriggeringpolicy>
  <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy>
  </policies>
  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
  <defaultrolloverstrategy></defaultrolloverstrategy>
 </rollingfile>

 <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
 <rollingfile>
  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
  <patternlayout></patternlayout>
  <policies>
  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
  <timebasedtriggeringpolicy></timebasedtriggeringpolicy>
  <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy>
  </policies>
  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
  <defaultrolloverstrategy></defaultrolloverstrategy>
 </rollingfile>

 <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
 <rollingfile>
  <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  <thresholdfilter></thresholdfilter>
  <patternlayout></patternlayout>
  <policies>
  <!--interval属性用来指定多久滚动一次,默认是1 hour-->
  <timebasedtriggeringpolicy></timebasedtriggeringpolicy>
  <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy>
  </policies>
  <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
  <defaultrolloverstrategy></defaultrolloverstrategy>
 </rollingfile>

 </appenders>

 <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
 <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
 <loggers>

 <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
 <logger>
  <appenderref></appenderref>
 </logger>
 <!--监控系统信息-->
 <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
 <logger>
  <appenderref></appenderref>
 </logger>

 <root>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
  <appender-ref></appender-ref>
 </root>
 </loggers>

</configuration>
登入後複製

設定參數簡介

在這裡簡單介紹下常用的設定參數

日誌等級

  • 機制:如果一條日誌資訊的級別大於等於設定檔的級別,就記錄。

  • trace:追踪,就是程式推進一下,可以寫個trace輸出

  • debug:調試,一般作為最低級別,trace基本上不用。

  •  info:輸出重要的訊息,使用較多

  • #warn:警告,有些訊息不是錯誤訊息,但也要給程式設計師一些提示。

  • error:錯誤訊息。用的也很多。

  • fatal:致命錯誤。

輸出來源

  •  CONSOLE(輸出到控制台)

  • FILE(輸出到文件)

格式

  • SimpleLayout:以簡單的形式顯示

  • ##HTMLLayout:以HTML表格顯示

  • PatternLayout:自訂形式顯示

#PatternLayout自訂日誌佈局:

%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间
%-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%c : logger的名称(%logger)
%t : 输出当前线程名称
%p : 日志输出格式
%m : 日志内容,即 logger.info("message")
%n : 换行符
%C : Java类名(%F)
%L : 行号
%M : 方法名
%l : 输出语句所在的行数, 包括类名、方法名、文件名、行数
hostName : 本地机器名
hostAddress : 本地ip地址
登入後複製

#Log4j2設定詳解

根節點Configuration

有兩個屬性:

  • #status

  • ##monitorinterval
  • 有兩個子節點:

    Appenders
  • Loggers(表示可以定義多個Appender和Logger).
  • status用來指定log4j本身的列印日誌的等級.

monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.

Appenders節點

常見的有三種子節點:Console、RollingFile、File

Console節點用來定義輸出到控制台的Appender.

     name:指定Appender的名字.
  • 通常只將預設設為SYSTEM_OUT,而不是SYSTEM_ERR
  • #PatternLayout:輸出格式,不設定預設為:%m%n.
File節點用來定義輸出到指定位置的檔案的Appender .

     name:指定Appender的名字.
  • fileName:指定输出日志的目的文件带全路径的文件名.

  • PatternLayout:输出格式,不设置默认为:%m%n.

 RollingFile节点用来定义超过指定条件自动删除旧的创建新的Appender.

  • name:指定Appender的名字.

  • fileName:指定输出日志的目的文件带全路径的文件名.

  • PatternLayout:输出格式,不设置默认为:%m%n.

  • filePattern : 指定当发生Rolling时,文件的转移和重命名规则.

  • Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.

  • TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.

  • SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.

  • DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

Loggers节点,常见的有两种:Root和Logger.

  • Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

  • level:日志输出级别,共有8个级别,按照从低到高为:All

  • Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

  • level:日志输出级别,共有8个级别,按照从低到高为:All

  • name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.

  • AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

简单使用

public class LogExampleOther {
 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
 
 public static void main(String... args) {
 log.error("Something else is wrong here");
 }
}
登入後複製

使用lombok工具简化创建Logger类

lombok就是一个注解工具jar包,能帮助我们省略一繁杂的代码。具体介绍可以看我的这篇教程。

使用lombok后下面的代码等效于上述的代码,这样会更方便的使用日志。

@Slf4j
public class LogExampleOther {
 
 public static void main(String... args) {
 log.error("Something else is wrong here");
 }
}
登入後複製

以上是怎麼在Springboot使用log4j2日誌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!