Springboot — Log
Hari ke 26 mencoba konsisten menulis, hari ini kita akan mencoba membuat logback di springboot yaa, langsung saja kita ye kan.
Fungsi Utama
- Konfigurasi Logging Menggantikan
logback.xmlbiasa dengan versi yang mendukung fitur Spring, sepertispringProfiledanspringProperty. - Profile-based Logging Mengaktifkan konfigurasi logging berbeda berdasarkan Spring profile (dev, staging, prod):
Lokasi File
Letakkan di: src/main/resources/logback-spring.xml
logback-spring.xml
<configuration scan="true">
<!-- ===================================================== -->
<!-- Appender Console -->
<!-- ===================================================== -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- ===================================================== -->
<!-- Appender File Info & Debug -->
<!-- ===================================================== -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- Rolling per hari, max 10MB per file -->
<fileNamePattern>logs/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ===================================================== -->
<!-- Appender File WARN -->
<!-- ===================================================== -->
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<!-- ===================================================== -->
<!-- Appender File ERROR -->
<!-- ===================================================== -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- ===================================================== -->
<!-- Root logger -->
<!-- ===================================================== -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</root>
<!-- ===================================================== -->
<!-- Contoh level log per package -->
<!-- ===================================================== -->
<logger name="com.example" level="DEBUG"/>
<logger name="org.springframework" level="WARN"/>
</configuration><root level="INFO">
<appender-ref ref="CONSOLE" />Ini untuk mendaftarkan appender ditasnya
<logger name="com.example" level="DEBUG"/>ini log specific package tertentu, specific package akan mewarisi tag root. Jadi file log akan tetap terbentuk di kasus ini
Trace < Debug < Info < WARN < ERROR < FATAL
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>Hanya menerima filter tepat di levelnya, disini INFO
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>Log semua level diatasnya tapi tidak dibawahnya, misal error berarti hanya log error & fatal
Get Arif Dwi Prasetya’s stories in your inbox
Join Medium for free to get updates from this writer.
Levelnya bisa lihat di atas itu yaa
<filter class="ch.qos.logback.classic.filter.LevelRangeFilter">
<levelMin>INFO</levelMin>
<levelMax>ERROR</levelMax>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>Log akan mencetak dari level INFO → ERROR. Jadi DEBUG, TRACE tidak akan di log
<filter class="ch.qos.logback.classic.filter.EvaluatorFilter">
<evaluator>
<expression>return message.contains("FAILED");</expression>
</evaluator>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>Filter berdasarkan kondisi tertentu, disini adalah message yg mengandung FAILED
Secara UMUM berarti dibagi menjadi 4 Filter
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<filter class="ch.qos.logback.classic.filter.LevelRangeFilter">
<filter class="ch.qos.logback.classic.filter.EvaluatorFilter">Sekian singkat log artikel ini ye kan, semoga bermanfaat. Terima kasih
— Arif Dwi Prasetya










