2014-02-07 2 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 ФППМ Appender быть вариант? Он отправит вам все, что вы зарегистрировали, включая исключение. – 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") вместо этого, если вы не против жесткого кодирования имени приложения.

Для 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(); 
Смежные вопросы