網(wǎng)站建設(shè)包含哪些內(nèi)容巨量算數(shù)數(shù)據(jù)分析入口
日志系統(tǒng)
java.util.logging (JUL)
JDK1.4
開始,通過 java.util.logging
提供日志功能。雖然是官方自帶的log lib
,JUL
的使用確不廣泛。
JUL
從JDK1.4
才開始加入(2002年),當(dāng)時各種第三方log lib
已經(jīng)被廣泛使用了JUL
早期存在性能問題,到JDK1.5
上才有了不錯的進步,但現(xiàn)在和Logback/Log4j2
相比還是有所不如JUL
的功能不如Logback/Log4j2
等完善,比如Output Handler
就沒有Logback/Log4j2
的豐富,有時候需要自己來繼承定制,又比如默認(rèn)沒有從ClassPath
里加載配置文件的功能
Log4j
Log4j
是 apache
的一個開源項目,創(chuàng)始人 Ceki Gulcu
。Log4j
應(yīng)該說是 Java
領(lǐng)域資格最老,應(yīng)用最廣的日志工具。Log4j
是高度可配置的,并可通過在運行時的外部文件配置。它根據(jù)記錄的優(yōu)先級別,并提供機制,以指示記錄信息到許多的目的地,諸如:數(shù)據(jù)庫,文件,控制臺,UNIX
系統(tǒng)日志等。
Log4j
中有三個主要組成部分:loggers
- 負(fù)責(zé)捕獲記錄信息。appenders
- 負(fù)責(zé)發(fā)布日志信息,以不同的首選目的地。layouts
- 負(fù)責(zé)格式化不同風(fēng)格的日志信息。
Log4j
的短板在于性能,在Logback
和 Log4j2
出來之后,Log4j
的使用也減少了。
LogbackLogback
是由 log4j
創(chuàng)始人 Ceki Gulcu
設(shè)計的又一個開源日志組件,是作為 Log4j
的繼承者來開發(fā)的,提供了性能更好的實現(xiàn),異步 logger
,Filter
等更多的特性。logback
當(dāng)前分成三個模塊:logback-core
、logback-classic
和 logback-access
。
logback-core
- 是其它兩個模塊的基礎(chǔ)模塊。logback-classic
- 是 log4j
的一個 改良版本。此外 logback-classic
完整實現(xiàn) SLF4J API
使你可以很方便地更換成其它日志系統(tǒng)如 log4j
或 JDK14 Logging
。
logback-access
- 訪問模塊與 Servlet
容器集成提供通過 Http
來訪問日志的功能。
Log4j2
維護 Log4j
的人為了性能又搞出了 Log4j2
。Log4j2
和 Log4j1.x
并不兼容,設(shè)計上很大程度上模仿了 SLF4J/Logback
,性能上也獲得了很大的提升。Log4j2
也做了 Facade/Implementation
分離的設(shè)計,分成了 log4j-api
和 log4j-core
。
Log4j vs Logback vs Log4j2
按照官方的說法,Log4j2
大大優(yōu)于 Log4j
和 Logback
。
那么,Log4j2
相比于先問世的 Log4j
和 Logback
,它具有哪些優(yōu)勢呢?
-
Log4j2
旨在用作審計日志記錄框架。Log4j 1.x
和Logback
都會在重新配置時丟失事件。Log4j 2
不會。在Logback
中,Appender
中的異常永遠(yuǎn)不會對應(yīng)用程序可見。在Log4j
中,可以將Appender
配置為允許異常滲透到應(yīng)用程序。 -
Log4j2
在多線程場景中,異步Loggers
的吞吐量比Log4j 1.x
和Logback
高 10 倍,延遲低幾個數(shù)量級。 -
Log4j2
對于獨立應(yīng)用程序是無垃圾的,對于穩(wěn)定狀態(tài)日志記錄期間的Web
應(yīng)用程序來說是低垃圾。這減少了垃圾收集器的壓力,并且可以提供更好的響應(yīng)時間性能。 -
Log4j2
使用插件系統(tǒng),通過添加新的Appender
、Filter
、Layout
、Lookup
和Pattern Converter
,可以非常輕松地擴展框架,而無需對Log4j
進行任何更改。 -
由于插件系統(tǒng)配置更簡單。配置中的條目不需要指定類名。
-
支持自定義日志等級。
-
支持
lambda
表達式。 -
支持消息對象。
-
Log4j
和Logback
的Layout
返回的是字符串,而Log4j2
返回的是二進制數(shù)組,這使得它能被各種Appender
使用。 -
Syslog Appender
支持TCP
和UDP
并且支持BSD
系統(tǒng)日志。 -
Log4j2
利用Java5
并發(fā)特性,盡量小粒度的使用鎖,減少鎖的開銷
日志門面
日志門面是對不同日志框架提供的一個 API
封裝,可以在部署的時候不修改任何配置即可接入一種日志實現(xiàn)方案。
common-logging
common-logging
是apache
的一個開源項目。也稱Jakarta Commons Logging
,縮寫 JCL
。common-logging
的功能是提供日志功能的 API
接口,本身并不提供日志的具體實現(xiàn)(當(dāng)然,common-logging
內(nèi)部有一個 Simple logger
的簡單實現(xiàn),但是功能很弱,直接忽略),而是在運行時動態(tài)的綁定日志實現(xiàn)組件來工作(如 log4j
、java.util.loggin
)。
slf4j
全稱為 Simple Logging Facade for Java
,即 java
簡單日志門面。類似于 Common-Logging
,slf4j
是對不同日志框架提供的一個 API
封裝,可以在部署的時候不修改任何配置即可接入一種日志實現(xiàn)方案。但是,slf4j
在編譯時靜態(tài)綁定真正的 Log
庫。使用 SLF4J
時,如果你需要使用某一種日志實現(xiàn),那么你必須選擇正確的 SLF4J
的 jar
包的集合(各種橋接包)
common-logging vs slf4j
slf4j
庫類似于 Apache Common-Logging
。但是,他在編譯時靜態(tài)綁定真正的日志庫。這點似乎很麻煩,其實也不過是導(dǎo)入橋接 jar
包而已。
slf4j
一大亮點是提供了更方便的日志記錄方式:
不需要使用logger.isDebugEnabled()
來解決日志因為字符拼接產(chǎn)生的性能問題。slf4j
的方式是使用{}
作為字符串替換符,形式如下:
logger.debug("id: {}, name: {} ", id, name);
總結(jié) 使用 slf4j + Logback 可謂是目前最理想的日志解決方案了。
slf4j + Logback
添加依賴到 pom.xml
中即可。logback-classic-1.0.13.jar
會自動將 slf4j-api-1.7.21.jar
和 logback-core-1.0.13.jar
也添加到你的項目中。
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.13</version>
</dependency>
<?xml version="1.0" encoding="UTF-8" ?><!-- logback中一共有5種有效級別,分別是TRACE、DEBUG、INFO、WARN、ERROR,優(yōu)先級依次從低到高 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false"><property name="DIR_NAME" value="spring-helloworld"/><!-- 將記錄日志打印到控制臺 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><!-- RollingFileAppender begin --><appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>30MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/error.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/warn.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/info.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/debug.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/trace.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>TRACE</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><appender name="SPRING" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 根據(jù)時間來制定滾動策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.dir}/logs/${DIR_NAME}/springframework.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><!-- 根據(jù)文件大小來制定滾動策略 --><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n</pattern></encoder></appender><!-- RollingFileAppender end --><!-- logger begin --><!-- 本項目的日志記錄,分級打印 --><logger name="org.zp.notes.spring" level="TRACE" additivity="false"><appender-ref ref="STDOUT"/><appender-ref ref="ERROR"/><appender-ref ref="WARN"/><appender-ref ref="INFO"/><appender-ref ref="DEBUG"/><appender-ref ref="TRACE"/></logger><!-- SPRING框架日志 --><logger name="org.springframework" level="WARN" additivity="false"><appender-ref ref="SPRING"/></logger><root level="TRACE"><appender-ref ref="ALL"/></root><!-- logger end --></configuration>