2017-04-23 114 views
2

我需要添加編程文件記錄,動態生成的文件名。在運行時動態添加文件記錄與Log4j2 2.8.1

我的代碼是這樣的:

private static final Logger LOGGER = LogManager.getLogger(Archiver.class); 

public static void openLogfile(String folder) { 
    String dateTime = "TODO"; 
    String fileName = folder + "upload" + dateTime + ".log"; 
    LOGGER.info("Opening " + fileName + " for logging."); 
    // setting up a FileAppender dynamically... 
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
    final Configuration config = ctx.getConfiguration(); 
    Layout layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, null, config, null, 
      null, true, true, null, null); 
    Appender appender = FileAppender.createAppender(fileName, "false", "false", "File", "true", 
      "false", "false", "4000", layout, null, "false", null, config); 
    appender.start(); 
    config.addAppender(appender); 
    AppenderRef ref = AppenderRef.createAppenderRef("File", null, null); 
    AppenderRef[] refs = new AppenderRef[]{ref}; 

    LoggerConfig loggerConfig = LoggerConfig.createLogger(true, Level.DEBUG, "org.apache.logging.log4j", "", refs, 
      null, config, null); 

    loggerConfig.addAppender(appender, null, null); 
    config.addLogger("org.apache.logging.log4j", loggerConfig); 
    ctx.updateLoggers(); 

} 

我看了一下配方How to add Log4J2 appenders at runtime programmatically?http://logging.apache.org/log4j/2.x/manual/customconfig.html#AddingToCurrent

我的問題是:

  • 在上述不會編譯log4j2文檔的例子,它已經過時了,只好沒有太多的想法,他們是什麼添加幾個參數,通常我加空。
  • 文檔中使用的方法現在已被棄用;正在創建
  • 的文件,但沒有記錄出現在那裏雖然具有控制檯輸出,並且程序退出後,沒有在文件中任一沖洗。

請問有人請提供一個最新的API的下降示例log4j2動態添加文件日誌記錄?我使用org.apache.logging.log4j 2.8.1。

+0

名字'LOGGER'不符合Java的命名約定。所有大寫名稱都是爲常量變量保留的,或者至少是指向不可變對象的'final'變量。 –

+0

@LewBloch感謝您的提醒,任何希望您也可以幫助解決手頭的問題?問題不完全是關於代碼樣式。 –

+0

這感覺就像一個[XY問題(https://meta.stackexchange.com/a/66378),可以請你描述你的理由想一個綱領性的解決方案嗎? –

回答

3

基於在評論中附加信息,這裏是我的建議。我不認爲你需要以你的問題中提到的所有原因進行編程。

相反,你可以使用類似下面的示例配置log4j2系統。請注意,您不一定需要控制檯appender,我只是簡單地使用它進行測試。

log4j2.xml內容:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <Console name="STDOUT" target="SYSTEM_OUT"> 
      <PatternLayout pattern="[%date{ISO8601}][%-5level][%t] %m%n" /> 
     </Console> 
     <File 
      fileName="logs/${ctx:fileName}.txt" 
      name="logFile"> 
      <PatternLayout> 
       <Pattern>[%date{ISO8601}][%-5level][%t] %m%n</Pattern> 
      </PatternLayout> 
     </File> 
    </Appenders> 
    <Loggers> 
     <Logger name="example" level="TRACE" additivity="false"> 
      <AppenderRef ref="STDOUT" /> 
      <AppenderRef ref="logFile" /> 
     </Logger> 
     <Root level="WARN"> 
      <AppenderRef ref="STDOUT" /> 
     </Root> 
    </Loggers> 
</Configuration> 

Java代碼:

package example; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.ThreadContext; 

public class LogFileNameBasedOnArg0Main { 

    public static void main(String[] args) { 
     ThreadContext.put("fileName", args[0]); 
     Logger log = LogManager.getLogger(); 
     log.info("Here's some info!"); 
    } 

} 

輸出:

我用產生該 「MYFILE」 的程序參數file:logs/myFile.txt,其內容如下:

[2017-05-03T11:20:37,653][INFO ][main] Here's some info! 

你應該能夠修改此示例以滿足您的需求,你不會做任何編程配置,從而避免你提到的問題。

相關問題