Logback etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Logback etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

26 Aralık 2023 Salı

Logback logback.xml FileAppender Tanımlama

Örnek
Şöyle yaparız. Burada farklı log seviyeleri farklı dosyalara gönderiliyor. ch.qos.logback.classic.filter.ThresholdFilter ve ch.qos.logback.classic.filter.LevelFilter kullanılıyor. 
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">

  <property name="logging.error.file.name" value="error-log" />
  <property name="logging.error.file.path" value="./"/>
  <property name="logging.file.name" value="info-log" />
  <property name="logging.file.path" value="./"/>

  <!-- Normal log appender -->
  <appender name="INFO_FILE" class="ch.qos.logback.core.FileAppender">
    <file>${logging.file.path}/${logging.file.name}</file>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO, DEBUG, TRACE</level>
    </filter>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR, WARN</level>
      <onMatch>DENY</onMatch>
      <onMisMatch>NEUTRAL</onMisMatch>
    </filter>
  </appender>

  <!-- Error log appender -->
  <appender name="ERROR_FILE" class="ch.qos.logback.core.FileAppender">
    <file>${logging.error.file.path}/${logging.error.file.name}</file>
      <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>ERROR, WARN</level>
      </filter>
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO, DEBUG, WARN</level>
        <onMatch>DENY</onMatch>
        <onMisMatch>NEUTRAL</onMisMatch>
      </filter>
    </appender>

  <root level="INFO">
    <appender-ref ref="INFO_FILE"/>
    <appender-ref ref="ERROR_FILE"/>
  </root>
</configuration>
Açıklaması şöyle
- Trace < Debug < Info < Warn < Error < Fatal

- LevelFilter filters events based on exact level matching. If the event's level is equal to the configured level, the filter accepts or denies the event, depending on the configuration of the onMatch and onMismatch properties.

- The ThresholdFilter filters events below the specified threshold. 
1. Normal appender ThresholdFilter ile INFO, DEBUG, TRACE olaylarının altındakileri kabul etmez. 

2. Error appender ThresholdFilter ile ERROR, WARN olaylarının altındakileri kabul etmez.



15 Eylül 2022 Perşembe

Logback logback.xml - Property Kullanımı

Giriş
Değişken <property> tag ile tanımlanır. Erişilen yerde ${...} şeklinde kullanılır

Örnek
Şöyle yaparız
<property name="MAX_FILE_SIZE" value="1MB"/>

<appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
  ...
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    ...
  </rollingPolicy>
</appender>

14 Eylül 2022 Çarşamba

Logback logback.xml Console Appender Tanımlama

Giriş
class olarak "ch.qos.logback.core.ConsoleAppender" kullanmak gerekiyor. Daha sonra da bir encoder tanımlamak lazım

encoder
pattern içinde log formatı belirtilir.
layout belirtilir ama ne olduğunu tam bilmiyorum

Örnek
Şöyle yaparız.
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  ...  
</configuration>
Örnek
Şöyle yaparız.
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </layout>
    </encoder>
  </appender>
  ...
</configuration>
Örnek - renkli çıktı
Şöyle yaparız
<?xml version="1.0" encoding="UTF-8"?>
<included>
  <conversionRule conversionWord="customHighlightingLogLevel" converterClass="com.emcrey.common.config.CustomHighlightingLogLevel" />
  <conversionRule conversionWord="customHighlightingPackageName" converterClass="com.emcrey.common.config.CustomHighlightingPackageName" />
  <conversionRule conversionWord="customHighlightingMessage" converterClass="com.emcrey.common.config.CustomHighlightingMessage" />

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
   <pattern>%customHighlightingLogLevel(%d{yyyy-MM-dd HH:mm:ss} %-5level) %customHighlightingPackageName(%logger{40}.%M\(%line\)): %customHighlightingMessage(%msg%n)</pattern>
  </encoder>
 </appender>
 
 <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>/tmp/logs/apex-fraud-broker.log</file>
  <append>true</append>
  <immediateFlush>true</immediateFlush>
  <encoder>
   <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{40}.%M\(%line\): %msg%n</pattern>
  </encoder>
 </appender>
 
 <logger name="com.emcrey" level="debug">
  <appender-ref ref="STDOUT"/>
  <appender-ref ref="FILE"/>
 </logger>
 
 <logger name="org.springframework" level="error">
  <appender-ref ref="STDOUT"/>
  <appender-ref ref="FILE"/>
 </logger>
</included>
Sınıflar şöyle
public class CustomHighlightingLogLevel 
  extends ForegroundCompositeConverterBase<ILoggingEvent> {

  @Override
  protected String getForegroundColorCode(ILoggingEvent event) {
    Level level = event.getLevel();
    switch (level.toInt()) {
      case Level.ERROR_INT:
        return ANSIConstants.RED_FG;
      case Level.WARN_INT:
        return ANSIConstants.YELLOW_FG;
      default:
        return ANSIConstants.DEFAULT_FG;
    }
  }
}

