2015-08-20 8 views
5

Ich versuche, einen Job in Spring-XD zu laufen, unter dem folgenden Pfad:Frühlings-XD nicht logback.xml liest

/spring-xd/xd/modules/job/MyJobName (I'll call this path MyJobName below) 

Mein Glas, unter MyJobName/lib befindet, enthält in seinem Stammpfad der Datei logback.xml. Leider scheint Spring-XD diese Datei vollständig zu ignorieren. Wenn ich den Job über meine IDE (IntelliJ) ausführe, funktioniert das Logging gut, aber wenn ich es mit Spring-XD starte, ignoriert es vollständig meinen SiftingAppender. Hier

ist, was meine logback.xml Datei wie folgt aussieht:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%5p %-25logger{25} %m %n</pattern> 
     </encoder> 
    </appender> 

    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
     <discriminator> 
      <key>publication.run.id</key> 
      <defaultValue>unknown</defaultValue> 
     </discriminator> 
     <sift> 
      <appender name="FILE-${publication.run.id}" class="ch.qos.logback.core.FileAppender"> 
       <file>/data/${publication.run.id}/logs/process.log</file> 
       <append>true</append> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <pattern>%5p %-25logger{25} %m %n</pattern> 
       </layout> 
      </appender> 
     </sift> 
    </appender> 

    <logger name="com.bitwiseor"> 
     <level value="INFO" /> 
    </logger> 

    <logger name="org.springframework"> 
     <level value="INFO" /> 
    </logger> 

    <root> 
     <level value="INFO" /> 
     <appender-ref ref="SIFT" /> 
     <appender-ref ref="CONSOLE" /> 
    </root> 
</configuration> 

ich diese logback.xml Datei setzen will unter/Feder-xd/xd/config oder unter einem anderen Konfigurationsordner, aber nichts, was ich Versuche funktioniert. Ich habe versucht, die Spring-XD-Dokumentation durchzusehen, aber nichts gefunden.

Jeder Einblick wäre willkommen.

+0

könnten Sie einige Informationen über Ihre application.properties hinzufügen? und wie beginnst du deinen Job? Es könnte sein, dass die Laufzeitumgebung nicht weiß, dass der Speicherort Ihrer logback.xml – duffy356

+0

auch sicherstellen, dass das Logbuch in Ihrem Klassenpfad ist, wenn Sie Ihren Job starten – duffy356

Antwort

6

Sie haben Logback direkt im Classpath zu setzen. Siehe here:

Logback kann entweder programmgesteuert oder mit einem Konfigurationsskript im XML- oder Groovy-Format konfiguriert werden. Übrigens können bestehende log4j-Benutzer ihre log4j.properties-Dateien mithilfe unserer PropertiesTranslator-Webanwendung in logback.xml konvertieren.

uns mit der Diskussion um die Initialisierungsschritte Lassen Sie beginnen, die logback folgt, um zu versuchen, sich selbst zu konfigurieren:

  • Logback versucht, eine Datei zu finden logback.groovy in dem Classpath genannt.

  • Wenn keine solche Datei gefunden wird, versucht Logback, eine Datei namens logback-test.xml im Klassenpfad zu finden.

  • Wenn keine solche Datei gefunden wird, wird im Klassenpfad nach der Datei logback.xml gesucht.

  • Wenn keine solche Datei gefunden wird, und die Ausführung JVM hat den ServiceLoader (JDK 6 und höher) die ServiceLoader verwendet werden, eine Implementierung von com.qos.logback.classic.spi.Configurator zu lösen. Die erste gefundene Implementierung wird verwendet. Weitere Informationen finden Sie in der ServiceLoader-Dokumentation.

  • Wenn keiner der obigen Schritte erfolgreich ist, konfiguriert sich Logback automatisch mit dem BasicConfigurator, wodurch die Protokollausgabe an die Konsole geleitet wird.

Es mir Datei wie Ihre Konfiguration klingt, ist nicht im Classpath. Im Allgemeinen ist das Verzeichnis config in den meisten Frameworks standardmäßig nicht im Klassenpfad, in vielen Fällen ist es /config/<files> im Klassenpfad und Sie müssen sie mit /config/name angeben, wenn Sie sie mit dem ClassLoader laden. Logback führt dies jedoch nicht aus. Wenn Sie die Dateien im Verzeichnis config speichern möchten, müssen Sie sie manuell laden.

Im Wesentlichen können Sie JoranConfigurator anweisen, die Datei von einem benutzerdefinierten Speicherort in Ihrem Klassenpfad zu laden, die Fehler usw. behandeln, um sicherzustellen, dass Sie Ihre Datei gefunden haben. Siehe here for more details.

Hier ist, wie ich meine Logback-Konfiguration laden, können Sie wahrscheinlich dies an Ihr System anpassen. In diesem Fall ist der Pfad innerhalb Ihres Klassenpfads zu dem Speicherort, an dem Sie Ihre logback.xml-Datei ablegen möchten. In diesem Fall wäre es wahrscheinlich /spring-xd/xd/config/logback.xml.

public class LogbackConfigurator { 
    private static final Logger LOG = 
      LoggerFactory.getLogger(LogbackConfigurator.class); 

    public static boolean configure(String resource) throws JoranException { 
     final InputStream configInputStream = LogbackConfigurator.class.getResourceAsStream(resource); 
     final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 

     JoranConfigurator configurator = new JoranConfigurator(); 
     configurator.setContext(loggerContext); 
     // the context was probably already configured by default configuration rules 
     loggerContext.reset(); 

     if(configInputStream != null) { 
      try { 
       configurator.doConfigure(configInputStream); 
      } catch (JoranException e) { 
       e.printStackTrace(); 
      } 
      StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext); 
      return true; 
     } else { 
      LOG.error("Unable to find logback file: {}", resource); 
      StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext); 
      return false; 
     } 
    } 
} 

