java RollingFileAppender 以编程方式设置 RollingPolicy

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5863054/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 13:10:21  来源:igfitidea点击:

RollingFileAppender set RollingPolicy programmatically

javalog4j

提问by rat

For reasons I won't get into I'm forced to configure a log4j appender programmatically.

由于我不会进入的原因,我被迫以编程方式配置 log4j appender。

I want to use a RollingFileAppender so I can control the maximum number of files that are kept around.

我想使用 RollingFileAppender 以便我可以控制保留的最大文件数。

Also I want to set this appender to use a TimeBasedRollingPolicy as that will automatically take care of compressing the rolled files.

此外,我想将此 appender 设置为使用 TimeBasedRollingPolicy,因为这将自动处理压缩滚动文件。

Problem is I can't see a way to set this through code. When setting up a RollingFileAppender normally through a properties file you would have:

问题是我看不到通过代码设置它的方法。通常通过属性文件设置 RollingFileAppender 时,您将拥有:

log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy

There must be a way of setting this .... ? Can anyone shed some light, digging through the javadoc and the basic eclipse-reflection of the classes methods hasn't revealed the solution :(

必须有一种方法来设置这个....?任何人都可以解释一下,通过 javadoc 和类方法的基本日食反射没有揭示解决方案:(

采纳答案by Kal

You might need the log4j companions/extras to use the rolling.RollingFileAppender.

您可能需要 log4j 同伴/额外内容才能使用 rolling.RollingFileAppender。

http://logging.apache.org/log4j/companions/index.html

http://logging.apache.org/log4j/companions/index.html

EDIT:

编辑:

Here is the api reference that lets you set the rolling policy.

这是允许您设置滚动策略的 api 参考。

http://logging.apache.org/log4j/companions/apidocs/org/apache/log4j/rolling/RollingFileAppender.html

http://logging.apache.org/log4j/companions/apidocs/org/apache/log4j/rolling/RollingFileAppender.html

回答by cquezel

Here is how I override the log4j.xml file to set a new filename to the logger named "TheLoggerName" whose RollingFileAppender is named "TheAppenderName". You can probably base your solution on this.

这是我如何覆盖 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();
}

回答by Glenn

This is based on cquezel's answer. Changing the file name on the active file name as well as the policy file name pattern did the trick for me. If you don't change the active file name, the current log was not visible until rotation occurred. In this case, I'm just changing the name of the log file from "Launcher".

这是基于 cquezel 的回答。更改活动文件名上的文件名以及策略文件名模式对我来说很有用。如果不更改活动文件名,则在发生轮换之前当前日志不可见。在这种情况下,我只是从“启动器”更改日志文件的名称。

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);
}

回答by MJB

I had to do this recently. This doesn't use RollingFileAppender, but I think you'll get the idea

我最近不得不这样做。这不使用 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;

    }

回答by codder

this example will be creating logger for each minute, if u want to change for each day change the datepattern value.

此示例将为每分钟创建记录器,如果您想更改每一天,请更改日期模式值。

<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>