public class CustomHighlightingMessage 
  extends ForegroundCompositeConverterBase<ILoggingEvent> {

  @Override
  protected String getForegroundColorCode(ILoggingEvent event) {
    Level level = event.getLevel();
    switch (level.toInt()) {
      case Level.ERROR_INT:
        return ANSIConstants.RED_FG;
      case Level.WARN_INT:
        return ANSIConstants.YELLOW_FG;
      default:
        return ANSIConstants.DEFAULT_FG;
    }
  }
}

public class CustomHighlightingPackageName 
  extends ForegroundCompositeConverterBase<ILoggingEvent> {

  @Override
  protected String getForegroundColorCode(ILoggingEvent event) {
    Level level = event.getLevel();
    switch (level.toInt()) {
      case Level.ERROR_INT:
        return ANSIConstants.RED_FG;
      case Level.WARN_INT:
        return ANSIConstants.YELLOW_FG;
      default:
        return ANSIConstants.CYAN_FG;
    }
  }
}



29 Haziran 2021 Salı

Logback ConsoleAppender Sınıfı

pattern Alanı
Örnek
Şöyle yaparız.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <pattern>%msg%n</pattern>
  </encoder>
</appender>
Örnek
Şöyle yaparız.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </layout>
  </encoder>
</appender>
filter
Şöyle yaparız. Sadece error seviyesini konsola basar.
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <pattern>%date{yyyyMMdd HH:mm:ss.SSS} %highlight(%-5level) %magenta(%-30.30([%thread])) %cyan(%-35.35logger{35}) %-30(\(%file:%line\)) - %msg%n</pattern>
  </encoder>
  <!--Log only errors to console-->
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
  </filter>
</appender>

withJansi Alanı
Örnek
Şöyle yaparız.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <withJansi>true</withJansi>
  <encoder>
    <pattern>...</pattern>
  </encoder>
</appender>

25 Haziran 2021 Cuma

Logback logback.xml RollingFileAppender Tanımlama

Giriş
Appender altında şu tag'ler kullanılır
file
filter 
rollingPolicy
encoder

file Tag
filename değerini atamakta fayda var. Böylece en yeni dosyanın ismi her zaman bellidir.

rollingPolicy Tag
TimeBasedRollingPolicy, SizeAndTimeBasedRollingPolicy, FixedWindowRollingPolicy olabilir.

TimeBasedRollingPolicy Tag
Her gün yeni bir dosyaya geçilebilir. 
Şu alanlar belirtilir.

fileNamePattern
timeBasedFileNamingAndTriggeringPolicy : maxFileSize
maxHistory : Kaç tane dosya saklanacağını değil, dosyaların kaç birim süre boyunca saklanacağını belirtir.
totalSizeCap : Açıklaması şöyle
The optional totalSizeCap property controls the total size of all archive files.
Örnek
Şöyle yaparız
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <fileNamePattern>/logs/api-%d{yyyy-MM-dd}.%i.log.json.gz
  </fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy 
    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

    <maxFileSize>10MB</maxFileSize>
  </timeBasedFileNamingAndTriggeringPolicy>
  <maxHistory>10</maxHistory> <!-- 10 gün sakla -->

</rollingPolicy>
Açıklaması şöyle
When using a TimeBasedRollingPolicy in Logback, it seems to be fairly common that it doesn’t operate as expected. One setting in particular seems to be a bit misleading — maxHistory
Örnek
Şöyle yaparız.
<appender name="ROOT_ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${LOG_HOME}/main-error.log</file>
  <filter class="logging.LogbackCustomFilter"/>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- daily rollover -->
    <fileNamePattern>${LOG_HOME}/main-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <timeBasedFileNamingAndTriggeringPolicy
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
       <!-- or whenever the file size reaches 1GB -->
      <maxFileSize>1GB</maxFileSize>
    </timeBasedFileNamingAndTriggeringPolicy>
    <!-- keep 7 days' worth of history -->
    <maxHistory>7</maxHistory>
  </rollingPolicy>
  <encoder>
    <pattern>%date %-5level [%thread] - [%logger] - %msg%n</pattern>
  </encoder>
</appender>
SizeAndTimeBasedRollingPolicy Tag
Her gün yeni bir dosyaya geçilebilir veya dosya büyüklüğü belli bir sınırı aşınca yeni dosyaya geçilebilir.

Örnek - totalSizeCap
İstenirse geçmişse ait belli bir gün kadar dosya ve en fazla belli bir toplam değer kadar disk alanı kullanır.  Burada önemli bir nokta var. Temizlenecek dosyalar fileNamePattern'a göre aranıyor. Yani fileNamePattern bir regex olarak kullanılıyor. Eğer fileNamePattern kendi içinde timestamp gibi bir şey kullanıyorsa temizleme gerçekleşmez. Elimizde şöyle bir xml olsun. Burada fileNamePattern içinde uzantıdan önce timestamp var. Dolayısıyla temizleme olmuyor
<configuration ...>
  <timestamp key="timestamp" datePattern="HH.mm,ss"/>
  ...
  <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>log/foo.log</file>
    <encoder>
      <pattern>%date{yyyMMdd HH:mm:ss.SSS} -%-32([%thread]) %-5level %-36logger{20}
