作者:13
GitHub:https://github.com/ZHENFENG13
版權聲明:本文為原創文章,未經允許不得轉載。
前言
上一篇文章主要講述了一下syso和Log間的一些區別與比較,重點是在項目的日志功能上,因此,承接前文《[Spring+SpringMVC+MyBatis+easyUI整合優化篇(一)System.out.print與Log](http://www.cnblogs.com/han-1034683568/p/6637914.html)》,本文是一個較為直觀的日志功能案例,java的日志框架很多,如Log4j、Log4j2、logback、SLF4J,篇幅有限,所以本篇只介紹一下Log4j,並將其整合到項目中,對於其他日志框架,想了解的可以對應的去學習一下。Log4j簡介
日志記錄功能是一個項目中重要的組成部分,log4j是APache下的一個開源日志組件,為java開發者提供了很大的便利。
Log4j由三個重要的組件構成:
- Loggers,日志信息的優先級
日志信息的優先級從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日志信息的重要程度,設置為高級別的優先級時,低優先級的日志將不會輸出,比如將日志級別設置為INFO,則DEBUG級別的目錄不會被記錄,為了防止日志輸出泛濫,最好不要將日志級別設置太低,一般為INFO即可。
- Appenders,日志信息的輸出目的地
日志信息的輸出目的地指定了日志將打印到控制台還是文件中,參數如下:
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件,本文中的案例選擇的策略)
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件,也是一個不錯的選擇)
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
- Layouts,日志信息的輸出格式
輸出格式的功能是控制日志信息的顯示內容,參數如下:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以靈活地指定布局模式,本案例所選擇的策略,需對日志格式進行設置)
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串)
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
log4j簡單demo
下面是一個簡單的案例,並與System.out.print進行比較,代碼在github上,可以下載自己運行一下。
日志輸出:
import org.apache.log4j.Logger;
public class LogTest {
static Logger log = Logger.getLogger(LogTest.class);//獲取日志記錄器
public static void main(String... arg0) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
log.info("log輸出" + i);
}
long time = System.currentTimeMillis() - start;
log.info("所用時間" + time);
}
}
syso輸出:
public class SysoTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
System.out.println("syso打印" + i);
}
long time = System.currentTimeMillis() - start;
System.out.println("所用時間" +time);
}
}
Log4j配置文件如下:
log4j.rootLogger=DEBUG, debug
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.debug.datePattern='.'yyyy-MM-dd
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.append=true
log4j.appender.debug.File=./logs/ssm-maven/debug.log
此配置文件為log4j-test.properties,也會上傳到倉庫中,注意:在測試本例時,需將此文件名改為log4j.properties
運行后可得到如下結果,在項目logs目錄下創建了debug.log文件夾並將輸出寫入到文件中。
log4j整合並設置分包的日志策略
上面只是一個簡單的demo,重要的還是要將日志功能集成到項目中來。
配置文件及講解如下:
#log4j.rootLogger = [level],appenderName,appenderName2,...
#level是日志記錄的優先級,分為OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
##Log4j建議只使用四個級別,優先級從低到高分別是DEBUG,INFO,WARN,ERROR
#通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關
#比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來
log4j.rootLogger=DEBUG, debug
#Log4j針對不同包指定level:
#一般在生產環境中應用系統,日志級別調整為INFO以避免過多的輸出日志。
#但某些時候,需要跟蹤具體問題,那么就得打開DEBUG日志。
#但是如果打開log4j.rootLogger,則需要的信息就會淹沒在日志的海洋中。
#此時,需要單獨指定某個或者某些Logger的日志級別為DEBUG,而rootLogger保持INFO不變。
#參考配置如下(指定com.ssm.maven.core.admin類的日志輸出)
#分包設置,admin與service包中的日志輸出分離
log4j.logger.com.ssm.maven.core.admin=INFO,admin
log4j.logger.com.ssm.maven.core.service=INFO,service
log4j.logger.org.springframework=OFF
log4j.logger.org.mybatis.spring=ON
log4j.logger.org.springframework.context.annotation=OFF
log4j.appender.admin=org.apache.log4j.DailyRollingFileAppender
log4j.appender.admin.layout=org.apache.log4j.PatternLayout
log4j.appender.admin.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.admin.datePattern='.'yyyy-MM-dd
log4j.appender.admin.Threshold = INFO
log4j.appender.admin.append=true
#admin包下的日志輸出到admin.log文件中
log4j.appender.admin.File=${catalina.home}/logs/ssm-maven/admin.log
log4j.appender.service=org.apache.log4j.DailyRollingFileAppender
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.service.datePattern='.'yyyy-MM-dd
log4j.appender.service.Threshold = INFO
log4j.appender.service.append=true
#admin包下的日志輸出到service.log文件中
log4j.appender.service.File=${catalina.home}/logs/ssm-maven/service.log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.debug.datePattern='.'yyyy-MM-dd
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.append=true
log4j.appender.debug.File=${catalina.home}/logs/ssm-maven/debug.log
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
部署到tomcat服務器,並訪問相關頁面后,可以到tomcat目錄的logs目錄下查看日志輸出文件:
查看日志文件,可以得到日志已經分包輸出的結果。
結語
其實無論是System.out或者Log,我們都是希望快速的定位問題,至於更多的使用System.out而不是Log的原因,其實也多是因為覺得System.out更方便,或者不會用Log亦或者是覺得Log不夠靈活,而通過本文中的案例,加上你自己的動手實踐,應該可以讓你對於Log4j技能從不會到會了,也能讓你對於Log4j的靈活性有些認識了。我的GitHub地址:https://github.com/ZHENFENG13/ssm-demo
其中ssm-maven是本次代碼更新的目錄。
ssm-maven項目的演示地址