自定义log4j日志级别

转载自:  http://blog.csdn.net/seven_cm/article/details/26849821

参考了网上资料:http://www.360doc.com/content/13/0527/11/10825198_288498671.shtml

因为项目中需要输出一些特别的日志来做数据统计。如果开启log4j提供的INFO日志级别,每天生成的日志文件就会变得越来越大。这样就得写个定
时任务来删除这个文件。为了只输出所需的日志级别,唯有自己定义一个log4j的级别,这样一来就好控制了,而且不需要对之前的代码进行修改。好了,废话
不多说,上代码:

1、CustomerLog

[java] view plain copy

  1. package common.log;
  2. import org.apache.log4j.Level;
  3. import org.apache.log4j.Logger;
  4. import org.apache.log4j.net.SyslogAppender;
  5. public class CustomerLog {
  6. /**
  7. * 继承Level
  8. * @author Sevencm
  9. *
  10. */
  11. private static class CustomerLogLevel extends Level{
  12. public CustomerLogLevel(int level, String levelStr, int syslogEquivalent) {
  13. super(level, levelStr, syslogEquivalent);
  14. }
  15. }
  16. /**
  17. * 自定义级别名称,以及级别范围
  18. */
  19. private static final Level CustomerLevel = new CustomerLogLevel(20050,"CUSTOMER",SyslogAppender.LOG_LOCAL0);
  20. /**
  21. * 使用日志打印logger中的log方法
  22. *
  23. * @param logger
  24. * @param objLogInfo
  25. */
  26. public static void customerLog(Logger logger,Object objLogInfo){
  27. logger.log(CustomerLevel, objLogInfo);
  28. }
  29. }

2、Log Filter

[java] view plain copy

  1. package common.log;
  2. import org.apache.log4j.spi.Filter;
  3. import org.apache.log4j.spi.LoggingEvent;
  4. public class CustomerLogFilter extends Filter {
  5. boolean acceptOnMatch = false;
  6. private String levelMin;
  7. private String levelMax;
  8. public String getLevelMin() {
  9. return levelMin;
  10. }
  11. public void setLevelMin(String levelMin) {
  12. this.levelMin = levelMin;
  13. }
  14. public String getLevelMax() {
  15. return levelMax;
  16. }
  17. public void setLevelMax(String levelMax) {
  18. this.levelMax = levelMax;
  19. }
  20. public boolean isAcceptOnMatch() {
  21. return acceptOnMatch;
  22. }
  23. public void setAcceptOnMatch(boolean acceptOnMatch) {
  24. this.acceptOnMatch = acceptOnMatch;
  25. }
  26. @Override
  27. public int decide(LoggingEvent lgEvent) {
  28. int inputLevel = lgEvent.getLevel().toInt();
  29. if(inputLevel>=getLevel(levelMin) && inputLevel <= getLevel(levelMax)){
  30. return 0;
  31. }
  32. return -1;
  33. }
  34. private int getLevel(String level){
  35. level = level.toUpperCase();
  36. if(level.equals("CUSTOMER")){
  37. return LevelType.CUSTOMER.getType();
  38. }
  39. if(level.equals("OFF")){
  40. return LevelType.OFF.getType();
  41. }
  42. if(level.equals("FATAL")){
  43. return LevelType.FATAL.getType();
  44. }
  45. if(level.equals("ERROR")){
  46. return LevelType.ERROR.getType();
  47. }
  48. if(level.equals("INFO")){
  49. return LevelType.INFO.getType();
  50. }
  51. if(level.equals("WARN")){
  52. return LevelType.WARN.getType();
  53. }
  54. if(level.equals("DEBUG")){
  55. return LevelType.DEBUG.getType();
  56. }
  57. if(level.equals("ALL")){
  58. return LevelType.ALL.getType();
  59. }
  60. return LevelType.OFF.getType();
  61. }
  62. private static enum LevelType{
  63. OFF(2147483647),
  64. FATAL(50000),
  65. ERROR(40000),
  66. WARN(30000),
  67. INFO(20000),
  68. DEBUG(10000),
  69. ALL(-2147483648),
  70. CUSTOMER(20050);
  71. int type;
  72. public int getType() {
  73. return type;
  74. }
  75. private LevelType(int type) {
  76. this.type = type;
  77. }
  78. }
  79. }

3、配置文件的设置:

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3. <log4j:configuration xmlns:log4j=‘http://jakarta.apache.org/log4j/‘ >
  4. <appender name="Console" class="org.apache.log4j.ConsoleAppender">
  5. <layout class="org.apache.log4j.PatternLayout">
  6. <param name="ConversionPattern" value="%d [%p] %c{1} - %m%n" />
  7. </layout>
  8. <!--过滤器设置输出的级别 -->
  9. <filter class="common.log.CustomerLogFilter">
  10. <param name="levelMin" value="info" />
  11. <param name="levelMax" value="Customer" />
  12. <param name="AcceptOnMatch" value="true" />
  13. </filter>
  14. </appender>
  15. <!-- 根logger的设置-->
  16. <root>
  17. <priority value ="INFO"/>
  18. <appender-ref ref="Console"/>
  19. </root>
  20. </log4j:configuration>

