2015-11-30 97 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

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

我收到這條消息「當我在log4j2中使用以下方法時,RollingFileManager類型的方法翻轉(RolloverStrategy)不可見」。如何解決這個問題或我相信rollover()在log42中不可用? – karan

+0

@karan,請檢查您使用的'RollingFileAppender'是否屬於'org.apache.logging.log4j.core.appender'包。 –

3

由Lahiru所示僅定位配置用於其基於所述代碼駐留在類中的特定記錄器的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正在爲您工作。我相信rollover()在log4j2 2.x版本中不可用。你知道任何解決方法嗎? – karan