Frage

Wir haben mehrere Jobs, die gleichzeitig ausgeführt werden, die die gleiche Config-Info für log4j verwenden. Sie sind alle Dumping die Protokolle in eine Datei des gleichen appender verwenden. Gibt es eine Möglichkeit jeden Job zu haben, dynamisch seine Protokolldatei benennen, damit sie seperate bleiben?

Danke
Tom

War es hilfreich?

Lösung

Kann passieren Sie eine Java-Systemeigenschaft für jeden Job? Wenn ja, können Sie wie folgt parametriert werden:

java -Dmy_var=somevalue my.job.Classname

Und dann in Ihrem log4j.properties:

log4j.appender.A.File=${my_var}/A.log

Sie können die Java-Systemeigenschaft mit einem Wert aus der Umgebung des Host-bevölkern (zum Beispiel), die die Instanz des Auftrags eindeutig identifizieren würde.

Andere Tipps

Wenn die Jobnamen im Voraus bekannt sind, können Sie die Jobnamen enthalten, wenn Sie den getLogger () -Aufruf tun. Sie können dann verschiedenen Appen an unterschiedlichen Logger binden, mit separaten Dateinamen (oder zu anderen Zielen).

Wenn Sie nicht die Jobnamen im Voraus wissen, können Sie den Logger zur Laufzeit konfigurieren könnten stattdessen eine Konfigurationsdatei verwenden:

FileAppender appender = new FileAppender();
appender.setFileName(...);
appender.setLayout(...);
Logger logger = Logger.getLogger("com.company.job."+jobName);
logger.addAppender(appender);

Wir haben etwas ähnliches in unserem System implementiert. Wir speichern die spezifischen Logger in einer HashMap und initialisieren Appen für jeden von ihnen je nach Bedarf.

Hier ist ein Beispiel:

public class JobLogger {
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>();
private static String m_filename = "...";  // Root log directory

public static synchronized void logMessage(String jobName, String message)
{
    Logger l = getJobLogger(jobName);
    l.info(message);
}

public static synchronized void logException(String jobName, Exception e)
{
    Logger l = getJobLogger(partner);
    l.info(e.getMessage(), e);
}

private static synchronized Logger getJobLogger(String jobName)
{
    Logger logger = m_loggers.get(jobName);
    if (logger == null) {
        Layout layout = new PatternLayout("...");
        logger = Logger.getLogger(jobName);
        m_loggers.put(jobName, logger);
        logger.setLevel(Level.INFO);
        try {
            File file = new File(m_filename);
            file.mkdirs();
            file = new File(m_filename + jobName + ".log");
            FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false);
            logger.removeAllAppenders();
            logger.addAppender(appender);
    }
        catch (Exception e)
    { ... }
    }
    return logger;
}
}

Dann verwenden, um dies in Ihrem Job müssen Sie nur einen einzeiligen Eintrag wie folgt verwendet werden:

JobLogger.logMessage(jobName, logMessage);

Dies wird für jeden Job Namen eine Protokolldatei erstellen und sie in einer eigenen Datei mit den Job-Namen fällt in welcher auch immer von Ihnen angegebenen Verzeichnis.

Sie können mit anderen Arten von Appen Geige und so, wie es angehängt wird weiterhin geschrieben, bis die JVM neu gestartet wird, die, wenn Sie die gleiche Arbeit auf einem Server ausführen kann nicht arbeiten, das immer ist, aber das gibt die allgemeine Vorstellung von wie es funktionieren kann.

können Sie haben jeden Job eingestellt NDC oder MDC und dann eine appender schreiben, die den Namen auf dem NDC oder MDC-Wert basiert variiert. ein neues appender zu schaffen, ist nicht zu hart. Es kann auch eine appender sein, dass die Rechnung in der log4j Sandbox paßt. Beginn der Suche in http://svn.apache.org/viewvc/logging/ log4j / trunk / contribs /

Sie können Ihre eigenen appender schreiben, die einen eigenen Dateinamen machen, vielleicht die Verwendung von [File.createTempFile] ( http://java.sun.com/j2se/1.5.0/docs/ api / java / io / file.html # createTempFile (java.lang.String, 20java.lang.String%)) Methode. Wenn die FileAppender Klasse richtig geschrieben wurde, sollten Sie in der Lage sein, es-oder zu erweitern RollingFileAppender-und die getFile Methode überschreibt, geht man zurück, dass Sie auf der Grundlage wählen, was neue Eigenschaften, die Sie hinzufügen möchten.

Aufbauend auf shadit 's Antwort. Wenn jeder Auftrag von welcher Klasse Hauptmethode identifiziert wird gestartet wurde können Sie die Systemeigenschaft sun.java.command verwenden, die der vollständige Name der Klasse contais gestartet. Zum Beispiel wie folgt aus:

log4j.appender.LOGFILE.File=${sun.java.command}.log

Ich benutze es zusammen mit einem TimestampFileAppender wie folgt aus:

log4j.appender.LOGFILE=TimestampFileAppender
log4j.appender.LOGFILE.TimestampPattern=yyyy_MM_dd__HH_mm
log4j.appender.LOGFILE.File=${sun.java.command}_{timestamp}.log

Auf diese Weise, wenn ich in Eclipse entwickeln bin bekomme ich eine neue Protokolldatei für jeden neuen Prozess, den ich laufe, durch die Klassennamen der Klasse mit dem Hauptverfahren und die Zeit, die gestartet wurde, identifiziert.

Tom Sie coud für jeden Auftrag festlegen und Appen. Lassen Sie uns, dass Sie zwei Jobs haben entsprechend zwei verschiedene Java-Pakete com.tom.firstbatch und com.tom.secondbatch, würden Sie so etwas wie dies in log4j.xml haben:

   <category name="com.tom.firstbatch">
      <appender-ref ref="FIRST_APPENDER"/>
   </category>
   <category name="com.tom.secondtbatch">
      <appender-ref ref="SECOND_APPENDER"/>
   </category>

Sie könnten programmatisch konfigurieren log4j, wenn Sie den Job zu initialisieren.

Sie können auch die log4j.properties Datei zur Laufzeit über eine Systemeigenschaft festgelegt. Aus dem Handbuch :

  

Stellen Sie das Ressourcen-String-Variable auf den Wert der log4j.configuration Systemeigenschaft. Der bevorzugte Weg, um die Standard-Initialisierung Datei angeben, ist durch die log4j.configuration Systemeigenschaft. Falls die Systemeigenschaft log4j.configuration nicht definiert ist, dann setzen Sie die String-Variable Ressource auf den Standardwert „log4j.properties“.

Sie laufen die Aufträge von verschiedenen Java-Befehle Unter der Annahme, wird diese ihnen ermöglichen, unterschiedliche log4j.properties Dateien und unterschiedliche Dateinamen für jeden zu verwenden.

Ohne spezifisches Wissen, wie Ihre Aufträge ausführen es schwierig ist, zu sagen!

Sie können implementieren folgende:

  • Ein Thread Halter für die Identität Ihrer Arbeit.
  • Extend FileAppender, Ihre FileAppender hat eine Karte zu halten, einen Quietwriter für jeden Job Identität zu halten. In Verfahren subAppend Sie die Identität Ihres Auftrags aus dem Thread bekommen, schauen Sie nach oben (oder erstellen) den Quietwriter und schreiben, um es ...

ich Sie können per Post einen Code senden, wenn Sie wünschen ...

log4j.logger.com.foo.admin =, AdminFileAppender log4j.logger.com.foo.report =, ReportFileAppender

Es ist eine andere Möglichkeit, diese Aufgabe zu tun .. hier com.foo.admin ist die vollständige Paketnamen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top