2018年2月6日 星期二

Logback 輸出 Log 到 CloudWatch

本來沒有特別使用 CloudWatch 的習慣
不過應用程式放在 VM 裡,如果不控管的話,Log 總有一天會把 VM 硬碟塞爆
而如果去設定控制大小,則又會有關鍵 Log 可能被洗掉的問題。
剛好最近寫不少 AWS Lambda 的程式,覺得 Log 丟去 CloudWatch 其實也還蠻方便的 XD
就找了一下該怎麼做這件事。

關鍵字搜尋,可以找到好幾個 Logback 的擴充套件
目前實驗的是以 [1] 來測試的,選擇的原因…..其實也沒什麼特別的原因 XD
它是 fork 另一個專案 [2] 來的,然後 [2] 看起來星星稍多一點,但好像蠻久沒更新了
所以就用 [1] 看看,而且 [1] 也有上 Maven Central,用起來方便些。

Maven 設定

要使用 [1] 的擴充套件,首先要先自行引用相關的套件

<dependency>
	<groupId>co.wrisk.logback</groupId>
	<artifactId>logback-ext-cloudwatch-appender</artifactId>
	<version>1.0.9</version>
</dependency>

其中 1.0.9 版是目前 [1] 的 tag 顯示的最新版。

Logback 設定

接著就要設定 Logback 的設定檔,讓它使用 CloudWatch 作為輸出標的。

<configuration>
	<appender name="CLOUDWATCH" class="org.eluder.logback.ext.cloudwatch.appender.CloudWatchAppender">
	    <region>us-west-2</region>
	    <logGroup>/my-app/loggroup</logGroup>
	    <logStream>logs</logStream>
	    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>%logger{36} | %msg%n</Pattern>
		</encoder>
	</appender>
	
	<logger name="org.apache.http" level="INFO" additivity="false" />
	<logger name="com.amazonaws" level="INFO" additivity="false" />
	
	<!-- Set the default logging level to "ALL" level for loggers which are not specified. -->
	<root level="ALL">
		<appender-ref ref="CLOUDWATCH" />
	</root>
</configuration>

這裡假設在 CloudWatch 上,Log Group 的名字是 /my-app/loggroup,並且 Log Stream 名字是 logs
然後沒有特別設定 AWS 的 Access Key 和 Access Secret,因為程式預期會直接在 EC2 上執行
因此預設要它自己讀取 EC2 的 Role。
如果需要手動設定的話,可以額外給 accessKey 和 secretKey 這兩個屬性(放在跟 logGroup 同層)。

然後~就沒有然後了,可以直接執行程式看看狀況如何。
另外需要稍微注意的是,Logback 至少需要是 1.2.x 版。
然後如果像我一樣要讓它讀取 EC2 的 Role,EC2 的 Role 需要有能夠存取 CloudWatch 的權限。

參考資料
  1. WriskHQ/logback-ext
  2. trautonen/logback-ext

沒有留言: