Log4j EmailAppender Configuration
- 通常針對 Scheduler 相關的程式,我會額外撰寫許多 log 輸出。例如程式走到哪個步驟了,我走訪的資料走到那一筆了,整個動作花費了多少時間等等。相關資訊可以供後續異常或效能分析以及 cron job 調整。相關步驟都是為了營運持續管理(BCM)與風險管理(RM),Log4j 在這當中的角色除了軌跡紀錄外其實也可為主動報警機制的一環。
- 下列介紹便是以 org.apache.log4j.net.SMTPAppender 主動報警的相關設定方式。
- Mail appender : from / to / subject / SMTPHost 設定
- 相關參數可以在 build 過程置換,會是以其他技巧經由 *.properties 帶入。這邊不贅述。
- Mail appender filter 設定 : 指定要寄信的 logger 等級。
- 完成下方設定時當 logger 紀錄 error 至 fatal 間的訊息時便會一併寄信通知指定人員。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<appender name="EmailAppender">
<param name="BufferSize" value="512" />
<param name="SMTPHost" value="xxx.xxx.xxx.xxx" />
<param name="From" value="mailFrom@dummy.org" />
<param name="To" value="mailToAdmin@dummy.org" />
<param name="Subject" value="Subject of Exception Mail" />
<layout>
<param name="ConversionPattern"
value="%d\{dd-MM-yy HH:mm:ss,SSS\} %-5p %c - %m%n" />
</layout>
<filter>
<param name="LevelMin" value="error" />
<param name="LevelMax" value="fatal" />
</filter>
</appender>
<logger name="exceptionEmailAppenderLogger" additivity="false">
<appender-ref ref="EmailAppender" />
</logger>
- 上方範例建立了一個名為 exceptionEmailAppenderLogger 的 logger
- 這邊 additivity="false" 意味著不繼承自 root,不會將資訊輸出至 root 的 appender。只輸出到自己 Appender 所指定位置。
- 程式碼中其實可以利用 logger name 直接取 exceptionEmailAppenderLogger 然後寄信。
- 範例如下: EmailAppenderLogger.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package totem.log4j.logger.mail;
public class EmailAppenderLogger implements EmailLogger{
private boolean disableMail;
private final static Logger logger = Logger
.getLogger("exceptionEmailAppenderLogger");
@Override
public void sendMessage(String message) {
if (!disableMail){
logger.error(message);
}
}
public void setDisableMail(boolean disableMail) {
this.disableMail = disableMail;
}
}
Spring Context 與 Log4j 整合寄信功能 (選配)
- 既然上方都建立了一個寄信工具(EmailAppenderLogger.java) 那不如直接將他交給 Spring 管理,需要時直接 Injection。
- Spring Application Context 設定範例如下:
- applicationContext-log4j.xml
1
2
3
4
5
6
<bean id="emailAppenderLogger"
class="totem.log4j.logger.mail.EmailAppenderLogger">
<property name="disableMail" value="${mail.disable}" />
</bean>
- log4j.xml
- ConsoleAppender
- DailyRollingFileAppender
- SMTPAppender
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- 指定message 輸出到console -->
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{dd-MM-yy HH:mm:ss,SSS} %-5p %c - %m%n" />
</layout>
</appender>
<!-- 指定message輸出到指定檔,輸出等級為INFO以上 -->
<appender name="FILE_INFO"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${java.io.tmpdi}/logs/cable_info.log" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message -->
<param name="ConversionPattern"
value="%d{dd-MM-yy HH:mm:ss,SSS} %-5p %c{2} - %m%n" />
</layout>
</appender>
<!-- 指定message 輸出到指定檔,輸出等級為WARN以上 -->
<appender name="FILE_WARN"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${java.io.tmpdir}/logs/cable_error.log" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Threshold" value="warn" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message
-->
<param name="ConversionPattern"
value="%d{dd-MM-yy HH:mm:ss,SSS} %-5p %c - %m%n" />
</layout>
</appender>
<appender name="EmailAppender" class="org.apache.log4j.net.SMTPAppender">
<param name="BufferSize" value="512" />
<param name="SMTPHost" value="dummySmtpHost" />
<param name="From" value="dummyFrom" />
<param name="To" value="dummyTo" />
<param name="Subject" value="dummySubject" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{dd-MM-yy HH:mm:ss,SSS} %-5p %c - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="error" />
<param name="LevelMax" value="fatal" />
</filter>
</appender>
<appender name="CATALINA"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${java.io.tmpdir}/logs/catalina.out" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{dd-MM-yy HH:mm:ss,SSS} %-5p %c{2} - %m%n" />
</layout>
</appender>
<logger name="exceptionEmailAppenderLogger" additivity="false">
<appender-ref ref="EmailAppender" />
</logger>
<root>
<level value="info" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="CATALINA" />
</root>
<//log4j:configuration>