2024年8月12日 星期一

Logback 設定

最近在調整自己開發的系統的 log。程式使用 Spring Boot,log 使用 logback。

我的目的是要讓其 log 到一定量就自動壓縮成 .gz檔、每天壓縮。

原先我的寫法是:

<?xml version="1.0"?>
<configuration>
	<timestamp key="timestamp" datePattern="yyyy-MM-dd"/>
	<property name="default_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n" />
	<property name="log_path" value="logs" />

	<appender name="LOG" class="ch.qos.logback.core.FileAppender">
		<file>${log_path}/system-${timestamp}.log</file>
		<encoder>
			<pattern>${default_pattern}</pattern>
		</encoder>
	</appender>

	<!-- 中間 <logger> 省略 --> 
	<root level="ERROR"/>
</configuration>

然後參考其他人的,改成

<?xml version="1.0"?>
<configuration>
	<timestamp key="timestamp" datePattern="yyyy-MM-dd"/>
	<property name="default_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n" />
	<property name="log_path" value="logs" />

	<appender name="LOG" class="ch.qos.logback.core.FileAppender">
		<file>${log_path}/system.log</file>
		<encoder>
			<pattern>${default_pattern}</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>{log_path}/system-%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<!-- 中間 <logger> 省略 --> 
	<root level="ERROR"/>
</configuration>

但是,卻會報出如下錯誤

ERROR in ch.qos.logback.core.joran.spi.Interpreter@29:18 - no applicable action for [maxFileSize]

根據我在網路上的資料,這錯誤是因為<rollingPolicy> 的設定是 logback 的插件,而 spring 在掃瞄 logback 設定檔時間較早,導致插件無法讀取,進而出現錯誤(不過其實真正的原因我也不是很確定就是)。

要修改就得改成

<?xml version="1.0"?>
<configuration>
	<timestamp key="timestamp" datePattern="yyyy-MM-dd"/>
	<property name="default_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread][%-5level][%logger{36}] %msg %n" />
	<property name="log_path" value="logs" />


	<!-- appender class 從 FileAppender 改成 RollingFileAppender --> 
	<appender name="LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log_path}/system.log</file>
		<encoder>
			<pattern>${default_pattern}</pattern>
		</encoder>

		<!-- 下面照舊 --> 
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_path}/system-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<!-- 中間 <logger> 省略 -->
	<root level="ERROR"/>
</configuration>

參考資料

Chen, K. (2022, October 21). 六角鼠年鐵人賽 Week 13 - Spring Boot - 一次搞懂 LogBack 設定. HackMD. Retrieved August 12, 2024, from https://hackmd.io/@KaiChen/B1MjzutuL
疯狂攻城师. (2021, November 29). SpringBoot深度解析-04Springboot日志Logging_Logging.Pattern.Level. CSDN博客. Retrieved August 12, 2024, from https://blog.csdn.net/lijunliang2017/article/details/121607999
fatih. (2022, January 22). RE: ERROR in ch.qos.logback.core.joran.spi.Interpreter- no applicable action for [maxHistory]. Stack Overflow. Retrieved August 12, 2024, from https://stackoverflow.com/a/70860583

沒有留言:

張貼留言