项目上线后,运行时往往也还会有异常发生,在异常抛出时,希望即时的得到反馈。所以需要配置LOG4J的发送EMAIL功能。

项目中原来使用的的Log4j版本为1.2.9 ,但此版本并不支持邮件服务的认证功能 ,遂重新下载了最新的版本1.2.14 ,查看源代码
此版本支持认证功能 ,下面是 log4j.properties 的具体配置 :

## ROOT
log4j.rootLogger=INFO,CONSOLE,A_default,MAIL

## CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=INFO
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.CONSOLE.layout.ConversionPattern=[调试信息]%-5p %c %x - %m%n

## A_default
log4j.appender.A_default=org.apache.log4j.RollingFileAppender
log4j.appender.A_default.Threshold=INFO
log4j.appender.A_default.File=${webframe.root}/WEB-INF/logs/railstone.log
log4j.appender.A_default.MaxFileSize=4000KB
log4j.appender.A_default.MaxBackupIndex=10
log4j.appender.A_default.layout=org.apache.log4j.PatternLayout
log4j.appender.A_default.layout.ConversionPattern=[调试信息]%-5p %c %x - %m%n

## MAIL
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
# 日志的错误级别
log4j.appender.MAIL.Threshold=ERROR 
# 缓存文件大小,日志达到512K时发送Email
log4j.appender.MAIL.BufferSize=512
# 发送邮件的服务器
log4j.appender.MAIL.SMTPHost=smtp.163.com
# 邮件的标题
log4j.appender.MAIL.Subject=Log4J ErrorMessage
# 用户名
log4j.appender.MAIL.SMTPUsername=邮箱用户名
# 密码
log4j.appender.MAIL.SMTPPassword=邮箱密码
# 发件人地址
log4j.appender.MAIL.From=test@163.com 
# 日志邮件的接收者
log4j.appender.MAIL.To=test@163.com 
# 日志PatternLayout
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
# 日志的格式
log4j.appender.MAIL.layout.ConversionPattern=[ErrorMessage ] %d - %c -%-4r [%t] %-5p %c %x - %m%n

在配置完毕后,发现 即使是将 log4j.appender.MAIL.Threshold=ERROR 修改为 INFO 级别 ,也只有在日志输出级别为 ERROR (即代码中调用logger.error("message")方法)时才会发送邮件,不知道是什么原因,

Log4J发日志邮件给多个接收者及标题、正文乱码问题

利用javamail发送邮件,你需要导入包mail.jar和activation.jar这两个包 ,否则是没法发邮件的 ,下边配置文件里绿色行显示的就是发给两个接收者ac和ae。

这里会出现中文乱码问题,主要有两方面的乱码,一是标题乱码;二是正文乱码。下边具体说明这两种乱码的解决方案。 
一、 标题乱码 
Log4J日志邮件的标题在配置文件log4j.properties里设定,如下 
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=FATAL 
log4j.appender.MAIL.BufferSize=10 
log4j.appender.MAIL.From=ab@163.com
log4j.appender.MAIL.SMTPHost=smtp@163.com
log4j.appender.MAIL.Subject= Log4J提醒您:系统发生了严重错误 
log4j.appender.MAIL.To=ac @163.com,ae@163.com
log4j.appender.MAIL.layout=com.sun.DefineLayOut 
log4j.appender.MAIL.layout.LocationInfo=true

灰色的行就是标题,log4J配置文件默认的读取方式是ISO-88591,遇到中文会出现乱码,我们可以把这个配置文件log4j.properties用jdk的工具native2asii转换一下编码方式。 
命令:native2asii log4j.properties log4jxx.properties 
把这个log4jxx.properties改名为log4j.properties取代原来的log4j.properties就ok了。 
灰色行重新编码后是: 
log4j.appender.MAIL.Subject=Log4J\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef

二、 正文乱码 
        正文乱码,解决也比较简单。阅读Log4J的源码类SMTPAppender,我们可以发现sendBuffer()方法中有这样一句: 
part.setContent(sbuf.toString(), layout.getContentType()); 
我们继续追踪发现layout就是配置文件里的layout属性对应的布局模式。但是这些布局模式都是继承自Layout,而contentType是只 可通过getContentType方法取得,不能修改。所有的布局模式getContentType方法返回的都是”text/plain”; 
为处理中文乱码,我们可以写一个布局模式。如果你要使用HTMLLayout,我们就写一个HTMLLayout的子类,覆盖HTMLLayout的 getContentType方法即可。假如我要用org.apache.log4j.HTMLLayout。我们就可以写一个DefineLayOut 类,代码如下: 
package com.sun;