Normalerweise würde dieses Verfahren als eine der ersten Zeilen in main mit so etwas wie genannt werden:

LogbackConfigurator.configure(path); 

Sobald diese Klasse ausgeführt wurde, soll Ihr logback wie konfiguriert werden, wenn das System hat konnte die Konfigurationsdatei normal finden. Beachten Sie, dass Sie auch -Dproperty=value und verwenden können, um einen alternativen Speicherort für den Pfad zur Logback-Datei dynamisch anzugeben, wenn Sie den Speicherort nicht in Ihrem System fest codieren möchten.

Sie können auch den zu injizierenden Standort in Ihrer Spring-Konfiguration konfigurieren, aber ich persönlich empfehle nicht, wie Sie normalerweise Protokollierung konfiguriert werden vor Injektion auftritt, so dass wenn Protokollierungsereignisse während der Injektion auftreten Sie werden entsprechend protokolliert.

4

Scheint wie Ihre Logback Konfiguration hat einige kleinere Probleme.

Versuchen Sie, die folgende Konfiguration in Ihren Anwendungsklassenpfad einzufügen; sollte das Problem lösen.

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%5p %-25logger{25} %m %n</pattern> 
     </encoder> 
    </appender> 
    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
     <discriminator> 
      <key>publication.run.id</key> 
      <defaultValue>unknown</defaultValue> 
     </discriminator> 
     <sift> 
      <appender name="FILE-${publication.run.id}" class="ch.qos.logback.core.FileAppender"> 
       <file>/data/${publication.run.id}/logs/process.log</file> 
       <append>true</append> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <pattern>%5p %-25logger{25} %m %n</pattern> 
       </layout> 
      </appender> 
     </sift> 
    </appender> 
    <logger name="com.bitwiseor" level="INFO" /> 
    <logger name="org.springframework" level="INFO" /> 
    <root level="INFO"> 
     <appender-ref ref="SIFT" /> 
     <appender-ref ref="CONSOLE" /> 
    </root> 
</configuration> 

Hinweis unten Teil wird nach der logback Konfiguration Referenz geändert:

<logger name="com.bitwiseor" level="INFO" /> 
<logger name="org.springframework" level="INFO" /> 
<root level="INFO"> 
    <appender-ref ref="SIFT" /> 
    <appender-ref ref="CONSOLE" /> 
</root>