RollingFileAppender устанавливает RollingPolicy программно - PullRequest
7 голосов
/ 03 мая 2011

По причинам, по которым я не буду вдаваться, я вынужден настроить приложение log4j программно.

Я хочу использовать RollingFileAppender, чтобы контролировать максимальное количество файлов, которые хранятся вокруг.

Также я хочу настроить этот аппендер на использование TimeBasedRollingPolicy, так как он автоматически позаботится о сжатии свернутых файлов.

Проблема в том, что я не вижу способа установить это с помощью кода.При обычной настройке RollingFileAppender через файл свойств вы должны иметь:

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

Должен быть способ установки этого ....?Может кто-нибудь пролить некоторый свет, копаясь в javadoc, и основное отражение методов затмений классов не выявило решения: (

Ответы [ 5 ]

5 голосов
/ 23 ноября 2011

Вот как я переопределяю файл 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();
}
4 голосов
/ 03 мая 2011

Вам могут понадобиться дополнения / дополнения log4j для использования roll.RollingFileAppender.

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

EDIT:

Вот справочник API, который позволяет вам установить скользящую политику.

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

3 голосов
/ 26 сентября 2013

Это основано на ответе cquezel. Изменение имени файла в имени активного файла, а также шаблон имени файла политики помогли мне. Если вы не измените имя активного файла, текущий журнал не будет виден, пока не произойдет ротация. В этом случае я просто изменяю имя файла журнала с «Launcher».

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);
}
1 голос
/ 03 мая 2011

Я должен был сделать это недавно.Это не использует 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;

    }
0 голосов
/ 27 июня 2012

этот пример будет создавать регистратор для каждой минуты, если вы хотите изменить для каждого дня, измените значение 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...