4、测试类

[java] view plain copy

  1. package common.test;
  2. import org.apache.log4j.Logger;
  3. import common.log.CustomerLog;
  4. public class Test {
  5. private static final Logger logger = Logger.getLogger("customer");
  6. public static void main(String[] args) {
  7. CustomerLog.customerLog(logger, "自定义日志级别");
  8. logger.info("哈哈哈哈");
  9. }
  10. }

5、运行结果:

2014-05-24 17:22:45,647 [CUSTOMER] customer - 自定义日志级别

2014-05-24 17:22:45,648 [INFO] customer - 哈哈哈哈

6、通过修改

[html] view plain copy

  1. <param name="levelMin" value="info" />

上面的 Value 值来控制日志的输出级别。

另外说明常用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

时间: 2024-08-02 06:53:02

自定义log4j日志级别的相关文章

Log4J日志配置详解和自定义log4j日志级别及输出日志到不同文件实现方法

Log4J日志配置详解 一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN <

基于JMX动态配置Log4J日志级别

先来看比较low的修改日志级别的方式,在写程序里面. http://blog.gssxgss.me/java%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A8%E6%80%81%E6%94%B9%E5%8F%98%E6%97%A5%E5%BF%97%E7%BA%A7%E5%88%AB/ 再来通过JMX的方法动态修改程序的日志级别. https://blog.csdn.net/z2007130205/article/details/23910431 package com.m

如何在JBoss WildFly 8 自定义log4j日志

最近在 JBoss WildFly 8 下部署 Web应用,自定义的 log4j 日志不工作.console下无日志输出,用System.out.println都不输出内容到console. 原因是JBoss WildFly 8 自带了日志功能,其中包含了log4j. 解决办法: 第一步:在standalone\configuration\standalone.xml 中找到如下配置信息 <profile> <subsystem xmlns="urn:jboss:domain:

Log4j 日志级别

转自:http://michales003.iteye.com/blog/1160605 日志记录器(Logger)是日志处理的核心组件.log4j具有5种正常级别(Level).: 1.static Level DEBUG : DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的. 2.static Level INFO INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程. 3.static Level WARN WARN level表明会出现潜在错误的情形

Confluence 6 log4j 日志级别

日志级别 DEBUG - 被设计为用来获得最多的信息和事件,在对应用程序进行调试的时候,这个日志级别通常能够提供最多的有效信息(查看应用程序怎么了) INFO - 有关系统正常运行-计划任务运行,服务器开始和结束的世界,用户触发的进程和操作的一些有关声明和输出 WARN - 有关这方面的内容并不是表示系统本身出错了,而是表示系统本身有优化的空间 ERROR - 有关这个的输出表示的是系统在运行的时候遇到了一些错误 FATAL - 有关这个级别的输出表示系统进入了一个非常糟糕的状态并且已经不能从这

Log4j日志级别

日志记录器(Logger)是日志处理的核心组件.log4j具有7种级别(Level).日志记录器(Logger)的可用级别Level (不包括自定义级别 Level)优先级从高到低:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE.ALL OFFOFF Level是最高等级的,用于关闭所有日志记录. FATALFATAL level指出每个严重的错误事件将会导致应用程序的退出. ERRORERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行. WARN

使用Apache pdfbox: 从Linux安装字体到log4j设置日志级别

在使用Apache的pdfbox的过程中,因为Linux环境下没有STSong-Light字体而报警告信息 (PDCIDFontType0.java:147) - Using fallback UKaiCN for CID-keyed font STSong-Light 搜索得知此为Adobe推出的一种OpenType字体,在adobe的安装目录下找到了疑似的字体AdobeSongStd-Light.otf,将此文件copy至Linux的/usr/share/fonts目录中,因为pdfbox会

java log4j基本配置及日志级别配置详解

java log4j日志级别配置详解 1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙X了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就OK了.我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到...... 1.2 闲话少说,讲讲日志的发展故事(如果已经了解的

转:Log4j 日志体系结构

转自:https://my.oschina.net/andylucc/blog/794867 我们在写日志的时候首先要获取logger,在每一个使用log4j的项目都有很多个地方要获取logger,这些logger是真实的被实例化的Logger对象,他们有可能被分散在无数不同的类中,日志体系结构讲的是这些logger对象是如何组织的,他们之间又有什么样的关系. 体系结构 我们举个具体的实例来看看,假设我的项目包结构如下: 项目结构 说明一下:com.flu.jdk包下面有两个类分别是LogTes