log4j如何根據(jù)變量動(dòng)態(tài)生成文件名
根據(jù)變量動(dòng)態(tài)生成文件名
簡(jiǎn)單的log4j設(shè)置
一般情況下,log4j配置文件簡(jiǎn)單的設(shè)置為:
log4j.rootLogger=debug,stdout,R
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=test.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.DatePattern = '.'yyyy-MM-dd
log4j.appender.R.layout=ex.log4j.ExPatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c %5p - %m%n
log4j.appender.R.MaxBackupIndex=1
簡(jiǎn)單實(shí)例
java代碼如下:
public class LogTest {
static Logger log = Logger.getLogger(LogTest.class);
public static void main(String[] args) throws IOException {
PropertyConfigurator.configure("log4j.properties");
log.debug("helo");
}
}
一般如上設(shè)置即可滿(mǎn)足簡(jiǎn)單的log4j需求。
如果需要根據(jù)程序中的變量,將日志打到不同的文件中時(shí),(如:根據(jù)某個(gè)ID,這樣對(duì)于大量日志時(shí)更加容易查找到想要的日志)
只需在java代碼中過(guò)去到所配置的FileAppender,然后serFile來(lái)修改文件名。
java代碼如下:
FileAppender appender = (FileAppender) log.getRootLogger().getAppender("R");
appender.setFile(filePath/fileName);
appender.activateOptions();
日志打印前,設(shè)置以上代碼,即可。
注意:加上 appender.activateOptions(); 可以使得后面打印的日志不會(huì)將之前的日志覆蓋。
log4j動(dòng)態(tài)文件名
在項(xiàng)目中,對(duì)log的輸出有多種多樣的要求,下面具體分析一下動(dòng)態(tài)log文件名輸出的。
一、按照用戶(hù)ID來(lái)生成log
這種情況,可以根據(jù)每個(gè)用戶(hù)ID來(lái)動(dòng)態(tài)生成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
// 如果已經(jīng)有了一個(gè)Logger實(shí)例返回現(xiàn)有的
Logger logger = Logger.getLogger(name);
// 清空Appender。特別是不想使用現(xiàn)存實(shí)例時(shí)一定要初期化
logger.removeAllAppenders();
// 設(shè)定Logger級(jí)別。
logger.setLevel(Level.DEBUG);
// 設(shè)定是否繼承父Logger。
// 默認(rèn)為true。繼承root輸出。
// 設(shè)定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輸出路徑
// 這里使用了環(huán)境變量[catalina.home],只有在tomcat環(huán)境下才可以取到
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);
// 適用當(dāng)前配置
appender.activateOptions();
// 將新的Appender加到Logger中
logger.addAppender(appender);
return logger;
}
}
二、在batch程序中,通過(guò)一個(gè)設(shè)定來(lái)實(shí)現(xiàn)每個(gè)batch
文件名不同的設(shè)定。
log.xml定義
<appender name="daily" class="org.apache.log4j.DailyRollingFileAppender">
<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可以接受自定義環(huán)境變量,注意下面行【${tuhan.crm.log.name}】就是自定義環(huán)境變量
<param name="file" value="/opt/tuhan.crm/batch/log/${tuhan.crm.log.name}.log" />
那么環(huán)境變量如何設(shè)置呢,有2種方法
1.Java中設(shè)定(在使用配置文件之前, 要在程序中聲明這些變量):
System.setProperty("tuhan.crm.log.name", "batch001");
2.在JVM設(shè)定
java -Xmx512M -Dtuhan.crm.log.name=batch001 com.stu.TestBatch001
三、在batch程序中,通過(guò)多個(gè)設(shè)定來(lái)實(shí)現(xiàn)每個(gè)batch
文件名不同的設(shè)定。
動(dòng)態(tài)的配置文件路徑: (log4j可以接受URL)
java.net.URL URL = consandpatt.class.getResource("/com/test/java/log/config/log4jConfig.properties");
PropertyConfigurator.configure(URL);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring?boot集成redisson的最佳實(shí)踐示例
這篇文章主要為大家介紹了spring?boot集成redisson的最佳實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java遍歷Properties所有元素的方法實(shí)例
這篇文章主要介紹了Java如何遍歷Properties所有元素的方法,大家可以參考使用2013-11-11
java.lang.OutOfMemoryError 錯(cuò)誤整理及解決辦法
這篇文章主要介紹了java.lang.OutOfMemoryError 錯(cuò)誤整理及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-10-10
Java對(duì)時(shí)間的簡(jiǎn)單操作實(shí)例
這篇文章主要介紹了Java對(duì)時(shí)間的簡(jiǎn)單操作,實(shí)例分析了針對(duì)java.util.Date的各類(lèi)常見(jiàn)操作,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
AbstractProcessor擴(kuò)展MapStruct自動(dòng)生成實(shí)體映射工具類(lèi)
這篇文章主要為大家介紹了AbstractProcessor擴(kuò)展MapStruct自動(dòng)生成實(shí)體映射工具類(lèi)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
MybatisPlus中插入數(shù)據(jù)后獲取該對(duì)象主鍵值的實(shí)現(xiàn)
這篇文章主要介紹了MybatisPlus中插入數(shù)據(jù)后獲取該對(duì)象主鍵值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java實(shí)現(xiàn)十六進(jìn)制字符unicode與中英文轉(zhuǎn)換示例
當(dāng)需要對(duì)一個(gè)unicode十六進(jìn)制字符串進(jìn)行編碼時(shí),首先做的應(yīng)該是確認(rèn)字符集編碼格式,在無(wú)法快速獲知的情況下,通過(guò)一下的str4all方法可以達(dá)到這一目的2014-02-02

