常用日誌框架
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),它允許你在後台使用任何一個日誌實作。
前面介紹的幾種日誌框架一樣,每一種日誌框架都有自己單獨的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:以簡單的形式顯示
%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有兩個屬性:monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.
Appenders節點
常見的有三種子節點:Console、RollingFile、File
Console節點用來定義輸出到控制台的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中文網其他相關文章!