NO IMAGE

原創文章,歡迎轉載!轉載時務必保留:作者:jmppok ;出處http://blog.csdn.net/jmppok/article/details/44828335 .

大家在專案中經常會用到Log4j,一般包括4個步驟:

1.編寫log4j配置檔案;

2.初始化log4j;

3.獲取一個logger例項;

4.呼叫logger.debug() 等記錄日誌。

為了能詳細控制每個包和類的日誌輸出,一般在每個類中都需要定一個logger例項,類似下面這樣:

public class ContextFactory {
private static final Logger      s_logger = Logger.getLogger(ContextFactory.class);
public void test() {
s_logger.debug("this is debug.");
}
}

無形中給使用帶來了不便。

為了解決這個問題,本人對Log4j進行了一個簡單的封裝LogHelper.java:

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class LogHelper {
static {
DOMConfigurator.configure("./config/log4j.xml");
}
public static void info(Object msg) {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Logger logger = Logger.getLogger(stack[1].getClassName());
logger.log(LogHelper.class.getName(), Level.INFO, msg, null);
}
public static void error(Object msg) {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Logger logger = Logger.getLogger(stack[1].getClassName());
logger.log(LogHelper.class.getName(), Level.ERROR, msg, null);
}
public static void debug(Object msg) {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Logger logger = Logger.getLogger(stack[1].getClassName());
logger.log(LogHelper.class.getName(), Level.DEBUG, msg, null);
}
public static void warn(Object msg) {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Logger logger = Logger.getLogger(stack[1].getClassName());
logger.log(LogHelper.class.getName(), Level.WARN, msg, null);
}
public static void exception(Exception e) {
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Logger logger = Logger.getLogger(stack[1].getClassName());
logger.log(LogHelper.class.getName(), Level.ERROR, ExceptionUtil.toString(e), null);
}
}

使用時,不需要在每個類中定義logger,而是直接呼叫LogHelper.debug(msg)就可以了。方便了大家的使用。

而在LogHelper.debug()中封裝了獲取logger物件及獲取呼叫者位置等步驟。

最後附上一個log4j.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="debug" />
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyy-M-dd HH:mm:ss}] %-5p: %c - %m (%F:%L)%n" />
</layout>
</appender>
<!-- 伺服器主日誌檔案 -->
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Threshold" value="debug" />
<!-- The active file to log to -->
<param name="file" value="logs/asynctask.log" />
<param name="Append" value="false" /><!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->
<param name="append" value="true" />
<param name="encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The log message pattern -->
<param name="ConversionPattern" value="[%d{yyy-M-dd HH:mm:ss}] %-5p: %c - %m (%F:%L)%n" />
</layout>
</appender>
<!-- Application Loggers -->
<span style="color:#FF0000;"><strong><logger name="com.lenovo">
<level value="debug" />
</logger></strong></span>
<strong><span style="color:#FF0000;"><logger name="org.apache">
<level value="warn" />
</logger></span></strong>
<!-- Root Logger -->
<span style="color:#FF0000;"><strong><root>
<priority value="debug" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root></strong></span>
</log4j:configuration>

解釋:
1. com.lenovo下的log 顯示debug資訊。當然也可控制到具體的類。

2. org.apache下的log顯示warn資訊。

3. root顯示debug資訊,記錄到控制檯和檔案。

4.配置是有順序的,雖然root是debug級別,但在他之前定義了org.apache是warn級別,所以org.apache只會輸出warn級別的log。