Skip to main content

Log4j EmailAppender Configuration

Log4j SMTPAppender 使用時機

  • 通常針對 Scheduler 相關的程式,我會額外撰寫許多 log 輸出。例如程式走到哪個步驟了,我走訪的資料走到那一筆了,整個動作花費了多少時間等等。相關資訊可以供後續異常或效能分析以及 cron job 調整。相關步驟都是為了營運持續管理(BCM)與風險管理(RM),Log4j 在這當中的角色除了軌跡紀錄外其實也可為主動報警機制的一環。
  • 下列介紹便是以 org.apache.log4j.net.SMTPAppender 主動報警的相關設定方式。

log4j.xml 定義 SMTPAppender Filter

  • 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>

Java 程式借用 Log4j 寄信機制 (選配)

  • 上方範例建立了一個名為 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 的其他 Appenders 設定範例

  • 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>