import org.apache.log4j.HTMLLayout; 
public class DefineLayOut extends HTMLLayout{ 
public String getContentType() { 
return "text/html;charset=GBK"; 


对应的配置文件设置如黄色行所示。

来源:http://jlk.iteye.com/blog/354216

配置方式2:

Log4j发送日志邮件的作用: 
      项目错误信息能及时(实时)反映给项目维护人员以及相关负责人。

优点: 
      1.快速响应; 
      2.共同监督; 
      3.邮件正文直接显示了错误信息,拷贝信息比登陆服务器再查找要方便; 
      4.在日志信息继续写入文件的前提下,多了另外一种获取信息的渠道。

补充:Log4j可以实现输出到控制台,文件,回滚文件,发送日志邮件,数据库,自定义标签。 
发送邮件的一个重要的类是SMTPAppender,之前用的是 log4j-1.2.8,在1.2.8的版本中,SMTPAppender没有SMTPPassword 和SMTPUsername 属性。这两个属性分别是登录SMTP服务器发送认证的用户名和密码。

依赖的jar包: 
log4j-1.2.15.jar(版本低于log4j-1.2.14.jar不支持SMTP认证) 
mail.jar 
activation.jar

在log4j.properties文件中配置:

### send error through email.
#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=xxx@163.com
#SMTP邮件发送服务器地址
log4j.appender.MAIL.SMTPHost=smtp.163.com
#SMTP发送认证的帐号名
log4j.appender.MAIL.SMTPUsername=xxx@163.com
#SMTP发送认证帐号的密码
log4j.appender.MAIL.SMTPPassword=xxx
#是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息
log4j.appender.MAIL.SMTPDebug=false
#邮件主题
log4j.appender.MAIL.Subject=Log4JErrorMessage
#发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔;
#如果需要发副本给某人,则加入下列行
#log4j.appender.MAIL.Bcc=xxx@xxx.xxx
log4j.appender.MAIL.To=xxx@xxx.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework]%d - %c -%-4r[%t]%-5p %c %x -%m%n

Log4j的SMTP的级别默认是ERROR级别 
默认是ERROR级别,那就是说,只有程序出错了,才可以收到邮件。不过可以自定义的级别,继承TriggeringEventEvaluator类,覆盖里面的一个方法:

 @Override
public boolean isTriggeringEvent(LoggingEvent arg0) {
return arg0.getLevel().isGreaterOrEqual(Level.INFO);
}

SMTPAppender 实现是,每当isTriggeringEvent()这个方法返回true的时候,它都会发送邮件。这样的话,一个程序执行下来,每个有能力触发的事件都会形成一封邮件。 
事件的个数达到bufferSize的一半的时候就会发一封邮件: 
继承了SMTPAppender类,重写了append方法 ;

 @Override
public void append(LoggingEvent event) {
if (!checkEntryConditions()) {
return;
}
event.getThreadName();
event.getNDC();
event.getMDCCopy();
if (this.getLocationInfo()) {
event.getLocationInformation();
}
cb.add(event);
if (evaluator.isTriggeringEvent(event)) {
if (cb.length() > this.getBufferSize() / 2) {
sendBuffer();
}
}
}

另外一个问题也随之产生了,当程序结束时,还在缓冲里面的事件是不会被发送出来的。因为事件数往往没有bufferSize的一半。

public   *****SMTPAppender() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
if (cb.length() > 0) {
sendBuffer();
}
}
});
}

log4j有网页格式的输出:

log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout  

解决邮件中的中文乱码问题,继承HTMLLayout,覆盖getContentType方法

@Override
public String getContentType() {
return "text/html;charset=GBK";
}

