- 浏览: 875690 次
- 性别:
- 来自: 美国图森
最新评论
-
jnjeC:
jake_12345 写道大哥,这写错了吧Class.isAs ...
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
lgh1992314:
https://my.oschina.net/xianggao ...
Servlet生命周期 -
qq412796770:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
技术无涯苦作舟:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
lgh1992314:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
log4j想必大家都很熟了,它是apache组织旗下的一个开源项目,用于记录程序运行时的一些信息,这些信息有助于我们分析程序的性能找出bug。log4j共有六个级别,按级别升序排序分别是
TRACK | 记录比debug级别还要详细的信息(finer-grained 细颗粒度) |
DEBUG | 记录程序运行时一些有用的信息,用来分析程序的性能,发现bug(finer-grained 细颗粒度) |
INFO | 记录程序运行时正常输出的提示信息(coarse-grained 粗颗粒度) |
WARN | 指明程序运行状态处在欠佳状态,可能会出现异常情况。 |
ERROR | 指明程序发生了错误,但还可以允许程序继续运行。 |
FATAL | 指明程序发生了非常重大的错误,并引导程序停止运行。 |
一般情况下这几个级别已经够用,但在一些情况下并不能满足我们的要求,例如在我开发的自动跟踪定位程序中,要每间隔10秒针钟查询一次数据库,取出当前时间需要定位的终端然后发起定位,每定一次位需要从账户中扣除一定的费用,如果费用被扣完,则要向客服及市场部发送提醒邮件,提醒xxx企业已经欠费,请联系该企业及时充值。这实现这样的功能,这几个级别显然不能满足我们的要求的,所以要自定义一个级别,专门用来发送提醒邮件的
1、自定义级别类
package com.tdt.log4j.extend; import org.apache.log4j.Level; /** * @project MRMAutoloc * @author sunnylocus * @vresion 1.0 2009-7-22 * @description 自定义级别REMIND,该级别用来发送提醒邮件,级别要比INFO低 */ public class TDTLevel extends Level { private static final long serialVersionUID = 7288304330257085144L; static public final int REMIND_INT = Level.INFO_INT - 1; static public final int LETHAL_INT = Level.FATAL_INT + 1; private static String REMIND_STR = "REMIND"; private static String LETHAL_STR = "LETHAL"; public static final TDTLevel REMIND = new TDTLevel(REMIND_INT, REMIND_STR,7); public static final TDTLevel LETHAL = new TDTLevel(LETHAL_INT, LETHAL_STR,0); protected TDTLevel(int level, String strLevel, int syslogEquiv) { super(level, strLevel, syslogEquiv); } /** * Convert the string passed as argument to a level. If the conversion * fails, then this method returns {@link #REMIND}. */ public static Level toLevel(String sArg) { return (Level) toLevel(sArg, TDTLevel.REMIND); } public static Level toLevel(String sArg, Level defaultValue) { if (sArg == null) { return defaultValue; } String stringVal = sArg.toUpperCase(); if (stringVal.equals(REMIND_STR)) { return TDTLevel.REMIND; } else if (stringVal.equals(LETHAL_STR)) { return TDTLevel.LETHAL; } return Level.toLevel(sArg, (Level) defaultValue); } public static Level toLevel(int i) throws IllegalArgumentException { switch (i) { case REMIND_INT: return TDTLevel.REMIND; case LETHAL_INT: return TDTLevel.LETHAL; } return Level.toLevel(i); } }
写好自定义级别,还要作邮件发送策略的处理
2、邮件发送处理类
package com.tdt.log4j.extend; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.TriggeringEventEvaluator; import com.tdt.util.DateUtil; public final class MockTriggeringEventEvaluator { //处理程序出错邮件提醒 public final static class ErrorMockTriggeringEventEvaluator implements TriggeringEventEvaluator{ private static boolean isSended = false;//是否已发送邮件 private static String senedTime ="";//发送时间 @Override public boolean isTriggeringEvent(LoggingEvent arg0) { if(!isSended) { isSended = true;////标记邮件已发送 senedTime = DateUtil.currentTime(); Logger.getLogger(getClass()).info("已发送程序出错提醒邮件!"); return true; } String currentTime = DateUtil.currentTime(); if(DateUtil.calculateTimeoutByMinute(senedTime, currentTime) > 10) { //距上次发送邮件已超过10分名钟,再次发送邮件 return true; } return false; } } //处理企业欠费邮件提醒 public final static class RemindMockTriggeringEventEvaluator implements TriggeringEventEvaluator{ public boolean isTriggeringEvent(LoggingEvent arg0) { Logger.getLogger(getClass()).info("已发送企业欠费提醒邮件!"); return true; //欠费邮件不作处理,直接发送 } } }
3、日期工具类
package com.tdt.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @project MRMAutoloc * @author sunnylocus * @vresion 1.0 2009-7-13 * @description 日期工具类,提供日期的加减及比较 */ public class DateUtil { /** *@return String 当前时间(格式yyyyMMddHHmmss) */ public static String currentTime(){ SimpleDateFormat formate = new SimpleDateFormat("yyyyMMddHHmmss"); Calendar calendar = Calendar.getInstance(); return formate.format(calendar.getTime()); } /** * 计算两个时间之间相差多少分钟 * @param pretiem 之前的时间 (格式:yyyyMMddHHmmss) * @param currentTime 现在的时间 (格式:yyyyMMddHHmmss) * @return int 相差多少分钟 */ public static int calculateTimeoutByMinute(String pretiem,String currentTime) { try { //设置时间 SimpleDateFormat formate = new SimpleDateFormat("yyyyMMddHHmmss"); Calendar calendar = Calendar.getInstance(); calendar.setTime(formate.parse(pretiem)); int pre =calendar.get(Calendar.MINUTE); calendar.setTime(formate.parse(currentTime)); int curr = calendar.get(Calendar.MINUTE); return (curr - pre); } catch (ParseException e) { throw new IllegalArgumentException(e); } } }
测试
package com.tdt.test;
import org.apache.log4j.Logger;
import com.tdt.log4j.extend.TDTLevel;
public class TestSendMail {
static Logger log = Logger.getLogger(TestSendMail.class);
public static void main(String[] args) {
log.log(TDTLevel.REMIND, "测试,xxx,企业欠费,该企业所属终端的定位请求将被过滤");
log.error("测试,程序运行发生了一个错误");
log.error("测试,程序运行发生了一个错误");
}
}
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true" xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- 企业欠费邮件提醒 ,发送至客服,市场部-->
<appender name="LOG.REMIND_SMTP" class="org.apache.log4j.net.SMTPAppender">
<param name="from" value="support@tdt-lbs.com" />
<param name="to" value="zhangweiyang@tdt-lbs.com,kefu@tdt-lbs.com,shichang@tdt-lbs.com" /><!--多个邮件地址用逗号分割-->
<param name="subject" value="企业欠费通知" />
<param name="SMTPHost" value="mail.tdt-lbs.com" />
<triggeringPolicy class="com.tdt.log4j.extend.MockTriggeringEventEvaluator$RemindMockTriggeringEventEvaluator" /> <!--邮件发送策略,自已定义-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
<!-- 级别过滤 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="REMIND#com.tdt.log4j.extend.TDTLevel" /> <!--在这里添加我们自定义的级别,注意#号不能少 -->
<param name="LevelMax" value="REMIND#com.tdt.log4j.extend.TDTLevel" />
</filter>
</appender>
<!-- 程序出错邮件提醒,发送至程序开发人员 -->
<appender name="LOG.ERROR_SMTP" class="org.apache.log4j.net.SMTPAppender">
<param name="from" value="support@tdt-lbs.com" />
<param name="to" value="zhangweiyang@tdt-lbs.com" />
<param name="subject" value="MRM平台自动跟踪定位程序出错" />
<param name="SMTPHost" value="mail.tdt-lbs.com" />
<triggeringPolicy
class="com.tdt.log4j.extend.MockTriggeringEventEvaluator$ErrorMockTriggeringEventEvaluator" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{2} - %m%n" />
</layout>
<!-- 级别过滤 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="LOG.REMIND_SMTP" />
<appender-ref ref="LOG.ERROR_SMTP" />
</root>
</log4j:configuration>
然后在log4j.xml配置我们自定义的级别。大家最好用xml配置log4j的参数,因为properties的方式已经过时,log4j不推荐使用。
收到两封邮件
对错误邮件的发送,间隔控制在10分钟,如果不作控制一旦程序(多线程情况下)出错,每个线程会发送相同内容的邮件,会把你的信箱填满。
对邮件正文出现乱码解决的方案
将org.apache.log4j.Layout类
public String getContentType() {
return "text/plain";
}
改为
public String getContentType() {
return "text/plain;charset=UTF-8";
}
然后重新编译,将编译后的类替换原来的class文件
要实现发送邮件功能需要在classpath设置mail.jar文件。我已经打包上传
- javamail-1.4.2.rar (2.5 MB)
- 下载次数: 223
评论
发表评论
-
人在江湖:如何用代码保护自己
2011-10-12 16:30 11428现在上一点规模的 ... -
Spring freemarker页面乱码解决
2011-01-13 11:56 7565在开发过程中遇到乱码十分的头痛,如果你在开发过程中也遇 ... -
数据漂白算法研究
2010-12-07 18:05 3827你的手机是不是 ... -
理解使用static import 机制
2010-11-09 08:48 3236J2SE 1.5里引入了“Sta ... -
理解多线程设计模式
2010-11-08 17:43 10547多线程设计模式:1.Single Threaded Execu ... -
理解ThreadLocal
2010-11-03 17:04 1967ThreadLocal是什么 早在JDK 1 ... -
经验总结:高性能的数据同步
2010-11-03 10:03 6456最近在做一个银行的生产数据脱敏系统,今天写代码时遇到 ... -
用JSSE实现网络安全通信
2010-06-25 15:11 3896在网络上信息由源主机到目标主机要经过很多路由和计算机, ... -
Java实时监控日志文件并输出
2010-06-19 17:21 61327最近有一个银行数据漂白系统,要求操作人员在页面调用远端 ... -
Junit测试private方法
2010-04-28 14:09 8077package com.bill99.junit; pu ... -
保护眼睛的豆沙色
2010-03-19 09:46 3602作我们IT这行的,一天要盯着电脑看,时间长了眼睛会感觉发酸 ... -
中国联通短信网关接入程序源代码(SGIP1.2协议)
2010-01-11 12:23 43300自从我发了博文“中国联通SP业务开发总结”后有很多的朋友问 ... -
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
2009-12-24 13:14 67558原地址:http://topic.csdn.net/t/200 ... -
非阻塞通信
2009-12-03 11:43 4669对于用ServerSocket和Socket写的服务 ... -
处理线程泄露
2009-12-01 15:10 8629当一个单线程化 ... -
在Timer和ScheduledExecutorService间决择
2009-11-27 10:25 13430java.util.Timer计时器有管理任务延迟执行(& ... -
Socket通信模式:收发线程互斥
2009-11-14 19:09 8782有做过通信程序或着短信接入程序的程序员都知道,与之 ... -
ASCII码对照表
2009-11-12 11:26 2599ASCII表 ASCII值 控制字符 ASC ... -
java.net.SocketException: Software caused connection abort: recv failed 异常分析
2009-11-12 11:01 15826java.net.SocketException: Softw ... -
用State模式减少if..elseif语句
2009-11-03 17:20 7129我们在写程序的过 ...
相关推荐
### log4j实用配置扩展 #### 一、log4j简介与重要性 Log4j是一种广泛使用的开源日志框架,由Apache软件基金会维护。它主要用于记录Java应用程序的运行时信息,帮助开发者追踪应用程序的行为、调试问题以及进行性能...
Log4j2支持多种日志记录级别(如DEBUG、INFO、WARN、ERROR),并允许通过XML、JSON、YAML或纯Java配置文件进行灵活配置。 二、日志数据脱敏概念 日志数据脱敏是指在不影响日志分析的前提下,对敏感信息进行替换、...
在这个特定的配置场景中,我们将探讨如何设置log4j,使其能将不同级别的日志信息分别记录到不同的文件中,并且具备发送邮件通知的能力。 首先,我们需要创建一个log4j的配置文件,通常命名为`log4j.properties`。这...
在上述代码中,`logger`对象是通过`LoggerFactory.getLogger()`获取的,它会自动根据类名查找合适的日志实现,即Log4j。 4. **运行测试**:在`test-log4j`目录中的测试代码,应该是用来验证上述配置和日志记录功能...
扩展Log4j的日志级别涉及以下几个关键步骤: 1. **创建自定义级别类**: 首先,需要创建一个新的类来扩展`Level`类,这是Log4j中表示日志级别的类。在自定义的类中,通常需要覆盖父类的构造函数,以便为新的级别...
在Log4j中,控制日志级别主要通过配置文件`log4j.properties`或`log4j.xml`来实现。在提供的压缩包`log4j-demo`中,我们可以找到这样的配置文件。例如,如果我们想要控制特定类`com.example.MyClass`的日志级别为...
**描述解读:** 描述提到“支持用户在项目中对项目上线后出现问题得到及时的提醒”,这表明Log4j配置为在发生错误或特定级别的日志事件时,自动通过电子邮件通知开发者或运维人员。这样,即使在系统无人值守的情况下...
Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中轻松地记录各种级别的日志信息,如DEBUG、INFO、WARN、ERROR等。在2021年底,一个重大的安全漏洞(CVE-2021-44228)被发现在Log4j2的早期版本中,...
10. **优化的并发支持**:Log4j2利用Java 5提供的并发特性,能够在较低级别上执行锁定操作,有效避免了Log4j 1.x中出现的死锁问题。 ### Log4j2与Log4j效率对比 #### 测试环境与方法 为了准确评估Log4j2与Log4j...
下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来比较Log4j和Log4j2的区别。 配置文件类型 Log4j通过一个.properties文件作为主配置文件,而Log4j2则弃用了这种方式,采用的是.xml、.json或者....
要实现动态设置Log4j日志级别,通常有以下几种方法: 1. **通过配置文件**:最常见的方式是通过修改log4j.properties或log4j.xml配置文件。例如,你可以将某个类或整个包的日志级别设置为WARN: ```xml ```...
总结来说,扩展Log4j框架主要是通过自定义Appender实现的,这使得日志系统更加灵活,能够适应各种特定的业务需求。理解Appender的工作原理以及如何创建和配置它们,对于提升Java应用的日志管理能力至关重要。在实际...
分别有disruptor-3.3.4.jar(Log4j2异步日志的底层实现)、log4j-api-2.19.0.jar(log4j门面)、log4j-core-2.19.0.jar(log4j实现)、log4j-slf4j-impl-2.19.0.jar(SLF4J与Log4j绑定)、slf4j-api-1.7.30.jar(SLF...
本教程将详细介绍如何配置Log4j来实现日志信息通过电子邮件发送,以便于及时获取系统异常或关键事件的通知。 首先,我们需要理解Log4j的基本架构。Log4j包括三个核心组件:Logger(日志器)、Appender(输出器)和...
配置Log4j通常通过一个XML或JSON格式的配置文件完成,例如`log4j2.xml`或`log4j2.json`,这个文件定义了日志的输出级别、目的地(如控制台、文件、数据库等)以及格式。 总的来说,Log4j 2是Java开发中不可或缺的...
### Java中Log4j的扩展写法 #### 一、引言 在Java开发中,日志记录是一项非常重要的功能,它有助于跟踪程序运行时的状态并帮助开发者进行问题定位和性能优化。Log4j作为一款优秀的日志管理工具,被广泛应用于各种...
在“Log4j2实现不同线程不同级别日志输出到不同的文件中”这个主题中,我们将深入探讨如何利用Log4j2实现这一高级日志管理需求。 1. **日志级别**: - 在Log4j2中,日志级别包括DEBUG、INFO、WARN、ERROR、FATAL...
10. **可扩展性**:Log4j API允许开发者通过插件机制轻松添加新的appender、filter和layout。 总的来说,Log4j API为Java开发者提供了一个强大而灵活的日志解决方案,通过其丰富的功能和可定制性,能够适应各种项目...
在实际应用中,将`log4j.jar`添加到项目的类路径中,并根据项目需求定制`log4j.properties`,即可实现有效的日志管理。这不仅有助于问题排查,也有利于系统维护和性能优化,因为过多的日志可能会占用大量磁盘空间,...
四、在 Maven 项目中引入 Log4j 依赖 在 Maven 项目中,需要引入 Log4j 依赖项,以便使用 Log4j。下面是一个基本的 Maven 依赖项配置: ``` <groupId>log4j <artifactId>log4j <version>1.2.16 ``` 这个配置...