2015年10月29日 星期四

使用 logback 時,在 Jetty 上忽略 Jetty 產生的 log

在部署專案時,嘗試了使用 slf4j + logback
不過部署到 Jetty 上就發現 Jetty 瘋狂地印出 Jetty 自己運行時的 debug log
變成要在 log 海中找到自己的 application log 非常花時間。


花了些時間搜尋之後,發現其實 Jetty 根本沒吃到我寫在專案的 src/main/resources 裡的 logback.xml 檔
從 Jetty 的官方文件 [2] 看來,Jetty 的通用設定檔會放在 ${jetty.home}/resources/logback.xml 這個路徑
而從我看到的 log 來說,大多數的 Jetty log 都來自 o.e 和 org.eclipse.jetty 兩個 package
因此解決方法就是在 Jetty 的 resources 資料夾中,建立 logback.xml 這個設定檔
並且寫入以下的內容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<!-- Define the default standard out appender for outputing logs. -->
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %logger{36} [%thread] | %msg%n</Pattern>
		</layout>
	</appender>
	
	<!-- Ignore the debug logs from Jetty. -->
	<logger name="o.e" level="INFO" additivity="false" />
	<logger name="org.eclipse.jetty" level="INFO" additivity="false" />
	
	<!-- Set the default logging level to "DEBUG" level for loggers which are not specified above. -->
	<root level="TRACE">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

上述的設定檔是說,所有的 log 只要是 TRACE 等級以上就會輸出
但是遇到 o.e 和 org.eclipse.jetty 套件(和他們的子套件)的話,則只輸出 INFO 以上的等級。
而依照設定的樣式,輸出的 log 是長這樣:
2015-10-29 18:08:36.033 | DEBUG | jndi [main] | InitialContextFactory.getInitialContext()
2015-10-29 18:08:36.034 | DEBUG | jndi [main] | Created initial context delegate for local namespace:org.eclipse.jetty.jndi.local.localContextRoot@44c5a16f
2015-10-29 18:08:36.034 | DEBUG | jndi [main] | Looking up name="comp"
2015-10-29 18:08:36.034 | DEBUG | jndi [main] | Trying thread context classloader

參考資料:
  1. logback logback.xml常用配置详解(一)<configuration> and <logger>
  2. Jetty/Tutorial/Sifting Logs with Logback

沒有留言: