2014-02-07 46 views
8

我使用Java 1.7和Log4j2(beta9)和我有以下log4j2.xml文件:編程找到log4j2(beta9)日誌文件名

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="info"> 
    <Appenders> 
    <Console name="CONSOLE" target="SYSTEM_OUT"> 
     <PatternLayout pattern="[%d{dd/MMM/yyyy HH:mm:ss.SSS}]> %-5p - %m%n"/> 
    </Console> 

    <RollingFile name="RollingFile" fileName="logs/foo.log" filePattern="logs/foo-%d{dd-MMM-yyyy}-%i.log"> 
     <Policies> 
      <OnStartupTriggeringPolicy/> 
     </Policies> 
     <DefaultRolloverStrategy fileIndex="max" max="10"/> 
     <PatternLayout pattern="[%d{dd/MMM/yyyy HH:mm:ss.SSS}]> %-5p - %m%n"/> 
    </RollingFile> 

    <Async name="ASYNC"> 
     <AppenderRef ref="RollingFile"/> 
     <AppenderRef ref="CONSOLE"/> 
    </Async> 
    </Appenders> 

    <Loggers> 
    <Root level="debug"> 
     <AppenderRef ref="ASYNC"/> 
    </Root> 
    </Loggers> 
</Configuration> 

並儘可能記錄本身去,它我需要的。

作爲錯誤/例外序列的一部分,我需要發送一封包含日誌文件的電子郵件作爲附件。

如何以編程方式獲取'fileName =「logs/foo.log」'位?我真的很討厭必須對此進行硬編碼。

+0

會log4j的SMPT附加器是一種選擇?它會通過電子郵件發送任何您記錄的信息,包括例外。 – Ralf

+0

我很關心記憶,但我會試試這個。 – Dennis

+0

SMTP appender是一個不錯的選擇,但遺憾的是不在我的情況。對於那些感興趣的人,http://logging.apache.org/log4j/2.x/manual/appenders.html#SMTPAppender – Dennis

回答

3

Logger開始,遍歷所有getAllAppenders,查找實現RollingFileAppender的那個,並在其上調用getFile。或者你可以用getAppender("RollingFile")代替,如果你不介意對appender的名字進行硬編碼。

對於Log4j的1:

public static final Logger LOG = Logger.getLogger(YourClass.class); 

public File getLoggerFile() { 
    Appender appender = LOG.getAppender("RollingFile"); 
    return appender.getFile(); 
} 

對於Log4j的2:(注意,這需要非接口記錄器)

public static final Logger LOG = LogManager.getLogger(YourClass.class); 

public String getLoggerFileName() { 
    org.apache.logging.log4j.core.Logger loggerImpl = (org.apache.logging.log4j.core.Logger) LOG; 
    Appender appender = loggerImpl.getAppenders().get("RollingFile"); 
    // Unfortunately, File is no longer an option to return, here. 
    return ((RollingFileAppender) appender).getFileName(); 
} 
+0

好的,你有我。我吮吸Java並無法實現這個工作。你能提供一個樣本嗎? – Dennis

+0

對不起,最初沒有注意到Log4j 2的要求。擴大答案。 –

2

保羅的回答是一個小的修改正確:

public static String getLoggerFile(Logger log) { 
    org.apache.logging.log4j.core.Logger loggerImpl = (org.apache.logging.log4j.core.Logger) log; 
    Appender appender = loggerImpl.getAppenders().get("RollingFile"); 
    return ((RollingFileAppender) appender).getFileName(); 
} 

答案的所有功勞都歸保羅所有!

+0

哦,我明白了,它現在返回文件名,而不是File對象。更新了我的答案。 –

0

替代方法以較少的類鑄件:

 RollingFileAppender appender = (RollingFileAppender) LoggerContext.getContext().getConfiguration() 
     .getAppenders().get("myRfAppenderName"); 
    String logFile = appender.getFileName();