%-30(\(%file:%line\)) - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>log/foo-%d{yyy-MM-dd} (run at $(timestamp}).%i.log</fileNamePatter>
      ...
    </rollingPolicy
  </appender>
...
</configuration>
Şöyle yaparız
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>mylog.txt</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file is at most 100MB, keep 60 days worth of history,but at most 20GB -->
    <maxFileSize>100MB</maxFileSize>    
    <maxHistory>60</maxHistory>
    <totalSizeCap>20GB</totalSizeCap>
  </rollingPolicy>
  <encoder>
    <pattern>%msg%n</pattern>
  </encoder>
</appender>
Eğer uygulama açılırken eski dosyaları silsin istiyorsak cleanHistoryOnStart kullanılır. Şöyle yaparız.
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file is at most 100MB, keep 60 days worth of history,but at most 20GB -->
    <maxFileSize>100MB</maxFileSize>    
    <maxHistory>60</maxHistory>
    <totalSizeCap>20GB</totalSizeCap>
  <cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
FixedWindowRollingPolicy Tag
Sadece belli sayıda log dosyası saklar. Saklanacak dosya sayısı minIndex ve maxIndex ile belirtilir.
Örnek
Şöyle yaparız.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>logs/touchpoint.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <fileNamePattern>logs/touchpoint.%i.log.zip</fileNamePattern>
    <minIndex>1</minIndex>
    <maxIndex>3</maxIndex>
  </rollingPolicy>

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

19 Nisan 2021 Pazartesi

Logback logback.xml

Giriş
1. Appender'lar tanımlanır. Appender'larda encoder + layout bilgisi bulunur
2. paket isimleri veya sınıflar için logger ve seviyeleri tanımlanır.
3. Appender'lar root logger'a eklenir

Dosyanın Yolu
Açıklaması şöyle
The program uses a default configuration file named logback.xml or logback-test.xml, which should be located in the classpath in our case, we put the file in java/main/resources.

If neither of these files is found on the classpath, logback will default to invoking BasicConfigurator which will set up a minimal configuration. This minimal configuration consists of a ConsoleAppender attached to the root logger. The output is formatted using a PatternLayoutEncoder set to the pattern %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n. Moreover, by default the root logger is assigned the DEBUG level.
Farklı Bir Yol Kullanmak
Açıklaması şöyle
If you want to use a different configuration file, you can specify its location by setting the logback.configurationFile system property to the file path, like this:

java -Dlogback.configurationFile=/path/to/logback.xml
You can set the system property programmatically in your application code, like this:

System.setProperty("logback.configurationFile", "/path/to/logback.xml");

This should be done before Logback is initialized (i.e., before any logging calls are made). Once the system property is set, Logback will use the specified configuration file instead of the default one.

Örnek
Ben logback.xml dosyasını src/main/resource/logback.xml olarak sevmiyorum. 
1. maven-resources-plugin ile bu dosyayı jar ile aynı seviyeye kopyalıyorum. 
2. Uygulamayı çalıştırırken logback.xml dosyasını belirtiyorum
java -Dlogback.configurationFile=file:logback.xml -jar myjar.jar
Dosyadaki Hatalar
Dosyadaki hataları bulmak için şöyle yaparız
-Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
configuration tag
debug="true" yaparsak, logback başlarken bazı bilgileri gösterir. Açıklaması şöyle
You can add the debug="true" attribute to the <configuration> element to enable debug of the logback configuration. It will print the configuration to the console
Örnek - scanPeriod
Şöyle yaparız. scanPeriod kaç saniyede bir xml dosyasını tekrar okuyacağını belirtir.
<configuration debug="false" scan="true", scanPeriod=20">
appender tag
name Alanı
Örnek
Şöyle yaparız.
<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    ...
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    ...
  </appender>

  <root level="debug">
    <appender-ref ref="FILE" />
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
Örnek
Şöyle yaparız.
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <layout class="com.touchcorp.touchpoint.utils.MaskingPatternLayout">
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </layout>
    </encoder>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/touchpoint.log</file>
      <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>logs/touchpoint.%i.log.zip</fileNamePattern>
        <minIndex>1</minIndex>
         <maxIndex>3</maxIndex>
      </rollingPolicy>

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


  <logger name="com.touchcorp.touchpoint" level="DEBUG" />
  <logger name="org.springframework.web.servlet.mvc" level="TRACE" />

  <root level="INFO">
    <appender-ref ref="FILE" />
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
Örnek
Şöyle yaparız
<configuration>
  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="file" class="ch.qos.logback.core.FileAppender">
    <file>logback.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>

  <logger name="com.example.javasandbox" level="WARN" />
</configuration>
encoder tag
Örnek
Şöyle yaparız
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>

  <logger name="com.ning.http.client" level="WARN"/>
</configuration>