日志
日志信息根據用途與記錄內容的不同,分為調試日志、運行日志、異常日志等。
Java常用記錄日志
- logger
- log4j
- log4j2
- logback
其中除了logger使用的概率較小,因此主要介紹后面三個
日志級別
為了方便日志信息的輸出顯示,對日志內容進行了分級管理。 日志級別由高到低,共分 6 個級別:
- fatal(致命的)
- error
- warn
- info
- debug
- trace(堆棧)
為什么要對日志進行分級呢?
將日志輸出到控制台,或者寫入到文件中,這些操作都會降低程序的運行效率。但由於開發需要、便於維護等原因,要將必要的日志信息記錄,這時就需要在代碼中加入記錄日志的相關語句。假設在開發調試程序時需要記錄日志信息,等到系統上線后這些信息就沒必要記錄了,此時需要將記錄日志信息相關代碼全部刪除,這個過程費時費力。
將日志信息進行分級管理之后,便可方便的控制信息輸出內容及輸出位置,哪些信息需要輸出,哪些信息不需要輸出,只需在一個日志控制文件中稍加修改即可,不用修改代碼中的內容。即在開發調試程序時,將日志信息級別設置低一些,這樣輸出的日志信息會非常多,當系統上線之后,將日志信息級別設置的高一些,此時只有少部分日志信息被記錄。
log4j
最終版本是log4j 1.2.17的版本
jar包下載 http://mirrors.tuna.tsinghua.edu.cn/apache/logging/log4j/1.2.17/log4j-1.2.17.zip
為了控制日志的輸出,在Log4j中提供了日志輸出控制文件,該文件主要由三個部分構成:
日志信息的輸出位置:控制日志信息將要輸出的位置,是控制台還是文件等。
日志信息的輸出格式:控制日志信息的顯示格式,即以怎樣的字符串形式顯示。
日志信息的輸出級別:控制日志信息的顯示內容,即顯示哪些級別的日志信息。
有了日志輸出控制文件,代碼中只要設置好日志信息內容及其級別即可,通過控制文件
便可控制這些日志信息的輸出了。
使用log4j記錄日志
-
導入jar包
-
放入日志輸出控制文件
在src目錄下創建log4j.properties文件,將下面內容拷貝到文件中保存。
log4j.rootLogger=info,console #控制台附加器 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n #文件附加器 log4j.appender.file = org.apache.log4j.FileAppender log4j.appender.file.File = f:/monkey1024/monkey.log log4j.appender.file.layout = org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n #滾動文件附加器 log4j.appender.rollfile = org.apache.log4j.RollingFileAppender log4j.appender.rollfile.File = f:/monkey1024/monkey.log log4j.appender.rollfile.MaxFileSize = 10KB log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
3.代碼中實現日志記錄
//創建記錄日志的對象
Logger log = Logger.getLogger(Log4jTest01.class);
//下面語句會根據log4j.properties中的日志級別輸出
log.debug("debug信息");
log.info("info信息");
log.warn("warn信息");
log.error("error信息");
上面代碼中的日志輸出語句,會根據 log4j.properties 文件中日志級別的設置進行輸出,會輸出到指定位置。 其輸出結果是:輸出指定級別及其更高級別的信息。如指定 info 級別,則會輸出 fatal、 error、warn、info 級別的信息。就本例而言,上面代碼不會執行 debug()方法。
log4j.properties文件分析
日志屬性文件 log4j.properties 是專門用於控制日志輸出的。其主要進行三方面控制:
- 輸出位置:控制日志將要輸出的位置,是控制台還是文件等
- 輸出布局:控制日志信息的顯示形式
- 輸出級別:控制要輸出的日志級別
日志屬性文件由下面兩個對象組成:
- 根日志,即為 Java 代碼中的日志記錄器,可以控制日志輸出級別與添加附加器
- 附加器,可以設置輸出布局、文件位置、文件大小等內容
定義日志附加器 appender
附加器的本質是一個接口,其定義語法為:
log4j.appender.appenderName = 輸出位置
appenderName 為自定義名稱。
輸出位置為log4j 指定的類型,是定義好的一些 appender 接口的實現類。打開 log4j解壓目錄下的 site文件夾下的 index.html,在打開的頁面中點擊 JavaDoc,即可可看到 log4j 的 API
在log4j.properties中編寫如下配置:
log4j.appender.console = org.apache.log4j.ConsoleAppender
該配置的appender名字為console,類型是org.apache.log4j.ConsoleAppender即將日志輸出到控制台。
常用的附加器實現類
- org.apache.log4j.ConsoleAppender:日志輸出到控制台
- org.apache.log4j.FileAppender:日志輸出到文件
- org.apache.log4j.RollingFileAppender:當日志文件大小到達指定尺寸的時候將產生一個新的日志文件
- org.apache.log4j.DailyRollingFileAppender:每天產生一個日志文件
通過上面附加器可以指定日志輸出的位置。
修飾日志附加器
修飾日志附加器,是為定義好的附加器添加一些屬性,以控制到指定位置的輸出。不同的附加器,其修飾屬性不同。
-
控制台附加器
log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%nTarget:控制輸出到控制台的使用目標。其值為 System.out 或 Sytem.err。它們的區別是,
System.out 是以黑色字體顯示到控制台,而 System.err 則是以紅色字體顯示。 -
文件附加器
log4j.appender.file = org.apache.log4j.FileAppender log4j.appender.file.File = f:/monkey1024/monkey.log log4j.appender.file.layout = org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%nlog4j.appender.file.File:日志要輸出的文件位置及文件名稱。
-
滾動文件附加器
log4j.appender.rollfile = org.apache.log4j.RollingFileAppender log4j.appender.rollfile.File = f:/monkey1024/monkey.log log4j.appender.rollfile.MaxFileSize = 10KB log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%nMaxFileSize:用於指定日志文件的最大值。若文件超過指定值,將自動產生另一個日志文件。
-
常用layout布局
在上面的配置文件中都出現了layout,該項可以配置日志的布局類型,常用的如下:
- org.apache.log4j.HTMLLayout:網頁布局,以 HTML 表格形式布局
- org.apache.log4j.SimpleLayout:簡單布局,包含日志信息的級別和信息字符串
- org.apache.log4j.PatternLayout:匹配器布局,可以靈活地指定布局模式。其主要是通過設置 PatternLayout 的 - --和 - ConversionPattern 屬性值來控制具體輸出格式的。ConversionPattern 的值中有很多控制字符,這些字符的意義可以百度:ConversionPattern取值說明。
-
配置根Logger
配置 rootLogger,以便於代碼加載來控制日志的輸出。其語法為:
log4j.rootLogger = [ level ] , appenderName1,appenderName2, …其中,level 是日志記錄的優先級,分為 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。建議只使用四個級別,優先級從高到低分別是 ERROR、WARN、INFO、DEBUG。OFF 為關閉日志功能。
低級別的可以顯示高級別的,但高級別的不能顯示低級別的。所以,級別越高,將來顯示的信息就越少。
例如:
log4j.rootLogger=info,console,file #控制台附加器 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n #文件附加器 log4j.appender.file = org.apache.log4j.FileAppender log4j.appender.file.File = f:/monkey1024/monkey.log log4j.appender.file.layout = org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
log4j2
下載jar包
http://logging.apache.org/log4j/2.x/download.html
導入
- log4j-api-2.9.1.jar
- log4j-core-2.9.1.jar
添加日志輸出控制文件
在log4j2中的配置文件是 XML 格式的文件,不再支持properties 文件。在src目錄下創建log4j2.xml文件,里面寫上下面內容。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<!-- console -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<!-- file -->
<File name="file" fileName="log/output.log" append="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>
<!-- rollingFile -->
<RollingFile name="roolingFlie" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<SizeBasedTriggeringPolicy size="1kb" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
編寫日志記錄代碼
導包的時候注意Logger 與 LogManager 都是 org.apache.logging.log4j 包中的類,而不是org.apache.log4j包中的。另外在創建記錄日志對象時,使用的是LogManager類
//創建記錄日志的對象
Logger log = LogManager.getLogger(Log4j2Test01.class);
//下面語句會根據log4j2.xml中的日志級別輸出
log.debug("debug信息");
log.info("info信息");
log.warn("warn信息");
log.error("error信息");
上面代碼會將info以上級別的日志信息輸出到控制台中。
日志輸出控制文件分析
若開發者沒有設置 log4j2.xml,則系統會使用默認的日志配置:只會輸出到控制台 error 級別的信息。
configuration標簽
configuration標簽的 status 屬性用於設置 Log4j2 自身運行的日志顯示級別,一般為OFF,不顯示,也可以設置為 ERROR、DEBUG 等其它級別。
Console標簽
Console標簽的 target 屬性用於設置輸出的目標形式,其值一般為:SYSTEM_OUT 或 SYSTEM_ERR
File標簽
File標簽的 fileName 屬性用於設置文件的文件保存路徑及文件名。如本例的意思是,日志文件名為 output.log,將其存放在當前項目的根目錄下的 log 子目錄中,如果log目錄不存在會自動創建。
append 屬性用於設置是否以追加方式將日志寫入文件中。
RollingFile標簽
fileName 指定存放目錄及第一個日志文件名。filePattern 指定新創建的日志文件的文件名。本例還會對文件進行壓縮。
SizeBasedTriggeringPolicy子標簽用於指定每一個日志文件最大文件大小。當達到這個指定值后,會自動再新建一個日志文件。
loggers標簽
用於配置根Logger 對象,用來指定所使用的日志記錄器,及顯示的級別。
其子標簽root用於指定所使用的日志記錄器。該子標簽的屬性 level 用於指定顯示級別,主要是通過root的子標簽appender-ref來引用appenders中定義好的記錄器。
需要注意的是,只要在appenders中定義了File、 RollingFile等,且在其中指定了日志存放的目錄,無論是否在appender-ref中引用,這些目錄都會自動創建。
日志規范slf4j
將log4j改成slf4j
-
導入相關jar包
-
log4j-1.2.17.jar
http://mirrors.tuna.tsinghua.edu.cn/apache/logging/log4j/1.2.17/log4j-1.2.17.zip -
slf4j-api-1.7.25.jar(核心包)
-
slf4j-log4j12-1.7.25.jar(連接slf4j和log4j的包,將來切換到其他日志庫時,只需更換該jar包)
-
-
加入日志輸出控制文件log4j.properties文件
將之前寫的配置文件拷貝過來即可
-
代碼中實現日志記錄
通過LoggerFactory獲取創建記錄的日志對象,導包時需要導入org.slf4j下的類
//創建記錄日志的對象 Logger log = LoggerFactory.getLogger(Slf4jTest01.class); log.debug("debug信息"); log.info("info信息"); log.warn("warn信息"); log.error("error信息");
將log4j2改成slf4j
在slf4j的1.7.25(含)版本之前,沒有提供log4j2相關的jar,不過在log4j2中提供了相關的jar包。
-
導入相關jar包
-
log4j-api-2.9.1.jar
-
log4j-core-2.9.1.jar
-
log4j-slf4j-impl-2.9.1.jar
http://logging.apache.org/log4j/2.x/download.html
注意在導入時不能同時導入log4j-slf4j-impl-2.9.1.jar和log4j-to-slf4j-2.9.1.jar
-
slf4j-api-1.7.25.jar
-
-
添加日志輸出控制文件log4j2.xml
將之前寫過的拷貝過來 -
編寫日志記錄代碼
通過LoggerFactory獲取創建記錄的日志對象,導包時需要導入org.slf4j下的類//創建記錄日志的對象 Logger log = LoggerFactory.getLogger(Slf4jTest02.class); log.debug("debug信息"); log.info("info信息"); log.warn("warn信息"); log.error("error信息");
logback
logback是log4j作者的開發的又一個記錄日志的開源技術,相比於log4j而言,logback在很多方面都有很大的提升。logback分為三個模塊:logback-core, logback-classic和logback-access。其中 logback-core是另外兩個的基礎模塊,logback-classic是log4j的升級版本,同時也實現了SLF4j的API,因此可以方便的使用SLF4j,還有一點要說的就是SLF4j和logback的作者是同一個人,所以說logback是原生的實現了SLF4j。logback-access集成了一些servlet容器,比如tomcat
-
下載jar包
https://logback.qos.ch/download.html
下載完畢解壓后,需要將下面三個jar包導入到項目中:
- logback-access-1.2.3.jar
- logback-classic-1.2.3.jar
- logback-core-1.2.3.jar
如果要是用slf4j的話需要下載slf4j的jar包,因為slf4j和logback無縫集成,所以這里不用下載slf4j連接logback的jar包了。
-
添加日志輸出控制文件
在src目錄下創建一個logback.xml文件,里面寫上下面內容:
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>file.log</file> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n </pattern> </encoder> </appender> <appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>mylog.txt</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- rollover daily --> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> <!-- 每個日志文件大小不超過100MB,在日志文件總大小不超過20GB的情況下保存60天, --> <maxFileSize>100MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> -
編寫日志記錄代碼
因為logback原生就實現了SLF4j的API,所以這里使用SLF4j。
// 創建記錄日志的對象 Logger log = LoggerFactory.getLogger(Slf4jTest01.class); log.debug("debug信息"); log.info("info信息"); log.warn("warn信息"); log.error("error信息");
日志輸出控制文件分析
configuration
scan=”true”表示logback會自動加載修改后的xml配置文件,默認情況下,每隔一分鍾掃描一次,可以通過scanPeriod=”3 seconds”設置為每3秒掃描一次。
DEBUG=”true”該配置並不是設置日志級別為debug,而是會打印logback內部運行的一些信息,可以查看logback的運行狀態,默認是false。
statusListener
可以通過設置監聽器來監聽logback內部運行的信息和狀態。
appender
可以編寫多個appender來實現不同的日志輸出方式。
其中name屬性用於指定appender的名稱,即給appender命名
class屬性用於指定日志的輸出方式。
- ch.qos.logback.core.ConsoleAppender:將日志信息輸出到控制台
- ch.qos.logback.core.FileAppender:日志輸出到文件
- ch.qos.logback.core.rolling.RollingFileAppender:當日志文件大小到達指定尺寸的時候將產生一個新的日志文件。
encoder
在logback0.9.19版本中引入了encoder來替代layout。該標簽默認使用PatternLayoutEncoder,其中pattern標簽可以設置日志的輸出格式。
file
該標簽在appender標簽下,用於指定輸出日志的文件名。
append
該標簽在appender標簽下,是否以追加的方式寫出到日志文件中。
rollingPolicy
該標簽在appender標簽下,用來指定產生新文件的方式。
常用的有SizeAndTimeBasedRollingPolicy(根據日期和文件大小產生新的文件)和FixedWindowRollingPolicy(根據文件大小產生新的文件)
maxFileSize
該標簽在rollingPolicy下,當文件大小超過該標簽中指定的大小時會創建新的文件,例如:5kb,5MB,5GB,默認單位是字節b,如果只寫500的話,則表示500b
maxHistory
該標簽在rollingPolicy下,用來指定日志保存的天數。
totalSizeCap
該標簽在rollingPolicy下,保存日志的總大小,通常寫在maxHistory的后面。
level
該標簽在root下,用來表示日志的打印級別
appender-ref
該標簽在root下,用來添加appender。
