Java日誌學習
日誌問題總會讓一些小司機們在專案中吃了大虧,剛吃了個大虧,記錄一下促進。
當前的日誌框架有 jdk 自帶的 logging,log4j1、log4j2、logback ,這些框架都自己定製了日誌 API ,並且有相應的實現。本篇主要介log4j與slf4j配合使用。
1、新建Maven工程,配置log4j日誌
1.1 pom檔案引入log4j jar包
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
1.2 新增log4j.properties檔案,內容如下:
#總局控制日誌級別為debug ,指定控制檯輸出和檔案輸出。 log4j.rootLogger=debug,CONSOLE,INFOFILE log4j.additivity.org.apache=false # CONSOLE org.apache.log4j.ConsoleAppender:控制檯輸出 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender # 日誌級別 log4j.appender.CONSOLE.Threshold=debug #直接輸出,不進行快取 log4j.appender.CONSOLE.ImmediateFlush=true 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,SSS} (%F:%L) - %m%n # File log4j.appender.INFOFILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.INFOFILE.Threshold=INFO log4j.appender.INFOFILE.ImmediateFlush=true #預設為true,新增到末尾,false在每次啟動時進行覆蓋 log4j.appender.INFOFILE.Append=true log4j.appender.INFOFILE.File=D:\\logs\\info.log log4j.appender.INFOFILE.Encoding=UTF-8 #檔名稱的格式 log4j.appender.INFOFILE.DatePattern='.'yyyy-MM-dd'.log' #日誌輸出格式 log4j.appender.INFOFILE.layout=org.apache.log4j.PatternLayout log4j.appender.INFOFILE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %C.%M(%F:%L) - %m%n
2、配置項詳解:
2.1 Logger日誌的7個級別(優先順序從高到低):
OFF-關閉所有日誌;
FATAL-記錄嚴重的錯誤,並且會導致應用程式退出;
ERROR-記錄嚴重的錯誤,但不會影響程式的執行;
WARN-記錄警告;
INFO-記錄程式中比較有意義的資訊;
DEBUG-記錄程式中的細節資訊;
ALL-記錄所有的日誌;
2.2 log4j.additivity.org.apache:
子Logger 是否繼承 父Logger 的 輸出源(appender) 的標誌位。具體說,預設情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裡輸出。若是additivity設為false,則子Logger只會在自己的appender裡輸出,而不會在父Logger的appender裡輸出。
2.3 輸出日誌Appender選項:
org.apache.log4j.ConsoleAppender 控制檯
org.apache.log4j.FileAppender 輸出到檔案
org.apache.log4j.RollingFileAppender 輸出到滾動檔案
org.apache.log4j.DailyRollingFileAppender 定期回滾日誌檔案
org.apache.log4j.net.SMTPAppender 傳送日誌到指定郵件
org.apache.log4j.jdbc.JDBCAppender 傳送到資料庫
2.4 日誌的輸出格式:
org.apache.log4j.HTMLLayout 以HTML表格形式佈局
org.apache.log4j.PatternLayout 可以靈活地指定佈局模式
org.apache.log4j.SimpleLayout 包含日誌資訊的級別和資訊字串
org.apache.log4j.TTCCLayout 包含日誌產生的時間、執行緒、類別等等資訊
2.5 log4j.appender.console.layout.ConversionPattern詳解:
%m 輸出程式碼中指定的訊息
%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的執行緒名
%n 輸出一個回車換行符,Windows平臺為“/r/n”,Unix平臺為“/n”
%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss ,SSS},輸出類似:2002年10月18日 22 : 10 : 28 , 921
%l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10 )3、新建 LogTest 如下:
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class LogTest {
static{
PropertyConfigurator.configure("src/main/resources/log4j.properties");
}
private static Logger LOGGER = Logger.getLogger(LogTest1.class);
public static void main(String[] args) {
LOGGER.debug("debug....");
LOGGER.info("info....");
LOGGER.warn("warn.....");
LOGGER.error("error....");
for (int i = 0; i < 50; i++) {
LOGGER.error("error...."+i);
}
}
}
觀察控制檯和檔案輸出。發現總局日誌級別與子Logger日誌級別的配合。
4,配合Spring使用
4.1 在pom檔案中引入 spring相關jar包
<!-- spring begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<!-- spring end -->
4.1 新增 applicationContext.xml; spring-mvc.xml檔案
4.2 配置web.xml引入log4j.xml
<!--springframework 的ContextLoaderListener使用的配置檔案 開始 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--springframework 的ContextLoaderListener使用的配置檔案 結束 -->
<!--springframework 的Log4jConfigListener使用的配置檔案 開始 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!--springframework 的Log4jConfigListener使用的配置檔案 結束 -->
<!-- springmvc控制器 配置開始 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- springmvc控制器 配置開始 -->
4.5 啟動tomcat即可
5、引入 slf4j
簡單日記門面(simple loggingFacade for Java)SLF4J是為各種loging APIs提供一個簡單統一的介面,用來服務於各種各樣的日誌框架, 單獨的slf4j是不能工作的,必須帶上其他具體的日誌實現方案. SLF4J就類似於JDBC訪問資料庫介面一樣,它只是介面,真正的實現是由其它框架元件提供的。使用者能夠在部署的時候配置自己希
望的loging APIs實現。
準確的說,slf4j並不是一種具體的日誌系統,而是一個使用者日誌系統的facade,允許使用者在部署最終應用時方便的變更其日誌系統。
如果在工程中要使用slf4j作為介面,並且要用log4j作為具體實現方案,那麼我們需要做的事情如下:(下面的xxx表示具體版本號)
將slf4j-api-xxx.jar加入工程classpath中;
將slf4j-log4jxx-xxx.jar加入工程classpath中;
將log4j-xxx.jar加入工程classpath中;
將log4j.properties(log4j.xml)檔案加入工程classpath中。
5.1 引入slf4j-api 和 配合log4j使用的jar包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
5.2 程式碼使用
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest1 {
static{
PropertyConfigurator.configure("src/main/resources/log4j.properties");
}
// org.slf4j.Logger
private static Logger LOGGER = LoggerFactory.getLogger(LogTest1.class);
public static void main(String[] args) {
LOGGER.debug("debug....");
LOGGER.info("info....");
LOGGER.warn("warn.....");
LOGGER.error("error....");
for (int i = 0; i < 50; i++) {
// 可用 {} 佔位符
LOGGER.error("error.... {} ",i);
}
}
}
參考部落格點選開啟連結,介紹了工作原理。