2015-02-14 23 views
5

Mam problemy z uruchomieniem funkcji automatycznego skanowania logback. Wygląda na to, że nie odbiera zmian. Dodałem debug = "true" do sekcji i odczytu jej wyników, wszystko wydaje się w porządku. Wyraźnie widać, że plik logback.xml jest monitorowany pod kątem zmian co 30 sekund. Nie rozumiem, dlaczego zmiany nie są odbierane. Po prostu szukam wskazówek, jak mogę rozwiązać ten problem. Dziękuję Ci.Skanowanie logback nie działa

Powinienem wspomnieć, że logback jest logowaniem do pliku po prostu dobrze, tylko że zmiany w pliku konfiguracji logback nie są pobierane.

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

wyjścia logowania do serwera Tomcat, gdy aplikacja internetowa zaczyna:

|-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 ch.qos.logba[email protected] - 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

Jeśli ktoś przyjdzie tutaj z konfiguracją bez "scanPeriod", należy pamiętać, że dokumentacja logback jest obecnie niepoprawna. Nie ma domyślnego interwału skanowania. Jeśli nie określisz opcji scanPeriod, nie będzie ona ponownie skanowana! –

Odpowiedz

1

logback.xml pojawiasz się za prawidłowe.

To zachowanie podano w instrukcji: http://logback.qos.ch/manual/configuration.html#autoScan,

Zważywszy, że ReconfigureOnChangeFilter jest wywoływana za każdym razem, każdy rejestrator jest wywoływana, niezależnie od poziomu rejestratora, ReconfigureOnChangeFilter wydajność jest absolutnie krytyczna. Tak naprawdę to sprawdzenie, czy okres skanowania minął, jest zbyt kosztowne samo w sobie. Aby poprawić wydajność, ReconfigureOnChangeFilter jest w rzeczywistości "żywy" tylko raz na każde operacje rejestrowania. W zależności od tego, jak często logi aplikacji, wartość N może być modyfikowana w locie przez logback. Domyślnie N wynosi 16, ale może wynosić nawet 2^16 (= 65536) dla aplikacji intensywnie obciążających procesor.

W skrócie, po zmianie pliku konfiguracyjnego zostanie on automatycznie ponownie załadowany, ale dopiero po kilku wywołaniach rejestratora i po upływie określonego czasu skanowania.

Po prostu spróbuj zapisać więcej wiadomości i sprawdź, czy konfiguracja została poprawnie załadowana.

Mam nadzieję, że ci to pomoże.

poważaniem,

Miguel

+1

Dzięki. Byłem tego świadomy i próbowałem zalogować ponad 100 wiadomości, wciąż nic. – Harinder

+0

spróbuj dodać '' przed w twoim logback.xml. – MiguelKVidal

1

Skanowanie działa właściwie, ale skanowanie odbywa się na logback.xml w tarczy/build katalogu, który nie jest bardzo pomocna ...

+0

W jakiś sposób? –

+0

Po przełączeniu na Spring Boot & Spring Boot Devtools, razem z poziomami logów w application.properties działa bardzo dobrze. Po każdej zmianie właściwości kontekst restart trwa tylko 1-2 sekundy. –

7

Z logbackem 1.1.7, scanPeriod należy wyraźnie wymienić. W przeciwnym razie logback nie będzie skanował zmian. Wynika to z niedawno wprowadzonego błędu (link: Here).

2

Napotkałem podobny problem, a przyczyną źródłową okazał się sposób, w jaki inicjowałem logowanie zwrotne.

Konfiguracja początkowa - Nie działa:

Poniżej znajduje się kod, który kiedyś skonfigurować logback użyciu Jøran.

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

Ponadto moja logback xml wyglądał jak poniżej:

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

Jakoś nie było ponowne skanowanie moje zmiany w logback.xml.

Rozwiązywanie

Więc włączony tryb debugowania w logback.xml dodając debugowania atrybutu jak poniżej.

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

Po ponownym uruchomieniu aplikacji zaobserwowałem komunikat dziennika wskazujący przyczynę problemu.

12: 23: 58462 | -WARN w ch.qos.logback.classic.joran.action.ConfigurationAction - Ze względu na brak plik konfiguracyjny najwyższym poziomie, rekonfigurację sprawie zmian (skanowanie pliku konfiguracyjnego) nie mogą być wykonane .

Ten dziennik jest rejestrowane przez ConfigurationAction.java klasie, gdy nie jest w stanie znaleźć mainURL nieruchomość w ConfigurationWatchList.

Zmodyfikowana konfiguracja - Skanowanie działa jak czar

więc zmieniłem kod gdzie byłem konfigurowanie logback poprzez JoranConfigurator. Zamiast wysyłać InputStream jako parametr do configurator.doConfigure(is) użyłem przeciążonej metody doConfigure, która pobiera ścieżkę pliku jako parametr. Zaktualizowany kod wyglądał tak:

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

Aktualizacja dziennika debugowania:

12: 35: 37173 | -info w ch.qos.logback.classic.joran.action.ConfigurationAction - Przeskanuje zmian w [file:/E: /Samples/config/logback.xml]
12: 35: 37.173 | -info w ch.qos.logback.classic.joran.action.ConfigurationAction - Ustawianie ReconfigureOnChangeTask okres skanowania do 60 sekund

To wszystko !! Hurra :)

EDIT:

Patrząc na GenericConfigurator klasy, okazuje się, że mainURL jest zarejestrowany ConfigurationWatchList jeśli używamy doConfigure() metodę, która przyjmuje URLString lub File jako parametr.

Pozostałe trzy przeciążenia metody (z parametrami InputStream, InputSource lub List<SaxEvent>) nie rejestrują tego.

+0

Świetne, ale plik 'file.lastModified' java zwraca zawsze ten sam czas na mojej maszynie o.O – Zarathustra