蓋大型系統時,為了要能夠在日後系統上線試運的時候可以有系統地抓到潛在的Bug,就可以使用Log4J、Slf4j等相關框架來實現自動的除錯日誌。
要取得Log4J可以用Maven配置 :
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
或是直接下載Jar配置也可以。
Log4J的日誌等級有五種(DEBUG, INFO, WARN, ERROR, FATAL),我把這五種等級看作嚴重性的表示,當設定為WARN時,就會輸出WARN~ FATAL的訊息.而DEBUG和 INFO就會被忽略不輸出.而語法:
log4j.rootLogger=WARN
類似這種設定的資料為了方便操作,所以一般都會集中到Log4J的設定檔裡面.設定檔的位置放在專案的根目錄,並命名為log4j.properties。
接著,在程式碼中需要被日誌紀錄的地方使用
private static Logger log= Logger.getLogger(MainTest.class);//記得把MainTest換成該類別的名稱
log.debug("Debug");//把這行放置在可能出錯需要被記錄的位置 例如try catch 的 catch裡面
另外,日誌不但可以直接輸出成檔案
log4j.appender.file=org.apache.log4j.RollingFileAppender
也可以輸出到資料庫裡存放
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
這裡示範一個完整範例如下:
pom.xml的部份:
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>Log4JTry</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
</project>
Java的部份MainTest.java:
Java
package com.mycompany.log4jtry;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.xml.DOMConfigurator;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class MainTest
{
private static Logger log= Logger.getLogger(MainTest.class);
public static void main(String[] args) throws InterruptedException
{
String log4jConfPath = "log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
log.debug("Debug");
log.info("Info");
Thread.sleep(2000);
}
}
log4j.properties 的設定檔
log4j.rootLogger = DEBUG, DB
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.URL=jdbc:mysql://localhost/資料庫名稱
log4j.appender.DB.driver=com.mysql.jdbc.Driver
log4j.appender.DB.user=[資料庫帳號]
log4j.appender.DB.password=[資料庫密碼]
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')
log4j.appender.DB.layout=org.apache.log4j.PatternLayout
以及 SQL 建表的部分:
CREATE TABLE LOGS (
USER_ID VARCHAR (20) NOT NULL,
DATED DATE NOT NULL,
LOGGER VARCHAR (50) NOT NULL,
LEVEL VARCHAR (10) NOT NULL,
MESSAGE VARCHAR (1000) NOT NULL
);

本文允許重製、散布、傳輸以及修改,但不得為商業目的之使用
使用時必須註明出處自:楊明翰 , 台灣人工智慧與資料科學研究室 https://aistudio.tw