参考网上各家的资料,本人实现的功能如下:
1、自定义级别:SERIOUS
2、将log.mailLog日志信息输出到指定log文件
3、按天更新日志,并将当天日期添加在文件名中
具体参考的地址是java进阶http://www.javady.com/index.php/406.html
log4j可以实现INFO、DEBUG、ERROR等级别的日志输出,但是如果我们想自定义一个级别,并且将此级别的日志输出到指定的文件里,应该怎样做呢。
手上没有log4j的源码,只有用反编译工具对其开膛破肚了
有发现:
public class Level extends Priority
implements Serializable
{
public static final int TRACE_INT = 5000;
public static final Level OFF = new Level(2147483647, "OFF", 0);
public static final Level FATAL = new Level(50000, "FATAL", 0);
public static final Level ERROR = new Level(40000, "ERROR", 3);
public static final Level WARN = new Level(30000, "WARN", 4);
public static final Level INFO = new Level(20000, "INFO", 6);
public static final Level DEBUG = new Level(10000, "DEBUG", 7);
public static final Level TRACE = new Level(5000, "TRACE", 7);
像FATAL、ERROR这些级别,实际上对应一数字50000、40000
猜想:我们可以自己定义一个级别呀,比如我们定义一个级别:20050,暂叫做SERIOUS吧
我打算将邮件发送情况记录在这个级别的日志文件里,写了个MailLog的类,源码如下:
/**
*
* 用途:用于记录邮件发送的LOG类
*
*/
public class MailLog {
private static Logger logger = Logger.getLogger(MailLog.class);
private static class SeriousLevel extends Level {
private static final long serialVersionUID = 1076913470822079835L;
private SeriousLevel(int level, String name, int sysLogLevel) {
super(level, name, sysLogLevel);
}
}
private static final Level MAIL_LOG_LEVEL = new SeriousLevel(
20050, "SERIOUS", SyslogAppender.LOG_LOCAL0);
public static void mailLog(Object pm_objLogInfo) {
logger.log(MAIL_LOG_LEVEL, pm_objLogInfo);
}
}
log4j.xml的配置如下:
<appender name="LOG.EMAIL" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${catalina.home}/logs/EMAIL_LOG.log" />
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="20050" />
<param name="LevelMax" value="20050" />
</filter>
</appender>
测试发现不对呀,EMAIL_LOG.log这个文件里除了自定义的级别日志外,还有debug、INFO等日志,是哪里的问题呢?
注意到,配置文件里有个filter,再次开膛破肚中,看下这个类org.apache.log4j.varia.LevelRangeFilter
很明了,过滤器里有个方法decide,就是在这里进行判断过滤的,所以,我们可以参考着,自己写个filter,源码如下:
public class MailLogFilter extends Filter {
boolean acceptOnMatch = false;
int levelMin;
int levelMax;
public int getLevelMin() {
return levelMin;
}
public void setLevelMin(int levelMin) {
this.levelMin = levelMin;
}
public int getLevelMax() {
return levelMax;
}
public void setLevelMax(int levelMax) {
this.levelMax = levelMax;
}
@Override
public int decide(LoggingEvent lgEvent) {
int inputLevel = lgEvent.getLevel().toInt();
if (inputLevel >= levelMin && inputLevel <= levelMax) {
return 0;
}
return -1;
}
}
再将log4j.xml的配置里的filter更改为上面的类:
<appender name="LOG.EMAIL" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.home}/logs/EMAIL_LOG.log" />
<param name="Append" value="true"/>
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="com.test.mail.MailLogFilter">
<param name="LevelMin" value="20050" />
<param name="LevelMax" value="20050" />
</filter>
</appender>
如果XML中有category,则在相应的下面添加LOG.EMAIL即可,例如在我的配置文件中还应该有如下两段:
<category name="com">
<priority value="DEBUG"/>
<appender-ref ref="console"/>
<appender-ref ref="LOG.EMAIL"/>
</category>
<category name="jsp_servlet">
<priority value="DEBUG"/>
<appender-ref ref="console"/>
<appender-ref ref="LOG.EMAIL"/>
</category>
大功告成!
测试:在项目文件中添加如下代码进行测试
MailLog loger = newMailLog ();
loger.mailLog("mailLog测试!--SERIOUS");
可以看到控制台有输出:mailLog测试!--SERIOUS
然后要将日志输出到指定文件,需要在xml配置文件中进行控制:
<appender name="LOG.EMAIL" class="org.apache.log4j.RollingFileAppender">
此处控制日志生成模式。
RollingFileAppender:普通生成日志文件,将新日志生成到一个文件
<param name="Append" value="true"/> 该参数控制是否覆盖掉文件中已有的日志信息,默认是false,即覆盖掉已有信息而不是追加到文件中
<param name="MaxFileSize" value="5120KB" /> 此处控制当文件大小达到设定大小后,将会另起一个新日志文件
<param name="MaxBackupIndex" value="10" />
DailyRollingFileAppender:按天生成日志文件
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} 在日志文件名中添加当天日期,但是会先生成一个EMAIL_LOG.log文件(相当于临时文件),只有一天结束后才会将上一天的日志信息汇总到一个新文件并添加日期到文件名中。
具体可以参见:http://blog.csdn.net/wk_nba/article/details/4296872#reply
[%-5p] %c {%F:%L} - %m%n" /> 控制日志信息的输出格式,不在赘述!
<filter class="com.test.mail.MailLogFilter">
<param name="LevelMin" value="20050" />
<param name="LevelMax" value="20050" />
</filter>
上述可以控制只是输出loger.mailLog信息到日志文件,这对于监测工程中特定操作还是十分有效的,当让你也可以设定多个级别,只需将其控制在LevelMin和LevelMax之间,即可同时输出到日志文件,十分便捷!
上述实验亲测有效,都是在别人搭好的环境中配置而成,至于具体如何添加到一个全新的工程中,还有待细究,留作下次再讲!
本次用到的链接:
分享到:
相关推荐
根据项目需要,要求日志文件名及输出的日志内容头为特殊的格式,因此重写了log4j的一些方法,如要求的格式和项目不同,可根据示例参考进行再次的修改
本工程主要实现log4j输出多个自定义路径的日志文件,为方便大家使用
NULL 博文链接:https://zhangguoli1997.iteye.com/blog/545671
log4j、日志输出、自定义日志、多文件输出。
参照了几个网上大神配置,部分教程的描述有误,最终调试完成,可以实现kettle日志输出,测试版本...需要替换的文件为,Kettle的程序目录下data-integration-6.0\plugins\kettle5-log4j-plugin中有一个log4j.xml文件。
下面小编就为大家带来一篇Log4j按级别输出日志到不同文件的实现方法。
需求说明 (1)使用UserDaoImp1类的方法查找用户,并用User类的getUserInfo()方法输出用户信息 ... 实现思路及关键代码 (1)在测试类中调用UserDaoImp类的addUser...(1)使用log4j输出日志信息 (2)查看输出日志信息
使用log4j2实现日志数据脱敏
android自定义log日志输出工具,该工具类具有以下优点: 1 在LogUtlis方法的第一个参数中填this可以输出当前类的名称,特别是在匿名内部类使用也可以输出当前类名。 如 : LogUtils.i(this,”这是一个实用的日志...
2. log4j2 的配置详解,JDBC 配置,CloseableThreadContext 的使用(自定义输出日志文件 例如 logback MDC) 3.logback 的XML配置与使用,MDC的使用,SiftingAppender,DBAppender(c3p0,druid) 详细查看代码:README.md ...
log4qt 等,但是它们都不能和 qDebug(), qInfo() 等有机的结合在一起,所以在 Qt 中使用总觉得不够舒服,感谢 Qt 提供了 qInstallMessageHandler() 这个函数,使用这个函数可以安装自定义的日志输出处理函数,把日志...
打印日志的在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别、打印形式和日志的输出路径,下面看一个示例吧
Log4j比较全面的配置 log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true # 应用于控制台 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j....
log4j 日志服务器 一个系统可能有多个子系统组成,这些子系统都有自己的日志,并且运行在不同的操作系统和主机上,收集这些日志对运营人员来说也比较困难。 因此决定在平台中采用日志服务器来做到集中日志管理,平台...
自定义日志工具类Log4jHTMLLayout.java
几乎是网上 能找到的 日志脱敏的所有实现 1、基于正则表达式的 日志脱敏实现 ,扩展logback 、log4j 2、springmvc 返回报文脱敏。 3、基于注解方式的脱敏。 大家选择使用。
log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码,
LOG4CPP 支持多个文件,DEBUG/NOTICE/WARNING/ERROR/CRITICAL分别打到不同的文件
该日志模块包括,提供写文本和写数据库两种模式的基本功能;通过自定义model所需要的字段,记录日志信息; 可以实现记录所需记录的操作、和系统运行过程中出现的异常;
(3)使用log4j输出日志信息 2.技能训练 (1)会使用try-catch-finally捕获和处理异常 (2)会使用throw和throws (3)会使用log4j记录日志 3.实践 实践一:使用try-catch进行异常处理 需求说明 (1)使用UserDaoImp...