`

log4j自定义级别并将新级别日志信息输出到指定带日期格式的log文件

 
阅读更多

参考网上各家的资料,本人实现的功能如下:

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同样提供了相应的解决方案。 首先,让我们深入理解如何自定义日志文件名。默认情况下,Log4j的日志文件名通常是固定的或者基于时间戳生成...

    log4j自定义错误级别配置demo

    在项目的配置文件(通常是`log4j.properties`或`log4j.xml`)中,需要定义这些自定义级别的输出目的地和格式,这样日志处理器才能正确地处理并记录这些级别的信息。 5. **在代码中使用**: 最后,应用程序中的...

    动态设置log4j的日志级别

    Log4j是Apache组织提供的一款广泛使用的日志框架,它允许开发者灵活地控制日志信息的输出。本文将详细讲解如何动态设置Log4j的日志级别,以满足不同场景下的需求。 首先,我们要理解日志级别的概念。Log4j提供了多...

    log4j输出多个自定义路径的日志文件小例子

    Appender是Log4j中负责将日志信息输出到指定目的地的组件,例如文件、控制台、网络等。以下是一个简单的`log4j.properties`配置示例: ```properties # 配置文件开头 log4j.rootLogger=DEBUG, appender1, appender2...

    Log4j2实现不同线程不同级别日志输出到不同的文件中

    在“Log4j2实现不同线程不同级别日志输出到不同的文件中”这个主题中,我们将深入探讨如何利用Log4j2实现这一高级日志管理需求。 1. **日志级别**: - 在Log4j2中,日志级别包括DEBUG、INFO、WARN、ERROR、FATAL...

    log4j自定义

    3. **自定义日志输出目的地**:Log4j支持将日志输出到控制台、文件、数据库甚至网络。通过配置`Appender`,我们可以选择将日志发送到自定义的位置,如自定义的FTP服务器或者HTTP接口。 4. **自定义日志过滤器**:...

    log4j(三):配置文件属性解释、级别、布局、参数设置等

    本文将深入解析Log4j的配置文件属性、日志级别、布局方式以及参数设置等核心知识点,帮助你更好地理解和利用这个强大的工具。 一、配置文件属性解释 Log4j的核心配置文件通常是`log4j.properties`或`log4j.xml`,它...

    Log4j将System.out搞到log4j中输出四

    总结来说,Log4j提供了一套强大的日志管理框架,通过自定义Appender和PrintStream,我们可以轻松地将`System.out.println()`的输出整合到Log4j中,从而实现日志的集中管理和分析。这对于大型项目或者需要严格监控的...

    log4j多文件输出打印

    本话题将深入探讨如何使用Log4j实现多文件输出打印,以及自定义日志的配置。 首先,我们要理解Log4j的基本工作原理。Log4j的核心组件包括Logger、Appender和Layout。Logger负责生成日志事件,Appender则负责接收...

    log4j生成带时间戳的日志文件(包括extras包以及简单demo)

    - **配置文件**:Log4j通过配置文件(通常是log4j.properties或log4j.xml)来定义日志行为,包括日志输出位置、格式、级别等。 2. **生成带时间戳的日志** 在Log4j中,我们可以自定义日志格式来包含时间戳。例如...

    使用log4j2实现日志数据脱敏

    Log4j2支持多种日志记录级别(如DEBUG、INFO、WARN、ERROR),并允许通过XML、JSON、YAML或纯Java配置文件进行灵活配置。 二、日志数据脱敏概念 日志数据脱敏是指在不影响日志分析的前提下,对敏感信息进行替换、...

    log4j日志配置以及配置文件详解

    这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. **Logger**: 定义日志级别,例如DEBUG、INFO、WARN、ERROR和FATAL。日志级别决定了哪些信息会被记录。...

    Tomcat使用Log4j输出catalina.out日志

    通过以上步骤,Tomcat服务器将使用Log4j来管理catalina.out日志,这不但解决了日志文件过大和格式不统一的问题,而且提供了更丰富的日志管理功能,例如,可以利用Log4j强大的过滤、路由和格式化等功能,将日志管理得...

    Log4net自定义信息(变量或属性或字段)存入数据库

    本主题聚焦于如何利用Log4net将自定义信息,如变量、属性或字段,存储到数据库中,这对于监控应用状态、分析错误和追踪性能异常至关重要。 首先,Log4net提供了一个灵活的配置机制,允许开发者通过XML配置文件或...

    log4j配置 输出日志 案例

    `log4j配置输出日志案例.doc`文档中应该包含了更详细的配置和实际运行案例,包括如何调整日志级别、设置过滤器、自定义日志格式等。这些案例可以帮助读者更好地理解和应用log4j,解决实际开发中的日志管理问题。 ##...

    log4j日志输出格式化和日志文件名格式化

    本文将深入探讨如何利用Log4j进行日志输出格式化以及设置日志文件名格式化,以满足公司的标准化需求。 首先,我们来看日志输出格式化。Log4j的核心在于其灵活性,可以通过自定义布局模板来控制日志输出的格式。最...

    java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    本文将详细讲解如何使用Log4j实现自定义日志输出到多个文件。 首先,Log4j的核心概念是`Logger`和`Appender`。`Logger`负责生成日志事件,而`Appender`则负责处理这些事件,例如将其写入文件、控制台或其他输出目的...

    Log4j按级别输出日志到不同文件的实现方法

    以下是一个基于文本配置(`log4j.properties`)的示例,展示了如何设置不同的日志级别输出到各自的文件: ```properties # 设置root logger级别为info,并将其输出到stdout和多个文件appender log4j.rootLogger=...

    Log4j 把不同包的日志打印到不同位置

    这篇博客"Log4j 把不同包的日志打印到不同位置"可能详细解释了如何利用Log4j配置来实现特定包的日志定向输出,以便于管理和分析来自不同模块的日志信息。 在Java应用中,我们常常会遇到多个模块或者不同包的类同时...

Global site tag (gtag.js) - Google Analytics