Bit*_*ttu 21 log4j dynamic-data
我正在使用log4j来记录信息.我使用了一个log4j.xml
文件来创建日志文件.我已将每个日志文件的绝对路径作为param
标记值.
例如:
<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="'_'yyyyMMdd"/>
<param name="File" value="D:/logFiles/GPreprocessor.log"/>
<layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>
Run Code Online (Sandbox Code Playgroud)
我不想直接写"GPreprocessor.log".实际上,根据我的项目名称,该文件名是动态的.例如,如果我运行程序ABC.java,则应该进行日志记录D:/logFiles/ABC.log
,但是如果我运行XYZ.java,则应该进行日志记录D:/logFiles/XYZ.log
.文件的位置将始终保持不变:D:/logFiles/
.如何动态更改日志文件的名称?
小智 80
这样做要容易得多:
在log4j.xml中将变量定义为$ {variable}:
<appender name="FILE" class="org.apache.log4j.FileAppender">
<param name="File" value="${logfilename}.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d::[%t]::%-5p::%c::%x - %m%n" />
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud)
然后确保在启动JVM时设置系统属性,例如:
java -Dlogfilename=my_fancy_filename example.Application
Run Code Online (Sandbox Code Playgroud)
这将创建一个动态日志文件名: my_fancy_filename.log
或者,您可以在创建记录器之前在代码中设置系统属性(如果您希望在日志中使用PID,这很有用).如:
System.setProperty("logfilename", "a_cool_logname");
Run Code Online (Sandbox Code Playgroud)
一旦设置完毕,您就可以继续正常运行记录器,并且会记录到动态文件(请注意那些在主方法执行之前创建记录器的静态记录器).
下面是我使用Log4J动态生成文件名的代码.它根据输入文件名和当前日期时间更改其名称.(如果您多次运行相同的文件,那么非常有帮助.)
public class LogClass {
private static Logger log = Logger.getLogger(LogClass.class);
private static boolean initializationFlag = false;
private static String fileName;
private static void intializeLogger(){
log.setLevel(Level.DEBUG);
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date date = new Date();
RollingFileAppender appender = new RollingFileAppender();
appender.setAppend(true);
appender.setMaxFileSize("1MB");
appender.setMaxBackupIndex(1);
appender.setFile(fileName + "_" + dateFormat.format(date) + ".log");
PatternLayout layOut = new PatternLayout();
layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n");
appender.setLayout(layOut);
log.addAppender(appender);
}
public static Logger getLogger(){
if(initializationFlag == false){
intializeLogger();
initializationFlag = true;
return LogClass.log;
}
else{
return LogClass.log;
}
}
public static void setFileName(String fileName){
LogClass.fileName = fileName;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,只要您想在程序中使用logger,只需写下以下两行:
LogClass.setFileName(yourFileName);
LogClass.getLogger().debug("hello!!");
Run Code Online (Sandbox Code Playgroud)
快乐的编码.