2015-11-30 3 views
3

У меня log4j настроен для поворота журнала каждый день.Как повернуть журнал log4j вручную

В особых ситуациях я хотел бы активировать дополнительное вращение журнала вручную.

Возможно ли это - и если да: как?

решаемые так:

void rolloverLogs() { 
    for(final Enumeration<?> loggers = LogManager.getCurrentLoggers(); loggers.hasMoreElements();) { 

     final Logger logger = (Logger) loggers.nextElement(); 

     for (final Enumeration<?> appenders = logger.getAllAppenders(); appenders.hasMoreElements();) { 

      final Appender a = (Appender) appenders.nextElement(); 

      if(!RollingFileAppender.class.isInstance(a)) 
       continue; 

      ((RollingFileAppender)a).rollOver(); 
     } 
    } 
} 

ответ

2

Если вы отслеживать ваши appenders, вы могли бы назвать

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/RollingFileAppender.html#rollOver()

Это должно сделать это. Я предполагаю, что также можно перебирать все приставки, которые вы можете найти, начиная с корневого уровня - просто убедитесь, что вы отслеживаете, какие приложения вы уже свернули.

+0

THX для ссылки ... Это должно делать свое дело. – eventhorizon

2

Для log4j2 вы можете использовать следующее.

org.apache.logging.log4j.Logger logManagerLogger = LogManager.getLogger(); 
    Map<String, org.apache.logging.log4j.core.Appender> appenders = ((org.apache.logging.log4j.core.Logger) logManagerLogger).getAppenders(); 
    appenders.forEach((appenderName, appender) -> { 
     if (appender instanceof RollingFileAppender) { 
      logger.info("Rolling over appender " + appenderName); 
      ((RollingFileAppender) appender).getManager().rollover(); 
     } 
    }); 
+0

Я получаю это сообщение «Откат метода (RolloverStrategy) от типа RollingFileManager не отображается», когда я использую следующий метод в log4j2. Как это решить или я считаю, что rollover() недоступен в log42? – karan

+0

@karan, проверьте, используется ли 'RollingFileAppender', который принадлежит пакет' org.apache.logging.log4j.core.appender'. –

3

Методика показана Lahiru только найти Appenders настроенные для конкретного Logger, который основан на классе код проживает в. Точная Appender (ы), расположенный может может изменяться при изменении конфигурации.

Если вы знаете имя Appender лучший способ сделать это:

org.apache.logging.log4j.core.LoggerContext context = LogManager.getContext(false); 
Appender appender = context.getConfiguration().getAppender(appenderName); 
if (appender instanceof RollingFileAppender) { 
    ((RollingFileAppender) appender).getManager().rollover(); 
} 

Если вы хотите, чтобы пролонгировать все RollingFileAppenders вы могли бы сделать:

org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false); 
for (Appender appender : context.getConfiguration().getAppenders().values()) { 
    if (appender instanceof RollingFileAppender) { 
     ((RollingFileAppender) appender).getManager().rollover(); 
    } 
} 
+0

+10. Используйте аналогичный код при использовании RollingRandomAccessFileAppender. –

+0

@RemkoPopma Is выше работает для вас. Я считаю, что rollover() недоступен в версиях log4j2 2.x. Знаете ли вы какое-нибудь обходное решение? – karan

Смежные вопросы