在項目中,對log的輸出有多種多樣的要求,下面具體分析一下動態log文件名輸出的。
一,按照用戶ID來生成log,這種情況,可以根據每個用戶ID來動態生成logger。
代碼如下:
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
public class LoggerUtil {
public static Logger getLoggerByName(String name) {
// 生成新的Logger
// 如果已經有了一個Logger實例返回現有的
Logger logger = Logger.getLogger(name);
// 清空Appender。特別是不想使用現存實例時一定要初期化
logger.removeAllAppenders();
// 設定Logger級別。
logger.setLevel(Level.DEBUG);
// 設定是否繼承父Logger。
// 默認為true。繼承root輸出。
// 設定false後將不輸出root。
logger.setAdditivity(true);
// 生成新的Appender
FileAppender appender = new RollingFileAppender();
PatternLayout layout = new PatternLayout();
// log的輸出形式
String conversionPattern = "[%d] %p %t %c - %m%n";
layout.setConversionPattern(conversionPattern);
appender.setLayout(layout);
// log輸出路徑
// 這里使用了環境變量[catalina.home],只有在tomcat環境下才可以取到
String tomcatPath = java.lang.System.getProperty("catalina.home");
appender.setFile(tomcatPath + "/logs/" + name + ".log");
// log的文字碼
appender.setEncoding("UTF-8");
// true:在已存在log文件后面追加 false:新log覆蓋以前的log
appender.setAppend(true);
// 適用當前配置
appender.activateOptions();
// 將新的Appender加到Logger中
logger.addAppender(appender);
return logger;
}
}
二,在batch程序中,通過一個設定來實現每個batch,文件名不同的設定。
log.xml定義
<param name="file" value="/opt/tuhan.crm/batch/log/${tuhan.crm.log.name}.log" />
<param name="threshold" value="debug"/>
<param name="DatePattern" value="yyyyMMdd"/>
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MMM-dd HH:mm:ss,SSS}\t[%-5p]\t(%c:%L)\t%m%n"/>
</layout>
</appender>
log4j可以接受自定義環境變量,注意下面行【${tuhan.crm.log.name}】就是自定義環境變量
那么環境變量如何設置呢,有2種方法
1.Java中設定(在使用配置文件之前, 要在程序中聲明這些變量):
2.在JVM設定
三,在batch程序中,通過多個設定來實現每個batch,文件名不同的設定。
動態的配置文件路徑: (log4j可以接受URL)
PropertyConfigurator.configure(URL);