【问题标题】:Programmatically find the log4j2 (beta9) log filename以编程方式查找 log4j2 (beta9) 日志文件名
【发布时间】:2014-02-07 17:12: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 smpt appender 可以选择吗?它会通过电子邮件发送您记录的任何内容,包括异常。
  • 我担心内存问题,但我会尝试一下。
  • SMTP 附加程序是一个不错的选择,但遗憾的是,我的情况并非如此。对于那些感兴趣的人,logging.apache.org/log4j/2.x/manual/appenders.html#SMTPAppender

标签: java log4j2


【解决方案1】:

Logger,遍历所有getAllAppenders,寻找实现RollingFileAppender的那个,然后调用getFile。或者,如果您不介意硬编码 appender 的名称,也可以使用 getAppender("RollingFile")

对于 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 上很烂,无法让它工作。可以提供样品吗?
  • 抱歉,最初没有注意到 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();
}

答案的功劳归于保罗!

【讨论】:

  • 哦,我明白了,它现在返回文件名,而不是 File 对象。更新了我的答案。
【解决方案3】:

类转换较少的替代方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2011-10-27
    相关资源
    最近更新 更多