Sitemap
Arif Dwi Prasetya

Arif Dwi Prasetya

Springboot — Log

2 min readMay 10, 2026

--

Press enter or click to view image in full size

Hari ke 26 mencoba konsisten menulis, hari ini kita akan mencoba membuat logback di springboot yaa, langsung saja kita ye kan.

Fungsi Utama

  1. Konfigurasi Logging Menggantikan logback.xml biasa dengan versi yang mendukung fitur Spring, seperti springProfile dan springProperty.
  2. 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">
Press enter or click to view image in full size

Sekian singkat log artikel ini ye kan, semoga bermanfaat. Terima kasih

— Arif Dwi Prasetya

--

--