2015-02-14 17 views
5

Ho problemi a far funzionare la funzionalità di scansione automatica di logback. Non sembra raccogliere le modifiche. Ho aggiunto debug = "true" alla sezione e leggendo il suo output, tutto sembra a posto. Dice chiaramente che il file logback.xml viene monitorato per le modifiche ogni 30 secondi. Sono in perdita sul motivo per cui i cambiamenti non vengono raccolti. Sto solo cercando alcune indicazioni su come posso risolvere ulteriormente questo problema. Grazie.Scansione Logback non funzionante

Devo dire che il logback sta registrando il file bene, solo che le modifiche al file di configurazione di logback non vengono raccolte.

file di logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration scan="true" scanPeriod="30 seconds" debug="true"> 

    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> 

    <property name="LOGS_PATH" value="C:\\Users\\****\\Desktop\\css_dev\\q_logs" /> 

    <appender name="scheduledTasksAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${LOGS_PATH}/scheduledTasks.log</file> 

     <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
      <fileNamePattern>${LOGS_PATH}/scheduledTasks.%i.log.zip</fileNamePattern> 
      <minIndex>1</minIndex> 
      <maxIndex>25</maxIndex> 
     </rollingPolicy> 

     <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
      <maxFileSize>5MB</maxFileSize> 
     </triggeringPolicy> 

     <encoder> 
      <pattern>%d{MMM/dd/yyyy HH:mm:ss} %-5level %logger{50} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <logger name="tasks" level="warn" additivity="false"> 
     <appender-ref ref="scheduledTasksAppender"/> 
    </logger> 
</configuration> 

uscita per Tomcat log quando un'applicazione web inizia:

|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 
|-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/*****/Desktop/css_dev/ProjectQ/build/web/WEB-INF/classes/logback.xml] 
|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds 
|-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[C:\Users\*****\Desktop\css_dev\ProjectQ\build\web\WEB-INF\classes\logback.xml]] every 30 seconds. 
|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter 
|-INFO in ch.qos.logback.core.joran.action.StatusListenerAction - Added status listener of type [ch.qos.logback.core.status.OnConsoleStatusListener] 
|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 
|-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/*****/Desktop/css_dev/ProjectQ/build/web/WEB-INF/classes/logback.xml] 
|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds 
|-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[C:\Users\*****\Desktop\css_dev\ProjectQ\build\web\WEB-INF\classes\logback.xml]] every 30 seconds. 
|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter 
|-INFO in ch.qos.logback.core.joran.action.StatusListenerAction - Added status listener of type [ch.qos.logback.core.status.OnConsoleStatusListener] 
|-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender] 
|-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender] 
|-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [scheduledTasksAppender] 
|-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [scheduledTasksAppender] 
|-INFO in [email protected] - Will use zip compression 
|-INFO in [email protected] - Will use zip compression 
|-WARN in [email protected]4e - Large window sizes are not allowed. 
|-WARN in [email protected] - Large window sizes are not allowed. 
|-WARN in [email protected] - MaxIndex reduced to 21 
|-WARN in [email protected] - MaxIndex reduced to 21 
|-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property 
|-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property 
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[scheduledTasksAppender] - Active log file name: C:\Users\*****\Desktop\css_dev\q_logs/scheduledTasks.log 
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[scheduledTasksAppender] - Active log file name: C:\Users\*****\Desktop\css_dev\q_logs/scheduledTasks.log 
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[scheduledTasksAppender] - File property is set to [C:\Users\*****\Desktop\css_dev\q_logs/scheduledTasks.log] 
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[scheduledTasksAppender] - File property is set to [C:\Users\*****\Desktop\css_dev\q_logs/scheduledTasks.log] 
|-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [tasks] to WARN 
|-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [tasks] to WARN 
|-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [tasks] to false 
|-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [tasks] to false 
|-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [scheduledTasksAppender] to Logger[tasks] 
|-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [scheduledTasksAppender] to Logger[tasks] 
|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration. 
|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration. 
|-INFO in [email protected] - Registering current configuration as safe fallback point 
|-INFO in [email protected] - Registering current configuration as safe fallback point 
+1

Se qualcuno viene qui con una configurazione senza "scanPeriod", tenere presente che la documentazione di logback è correntemente errata. Non esiste un intervallo di scansione predefinito. Se non si specifica scanPeriod, non verrà rieseguita! –

risposta

1

È logback.xml sembrano essere corrette.

Questo è un comportamento indicato nel manuale: http://logback.qos.ch/manual/configuration.html#autoScan,

