Java RollingFileAppender以编程方式设置RollingPolicy
由于不想深入讨论的原因,我被迫以编程方式配置log4j appender 我想使用RollingFileAppender,以便控制保留的最大文件数 我还想将这个appender设置为使用TimeBasedRollingPolicy,因为它将自动处理压缩卷文件的工作 问题是我找不到通过代码设置的方法。通常通过属性文件设置RollingFileAppender时,您会:Java RollingFileAppender以编程方式设置RollingPolicy,java,log4j,Java,Log4j,由于不想深入讨论的原因,我被迫以编程方式配置log4j appender 我想使用RollingFileAppender,以便控制保留的最大文件数 我还想将这个appender设置为使用TimeBasedRollingPolicy,因为它将自动处理压缩卷文件的工作 问题是我找不到通过代码设置的方法。通常通过属性文件设置RollingFileAppender时,您会: log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.Tim
log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
一定有办法设置这个?任何人都可以解释一下,深入研究javadoc和类方法的基本eclipse反射并没有揭示解决方案:(您可能需要log4j同伴/extras来使用rolling.RollingFileAppender 编辑: 下面是api参考,用于设置滚动策略
我最近不得不这么做。这不使用RollingFileAppender,但我想你会明白的
public synchronized static MNLogger getLogger() {
if (logInstance != null) return logInstance;
Layout layout = new PatternLayout("%d{ABSOLUTE} [%t] %c{1} %m%n");
Logger logger=Logger.getLogger(MigrationLogger.class);
Appender a=logger.getAppender("MigrationMemory");
if (a ==null) {
//log4j.appender.M=org.apache.log4j.MemoryAppender
MemoryAppender m=new MemoryAppender();
m.setLayout(layout);
m.setName("MigrationMemory");
logger.addAppender(m);
}
a=logger.getAppender("MigrationDisk");
if (a ==null) {
String tomcat=null;
try {
tomcat=JSPLogger.getTomcatPath();
} catch(Exception e) {
try {
tomcat=JSPLogger.getTempDir();
} catch (IOException e1) {
/* swallow*/
}
}
String filename=tomcat+File.separator+"logs"+File.separator+"Migration.log";
try {
FileAppender f =new FileAppender(layout,filename,true);
f.setName("MigrationDisk");
logger.addAppender(f);
} catch (IOException e) {
/* swallow */
}
// ConsoleAppender c=new ConsoleAppender(layout);
// logger.addAppender(c);
}
logger.setLevel(Level.ALL);
logInstance=new LoggerWrap(logger);
return logInstance;
}
下面是我如何重写log4j.xml文件,为名为“TheLoggerName”的记录器设置一个新文件名,该记录器的RollingFileAppender名为“TheAppenderName”
import org.apache.log4j.Logger;
import org.apache.log4j.rolling.RollingFileAppender;
import org.apache.log4j.rolling.TimeBasedRollingPolicy;
...
private static void afunction(String pTheNewFileName) {
Logger logger = Logger.getLogger("TheLoggerName");
RollingFileAppender rfappender = (RollingFileAppender) logger.getAppender("TheAppenderName");
TimeBasedRollingPolicy timeBasedRollingPolicy = (TimeBasedRollingPolicy) rfappender.getRollingPolicy();
timeBasedRollingPolicy.setFileNamePattern("newfilename%d{yyyy-MM}");
timeBasedRollingPolicy.activateOptions();
rfappender.activateOptions();
}
此示例将为每分钟创建记录器,如果您希望每天更改datepattern值
<appender name="ASYNC" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./applogs/logger.log" />
<param name="Append" value="true" />
<param name="Threshold" value="debug" />
<appendToFile value="true" />
<param name="DatePattern" value="'.'yyyy_MM_dd_HH_mm"/>
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="fileNamePattern" value="./applogs/logger_%d{ddMMMyyyy HH:mm:ss}.log"/>
<param name="rollOver" value="TRUE"/>
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ddMMMyyyy HH:mm:ss,SSS}^[%X{l4j_mdc_key}]^[%c{1}]^ %-5p %m%n" />
</layout>
</appender>
<root>
<level value="info" />
<appender-ref ref="ASYNC" />
</root>
这是基于cquezel的回答。更改活动文件名上的文件名以及策略文件名模式对我来说很有用。如果不更改活动文件名,则当前日志在发生旋转之前不可见。在这种情况下,我只是将日志文件名从“Launcher”更改为“Launcher”
private static final String LOG4J\u ROLLING\u FILE\u NAME\u TOKEN=“Launcher”;
/*
*更改通过log4j.xml配置的日志文件的名称
*通过将占位符文件名标记(“启动器”)替换为
*一个新的“actionName”。
*/
私有静态void log4jConfig(字符串actionName){
org.apache.log4j.Logger rootLogger=LogManager.getRootLogger();
RollingFileAppender fileAppender=(RollingFileAppender)rootLogger.getAppender(“fileAppender”);
//
字符串currentLogFile=fileAppender.getFile();
字符串newLogPattern=currentLogFile.replace(LOG4J\u ROLLING\u FILE\u NAME\u TOKEN,actionName);
setFile(newLogPattern);
TimeBasedRollingPolicy TimeBasedRollingPolicy=(TimeBasedRollingPolicy)fileAppender.getRollingPolicy();
String fileNamePattern=timeBasedRollingPolicy.getFileNamePattern();
String newFileNamePattern=fileNamePattern.replace(LOG4J_ROLLING_FILE_NAME_TOKEN,actionName);;
setFileNamePattern(newFileNamePattern);
timeBasedRollingPolicy.activateOptions();
fileAppender.activateOptions();
info(“将启动器日志输出重定向到日志模式:”+newFileNamePattern);
}
谢谢你提供的信息,看起来我确实需要使用额外的功能。有点奇怪,但很高兴知道。@DavidLevesque谢谢。更新了LinksHanks,这很有帮助。不过需要注意的是:我发现还需要通过fileAppender.setFile()设置活动名称,否则活动文件在滚动之前将不可见。我将在下面的另一个答案中添加一个示例。
private static final String LOG4J_ROLLING_FILE_NAME_TOKEN = "Launcher";
/*
* Change the name of the the log file as configured through log4j.xml
* by replacing the placeholder file name token ("Launcher") with the
* a new "actionName".
*/
private static void log4jConfig(String actionName) {
org.apache.log4j.Logger rootLogger = LogManager.getRootLogger();
RollingFileAppender fileAppender = (RollingFileAppender)rootLogger.getAppender("fileAppender");
// <param name="FileNamePattern" value="/var/log/Launcher.log.%d{yyyy-MM-dd}.gz"/>
String currentLogFile = fileAppender.getFile();
String newLogPattern = currentLogFile.replace(LOG4J_ROLLING_FILE_NAME_TOKEN, actionName);
fileAppender.setFile(newLogPattern);
TimeBasedRollingPolicy timeBasedRollingPolicy = (TimeBasedRollingPolicy) fileAppender.getRollingPolicy();
String fileNamePattern = timeBasedRollingPolicy.getFileNamePattern();
String newFileNamePattern = fileNamePattern.replace(LOG4J_ROLLING_FILE_NAME_TOKEN, actionName);;
timeBasedRollingPolicy.setFileNamePattern(newFileNamePattern);
timeBasedRollingPolicy.activateOptions();
fileAppender.activateOptions();
LOG.info(" Redirected launcher log output to log pattern: " + newFileNamePattern);
}