以编程方式查找log4j2(beta9)日志文件名

10

我正在使用Java 1.7和Log4j2(beta9),并且我有以下的log4j2.xml文件:

<?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””这一位?我真的很讨厌硬编码。


log4j的SMTP appender是一个选择吗?它可以将您记录的任何内容,包括异常,发送电子邮件。 - Ralf
我关注内存问题,但我会尝试一下。 - Dennis
SMTP appender是一个不错的选择,但遗憾的是在我的情况下不适用。对于那些感兴趣的人,请访问http://logging.apache.org/log4j/2.x/manual/appenders.html#SMTPAppender。 - Dennis
3个回答

10
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();
}

好的,你抓住我了。我不擅长Java,无法让它工作。你能提供一个样例吗? - Dennis
抱歉,一开始没有注意到需要使用Log4j 2。以下是更详细的回答。 - Paul Hicks

4

保罗的回答是正确的,只需要进行小修改:

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();
}

所有答案的功劳归于保罗!


哦,我明白了,现在它返回文件名,而不是文件对象。已更新我的答案。 - Paul Hicks

2

另一种方法,少用类转换:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接