Dato che ReconfigureOnChangeFilter viene invocato ogni volta che un logger viene richiamato, indipendentemente dal livello di logger, ReconfigureOnChangeFilter è assolutamente prestazioni critiche. Tanto che, in effetti, il controllo se il periodo di scansione è trascorso o meno, è troppo costoso in sé. Per migliorare le prestazioni, ReconfigureOnChangeFilter è in realtà "vivo" solo una volta ogni N operazioni di registrazione. A seconda della frequenza con cui l'applicazione registra, il valore di N può essere modificato al volo mediante il logback. Di default N è 16, anche se può arrivare fino a 2^16 (= 65536) per le applicazioni ad alta intensità di CPU.

In breve, quando un file di configurazione cambia, verrà ricaricato automaticamente ma solo dopo diverse chiamate del registratore e dopo un ritardo determinato dal periodo di scansione.

Basta provare a registrare altri messaggi e verificare se la configurazione è stata caricata correttamente.

Spero che questo ti aiuti.

Con i migliori saluti,

Miguel

+1

Grazie. Ne ero al corrente e ho provato a registrare oltre 100 messaggi, ancora niente. – Harinder

+0

prova ad aggiungere '' prima di nel tuo logback.xml. – MiguelKVidal

1

scansione funziona in realtà, ma la scansione è fatto sul logback.xml nel target/directory di compilazione, che non è davvero utile ...

+0

In ogni modo? –

+0

Sono passato a Spring Boot e Spring Boot Devtools, insieme ai livelli di log in application.properties funziona molto bene. Dopo ogni proprietà cambia contesto, il riavvio richiede solo 1-2 secondi. –

7

Con il logback 1.1.7, è necessario menzionare esplicitamente scanPeriod. Altrimenti, il logback non eseguirà la scansione delle modifiche. Ciò è dovuto al bug introdotto di recente (Here è il collegamento).

2

Ho affrontato un problema simile e la causa principale si è rivelata il modo in cui inizializzavo il logback.

Configurazione iniziale - Non funziona:

Di seguito è riportato il codice che ho usato per configurare logback utilizzando Joran.

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
JoranConfigurator configurator = new JoranConfigurator(); 
configurator.setContext(context); 
InputStream is = new FileInputStream(logConfigPath); // 'logConfigPath' is String path of logback.xml. 
configurator.doConfigure(is); 

Inoltre, il mio logback xml sembrava come di seguito:

<configuration scan="true" scanPeriod="60 seconds"> 
.... 
</configuration> 

In qualche modo, non è stato ri-scansione miei cambiamenti di logback.xml.

Risoluzione dei problemi

Così, ho attivato la modalità di debug in logback.xml aggiungendo di debug attributo come di seguito.

<configuration scan="true" scanPeriod="60 seconds" debug="true"> 
.... 
</configuration> 

Quando ho eseguito nuovamente l'applicazione, ho osservato una dichiarazione di registro che mostra la causa principale del problema.

12: 23: 58.462 | -warn in ch.qos.logback.classic.joran.action.ConfigurationAction - A causa a mancare file di configurazione di livello superiore, la riconfigurazione sul cambiamento (scansione dei file di configurazione) non può essere fatto .

Questo registro è stato registrato da ConfigurationAction.java classe quando non è in grado di trovare mainURL proprietà in ConfigurationWatchList.

configurazione modificata - Scansione di lavoro come un fascino

Così ho cambiato il codice in cui stavo configurando logback via JoranConfigurator. Invece di inviare InputStream come parametro a configurator.doConfigure(is) ho utilizzato il metodo doConfigure sovraccarico che accetta come parametro il percorso del file stesso. codice aggiornato si presentava così:

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
JoranConfigurator configurator = new JoranConfigurator(); 
configurator.setContext(context); 
configurator.doConfigure(logConfigPath);// 'logConfigPath' is String path of logback.xml. 

Aggiornato registro di debug:

12: 35: 37.173 | -INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - esplorerà per i cambiamenti nel [file:/E: /Samples/config/logback.xml]
12: 35: 37.173 | -INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Impostazione periodo di scansione ReconfigureOnChangeTask a 60 secondi

Questo è tutto !! Evviva :)

EDIT:

Guardando GenericConfigurator classe, si scopre che, mainURL è registrato con ConfigurationWatchList se usiamo doConfigure() metodo che prende URL, String o File come parametro.

Altri tre overload del metodo (con i parametri InputStream, InputSource o List<SaxEvent>) non lo registrano.

+0

Grande ma java 'file.lastModified' restituisce sempre la stessa ora sulla mia macchina o.O – Zarathustra