2014-02-07 12 views
8

Ich bin mit Java 1.7 und Log4j2 (beta9) und ich habe folgende log4j2.xml Datei:Programmatically den log4j2 finden (beta9) Logdateiname

<?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> 

Und so weit wie die Protokollierung selbst geht, tut es was ich brauche.

Als Teil der Fehler/Ausnahme-Sequenz muss ich eine E-Mail mit der Protokolldatei als Anhang senden.

Wie bekomme ich programmatisch das 'fileName = "logs/foo.log"' Bit? Ich würde es wirklich hassen, das hart programmieren zu müssen.

+0

Würde die log4j smpt appender eine Option sein? Es mailt, was auch immer Sie geloggt haben, einschließlich der Ausnahme. – Ralf

+0

Ich mache mir Sorgen um die Erinnerung, aber ich werde es versuchen. – Dennis

+0

Der SMTP-Appender ist eine gute Option, aber leider nicht in meinem Fall. Für Interessierte, http://logging.apache.org/log4j/2.x/manual/appenders.html#SMTPAppender – Dennis

Antwort

3

Vom Logger, durchlaufen alle getAllAppenders für einen suchen, der RollingFileAppender implementiert, und rufen Sie getFile darauf. Oder Sie könnten stattdessen getAppender("RollingFile") verwenden, wenn es Ihnen nichts ausmacht, den Namen des Appenders zu codieren.

Für Log4j 1:

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

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

Für Log4j 2: (beachten Sie, dass dies erfordert die Nicht-Interface-Logger)

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

ok, du hast mich. Ich sauge an Java und konnte das nicht zur Arbeit bringen. Können Sie eine Probe zur Verfügung stellen? – Dennis

+0

Entschuldigung, habe die Log4j 2-Anforderung zunächst nicht bemerkt. Erweiterte Antwort. –

2

Paul Antwort richtig war mit einer kleinen Änderung:

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

Der ganze Kredit für die Antwort geht an Paul!

+0

Oh ich sehe, es gibt jetzt den Dateinamen zurück, anstatt das File-Objekt. Meine Antwort wurde aktualisiert. –

0

Alternative Verfahren mit weniger Klasse Gießen:

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