2015-08-20 21 views
5

Sto cercando di eseguire un lavoro nella primavera-XD, che si trova sotto il seguente percorso:Primavera-XD non legge logback.xml

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

mio vaso, che si trova sotto MyJobName/lib, contiene nel suo percorso radice file logback.xml. Sfortunatamente, Spring-XD sembra ignorare completamente quel file. Quando eseguo il lavoro tramite il mio IDE (IntelliJ), la registrazione funziona correttamente, ma quando la eseguo utilizzando Spring-XD ignora completamente il mio SiftingAppender.

Ecco quello che il mio file logback.xml assomiglia:

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

voglio mettere questo file logback.xml sotto/primavera-xd/xd/config, o sotto un'altra cartella di configurazione, ma nulla che io prova a lavorare Ho provato a cercare tra i documenti Spring-XD, ma non ho trovato nulla.

Qualsiasi intuizione sarebbe apprezzata.

+0

potresti aggiungere alcune informazioni sulla tua applicazione.proprietà? e come inizi il tuo lavoro? potrebbe essere, che l'ambiente di runtime non lo sa, la posizione del logback.xml – duffy356

+0

anche assicurarsi che quel logback è nel percorso della classe, quando si avvia il lavoro – duffy356

risposta

6

bisogna mettere Logback direttamente nel classpath. Vedere here:

Logback può essere configurato sia a livello di codice o con uno script di configurazione espresso in formato XML o Groovy. A proposito, gli utenti di log4j esistenti possono convertire i loro file log4j.properties in logback.xml usando la nostra applicazione web PropertiesTranslator.

Cominciamo a discutere i passi di inizializzazione che logback segue per cercare di autoconfigurarsi:

  • Logback tenta di trovare un file chiamato logback.groovy nel classpath.

  • Se non viene trovato alcun file di questo tipo, il logback tenta di trovare un file denominato logback-test.xml nel classpath.

  • Se non viene trovato alcun file di questo tipo, controlla il file logback.xml nel classpath.

  • Se non viene trovato alcun file di questo tipo e JVM in esecuzione ha ServiceLoader (JDK 6 e versioni successive), il ServiceLoader verrà utilizzato per risolvere un'implementazione di com.qos.logback.classic.spi.Configurator. Verrà utilizzata la prima implementazione trovata. Consultare la documentazione di ServiceLoader per ulteriori dettagli.

  • Se nessuno dei precedenti ha esito positivo, il logback si configura automaticamente utilizzando BasicConfigurator che causerà l'indirizzamento dell'output di registrazione alla console.

Sembra a me come il vostro file di configurazione non è nel classpath. Generalmente la directory config non è nel classpath di default nella maggior parte dei framework, in molti casi è /config/<files> che si trovano nel percorso della classe, e devi specificarli con quando li carichi con lo ClassLoader. Tuttavia, Logback non lo fa, quindi se si desidera archiviare i file nella directory config, è necessario caricarli manualmente.

In sostanza, è possibile specificare JoranConfigurator per caricare il file da una posizione personalizzata nel classpath, gestire gli errori e così via per assicurarsi di aver trovato il file. Vedi here for more details.

Ecco come caricare la configurazione di Logback, è possibile adattare questo al sistema. In questo caso, resource è il percorso all'interno del classpath in cui è stato deciso di inserire il file logback.xml. In questo caso sarebbe probabilmente /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; 
     } 
    } 
} 

In genere, questo metodo potrebbe essere chiamato come una delle prime linee in main con qualcosa di simile:

LogbackConfigurator.configure(path); 

Una volta che questa classe è stato eseguito, il vostro logback dovrebbe essere configurato come se il sistema avesse stato in grado di trovare normalmente il file di configurazione. Si noti che è anche possibile utilizzare e System.getProperties().get(keyname) per specificare un percorso alternativo per il percorso del file di logback in modo dinamico se non si desidera eseguire l'hardcoding della posizione nel sistema.

È anche possibile configurare la posizione da iniettare nella configurazione primavera, ma io personalmente non lo consiglio che si verifica come si farebbe normalmente come la registrazione di essere configurato prima iniezione, in modo che, se tutti gli eventi di registrazione si verificano durante l'iniezione , verranno registrati in modo appropriato.

4

Sembra che la tua configurazione di login stia riscontrando alcuni problemi minori.

Provare a inserire la seguente configurazione nel percorso di classe dell'applicazione; dovrebbe risolvere il problema.

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

Nota seguito parte viene modificato in base al riferimento di configurazione logback:

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