Log4j 发送 EMail 的配置的更多相关文章

  1. Phabricator 在 centos 系统下发送 Email的配置

    前言 phabricator 配置email 其实很简单,配好smtp 服务器.端口.协议.用户名和登陆密码,但过程却好麻烦. 开始时跟着官网配 sendmail ,又 google 又 baidu, ...

  2. spring boot 学习(十)SpringBoot配置发送Email

    SpringBoot配置发送Email 引入依赖 在 pom.xml 文件中引入邮件配置: <dependency> <groupId>org.springframework. ...

  3. Log4j发送日志邮件功能

    昨天配置了log4j发送错误日志的功能,很实用,记录一下! Log4j可以实现输出到控制台,文件,回滚文件,发送日志邮件,数据库,自定义标签.例如: log4j.rootLogger=DEBUG, I ...

  4. Spring 发送 Email

    本文转自:http://zl198751.iteye.com/blog/757617 看到了本文,收获颇丰,感谢之至! 首先介绍下Email的发送流程: 需要选中smtp邮件服务器,Yahoo不提供免 ...

  5. 使用PHP发送email进行账号激活或者密码修改操作

    使用PHPMailer编写发送邮件 PHPMailer需PHP的socket扩展支持,而PHPMailer链接qq域名邮箱时需要ssl加密方式(qq邮箱最近做了限制,新开域名邮箱不再允许通过smtp协 ...

  6. asp.net发送E-mail

    发送电子邮件也是项目开发当中经常用到的功能,这里我整理了一个发送电子邮件(带附件,支持多用户发送,主送.抄送)的类库,供大家参考. 先上两个实体类,用于封装成Mail对象. /// <summa ...

  7. 使用spring 并加载模板发送Email 发邮件 java 模板

    以下例子是使用spring发送email,然后加载到固定的模板,挺好的,大家可以试试 需要使用到spring-context 包 和 com.springsource.org.apache.veloc ...

  8. [Python] 发送email的几种方式

    python发送email还是比較简单的,能够通过登录邮件服务来发送,linux下也能够使用调用sendmail命令来发送,还能够使用本地或者是远程的smtp服务来发送邮件,无论是单个,群发,还是抄送 ...

  9. 循序渐进看Java web日志跟踪(3)-Log4J的使用和配置

    之前说过关于java日志跟踪的几大主要用的框架,也说到了,其实在其中,Log4J充当着一个相当重要的角色.目前,大部分框架也都是采用的是Log4J,虽然说它已经停止了更新,作者也重新起了LogBack ...

随机推荐

  1. Canvas的save和restore

    在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? int px = getMeasuredWidth(); int py = getMeasuredWid ...

  2. ansible判定文件或者文件夹是否存在

    ansible 的常用模块中没有判定当文件存在或者不存在时,执行某个执行 使用下面方法能简单判定某个文件是否存在 --- - name: judge a file or dir is exits sh ...

  3. MariaDB备份和恢复

    一.为什么要备份? 灾难恢复:硬件故障.软件故障.自然灾害.黑客攻击.误操作: 测试二.要注意的要点: 能容忍最多丢失多少数据: 恢复数据需要多长时间内完成: 需要恢复哪些数据: (1)做还原测试,用 ...

  4. SQL基础三

    一.SQL ORDER BY 子句 ORDER BY 语句用于对结果集进行排序,默认按照升序对记录进行排序,如果需要按照降序进行排序,需要在后面追加关键字DESC.应用如下: 原始的表:Orders表 ...

  5. 华为大数据项目fusionInsight

    项目简述:基于开源Hadoop2.0架构的集群网络,进行海量数据的分布式计算.由于Hadoop集群规模不断扩大,而搭建一个同等规模的测试集群需要一笔昂贵的开销.目前有100台左右物料,期望预测计算节点 ...

  6. Memcached基础介绍

    1.memcached是什么,有什么作用? )memcached是一个开源的.高性能的内存的缓存软件,从名称上看mem就是内存的意思,而cache就是缓存的意思. )memcached通过在事先规划好 ...

  7. redhat 9.0安装完不能上网解决办法(补) - 并附上redhat9.0 下载链接

    昨天一位网友Q我,说我的开发环境搭建教程按步骤最后上不了网怎么解决我才突然想起9.0版本在VM7,8中存在问题,于是今天我就简单说下解决的方法. 由于本人习惯使用redhat 9.0版本所以到现在还是 ...

  8. Django_内置Admin

    Django内置Admin   Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.co ...

  9. leetcode每日一题——反转整数

    题目: 反转整数 难度: 简单 描述: 给定一个 32 位有符号整数,将整数中的数字进行反转. 解法: class Solution { public int reverse(int x) { //i ...

  10. nodejs两个例子

    1.nodejs多线程 var cluster=require("cluster");//ͨ¹ýcluster¿ÉÒÔ·Ö³öһЩ×ÓÏß³Ì var http=requir ...