log4j mail

来源:互联网 发布:数据库管理系统的分类 编辑:程序博客网 时间:2024/04/30 07:54
近日调试程序过程中,发现大家常用的log4j 也有日志预警功能,可以用他来监控程序的日志
当日志级别达到咱们设定的级别之后,就会用邮件的方式预警,当然如果想发到手机,咱们可以利用139邮箱 :)
 
依赖的jar包:
log4j-1.2.15.jar(版本低于log4j-1.2.14.jar不支持smtp认证)、mail.jar、activation.jar
 
下面看看怎么配置咱们的log4j.properties 吧
 
首先,在原有log4j.properties的根logger后面加  MAIL
例如:log4j.rootCategory=INFO, stdout, logfile, MAIL 
 
之后加入以下配置:
 
# log4j的邮件发送appender,如果有必要你可以写自己的appender
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
 
#设置发送邮件的门槛,仅当等于或高于ERROR(比如FATAL)时,邮件才被发送
log4j.appender.MAIL.Threshold=ERROR
 
#邮件缓冲区大小 日志达到10K时发送Email
log4j.appender.MAIL.BufferSize=10
 
#发送邮件的邮箱帐号
log4j.appender.MAIL.From=yourmail@sina.com
 
#SMTP邮件发送服务器地址
log4j.appender.MAIL.SMTPHost=smtp.sina.com
 
#SMTP发送认证的帐号名
log4j.appender.MAIL.SMTPUsername=yourmail@sina.com
 
#SMTP发送认证帐号的密码
log4j.appender.MAIL.SMTPPassword=yourpwd
 
#是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息
log4j.appender.MAIL.SMTPDebug=false
 
#邮件主题
log4j.appender.MAIL.Subject= 警告 log4J Error Message
 
#发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔;
#如果需要bcc给某人,则加入下列行:
log4j.appender.MAIL.Bcc=yourmail@yourcompany.cn
log4j.appender.MAIL.To=yourmobile@139.com
 
#设置输出样式和内容
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
 
log4j.appender.MAIL.layout.ConversionPattern=[监控]%d{yyyy-MM-dd HH:mm:ss}-%l%m
内容可以根据自身的需要设置,包括:
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
 
如果将信息发送到手机,应尽量缩短信息内容(控制在70字符之内),在这里只设置关心的重点信息,如上我设置为 [监控]%d{yyyy-MM-dd HH:mm:ss}-%l%m
指出了出问题的全路径类名和行数,后面是logger.error("Could not open JDBC Connection for transaction")的内容。
 
不过此处存在问题如果error的内容存在中文的话会是乱码  :(
补救的措施为:
写一个HTMLLayout的子类,覆盖HTMLLayout的getContentType方法
package com;
import org.apache.log4j.HTMLLayout;
public class Log4jMailLayout extends HTMLLayout{ 
    public String getContentType() { 
    return "text/html;charset=GBK"; 
    } 
}
并且在log4j.properties中配置log4j.appender.MAIL.layout=com.Log4jMailLayout
这样邮件中收到的信息:
Log session start time Wed Aug 26 17:14:42 CST 2009

TimeThreadLevelCategoryMessage34453DefaultQuartzScheduler_Worker-7ERRORcom.testCould not open JDBC Connection for transaction

如果想改变布局,不妨可以重写HTMLLayout类,已到达需要的效果。