java log4j配置

Log4j中有三个主要的组件,它们分别是 Logger、Appender和Layout。

Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远 存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。

Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。

Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。

Log4j中将要输出的Log信息定义了5种级别,依次为DEBUG、INFO、WARN、ERROR和FATAL,当输出时,只有级别高过配置中规定的级别的信息才能真正的输出

 

log4j.xml

 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/" debug="false">
 4     <!--输出方式:输出到控制台 -->
 5     <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
 6         <!-- 设置通道名称和输出方式,其中输出方式appender有5种,分别为 
 7             org.apache.log4j.RollingFileAppender(按日志文件大小生成日志文件)
 8             org.apache.log4j.ConsoleAppender (控制台) 
 9             org.apache.log4j.FileAppender (文件) 
10             org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件) 
11             org.apache.log4j.WriterAppender (将日志信息以流格式发送到指定地方)
12         -->
13         <param name="Target" value="System.out" />
14         <!-- <param name="Target" value="System.err" />-->
15 
16         <!-- Threshold是个全局的过滤器,他将把低于所设置的level的信息过滤不显示出来 -->
17         <param name="Threshold" value="INFO" />
18         
19         <!-- 设置日志输出的格式 -->
20         <layout class="org.apache.log4j.PatternLayout">
21             <!-- 参数都以%开始后面不同的参数代表不同的格式化信息: %c 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的范围 如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName 
22                 %d 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss} %l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数 
23                 %n 换行符 %m 输出代码指定信息,如info(“message”),输出message %p 输出优先级,即 FATAL ,ERROR 等 %r 
24                 输出从启动到显示该log信息所耗费的毫秒数 %t 输出产生该日志事件的线程名 -->
25 
26             <!-- The default pattern: Date Priority [Category] Message\n -->
27             <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
28         </layout>
29     </appender>
30 
31     <!--输出方式是:每天一个日志文件 -->
32     <!--设置通道名称是:file,输出方式DailyRollingFileAppender -->
33     <appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender">
34         <!--日志文件路径和文件名称 -->
35         <!-- ${catalina.base}是服务器根目录 -->
36         <param name="File" value="${catalina.base}/outlogname.log" />
37 
38         <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
39         <param name="Append" value="true" />
40 
41         <!-- Rollover at midnight each day -->
42         <!-- e.g. mylog.log.2009-11-25.log -->
43         <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
44 
45         <!-- Rollover at the top of each hour <param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'"/> -->
46         <layout class="org.apache.log4j.PatternLayout">
47             <!-- The default pattern: Date Priority [Category] Message\n -->
48             <param name="ConversionPattern" value="%d %-5p [%c] %m%n" />
49 
50             <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n -->
51             <!-- <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/> -->
52         </layout>
53     </appender>
54 
55     <appender name="ERROR_LOG" class="org.apache.log4j.DailyRollingFileAppender">
56         <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler" />
57         <param name="File" value="error.log" />
58         <param name="Append" value="true" />
59         <!-- 指定日志输出级别 -->
60         <param name="Threshold" value="INFO" />
61         <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
62         <layout class="org.apache.log4j.PatternLayout">
63             <param name="ConversionPattern" value="%d %-5p [%c] %m%n" />
64         </layout>
65     </appender>
66 
67     <!-- level:是日记记录的优先级,优先级由高到低分为 OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。 
68         Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这四个级别。 -->
69 
70     <!-- 指定logger的设置,additivity指示是否叠加输出log,如果是false, 在DsErrorLog logger中日志不会被其它logger满足条件的logger(比如root) 输出 -->
71     <!-- 将名称为DSErrorLog的logger,输出到“EEROR_LOG”的appender 所谓logger的名字也就是,在定义Logger时,构造函数的参数 
72         Logger log = Logger.getLogger("DSErrorLog"); -->
73     <logger name="DSErrorLog" additivity="false">
74         <level class="org.apache.log4j.Level" value="DEBUG" />
75         <appender-ref ref="ERROR_LOG" />
76     </logger>
77 
78     <!-- 输出指定类包中的日志,比如想输出 Hibernate运行中生成的SQL语句,可作如下设置 -->
79     <category name="org.hibernate.SQL">
80         <priority value="DEBUG" />
81         <!-- 如果指定一个appender,这些log将被输出到指定的appender 如:<appender-ref ref="myFile"/> 
82             否则将作用于所有的appender -->
83     </category>
84 
85     <!-- 根默认会自动构建一个 root,输出INFO级别的日志到控制台,供logger继承 -->
86     <root>
87         <priority value="INFO" />
88         <appender-ref ref="myConsole" />
89         <appender-ref ref="myFile" />
90     </root>
91 </log4j:configuration> 

web.xml

1     <!-- log4j 系统日志-->
2     <context-param> 
3           <param-name>log4jConfigLocation</param-name> 
4          <param-value>/WEB-INF/log4j.xml</param-value> 
5     </context-param> 
6     
7     <listener> 
8           <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
9     </listener>

 

现在要在原有的项目上新增一个自定义级别:

首先定义一个Level要继承log4j的Level类,并设置日志的级别

 1 import org.apache.log4j.Level;
 2 import org.apache.log4j.Logger;
 3 import org.apache.log4j.net.SyslogAppender;
 4 
 5 public class CustomLog {
 6     private static Logger logger = Logger.getLogger(CustomLog.class);
 7 
 8     private static class CustomLevel extends Level {
 9         private static final long serialVersionUID = 1076913470822079835L;
10 
11         private CustomLevel(int level, String name, int sysLogLevel) {
12             super(level, name, sysLogLevel);
13         }
14     }
15 
16     public static final Level CUST_LOG_LEVEL = new CustomLevel(20050, "Custom",
17             SyslogAppender.LOG_LOCAL0);
18 
19     public static void customLog(Logger logger,Object pm_objLogInfo) {
20         logger.log(CUST_LOG_LEVEL, pm_objLogInfo);
21     }
22 
23 }

定义一个Filter

 1 import org.apache.log4j.spi.Filter;
 2 import org.apache.log4j.spi.LoggingEvent;
 3 
 4 public class CustomLogFilter extends Filter {
 5     boolean acceptOnMatch = false;
 6     int levelMin;
 7     int levelMax;
 8 
 9     public int getLevelMin() {
10         return levelMin;
11     }
12 
13     public void setLevelMin(int levelMin) {
14         this.levelMin = levelMin;
15     }
16 
17     public int getLevelMax() {
18         return levelMax;
19     }
20 
21     public void setLevelMax(int levelMax) {
22         this.levelMax = levelMax;
23     }
24 
25     @Override
26     public int decide(LoggingEvent lgEvent) {
27         int inputLevel = lgEvent.getLevel().toInt();
28         if (inputLevel >= levelMin && inputLevel <= levelMax) {
29             return 0;
30         }
31         return -1;
32     }
33 }

 

项目需要添加一个自定义等级的日志
由于原先用的properties文件,因为properties配置比较老旧不能支持filter这种的配置,所以删除改用XML文件:

# This is the configuring for logging displayed in the Application Server
log4j.rootCategory=INFO, stdout, R,A2

# Replace the line above if you want to put a log file into the directory 
# you start Tomcat from
# log4j.rootCategory=INFO, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout.ConversionPattern=%p %c{1}.%M(%L) | %m%n
# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=[slsint] %p [%t] %c{1}.%M(%L) | %m%n


log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=${catalina.base}/slsintout.log
#log4j.appender.R.File=/home/slsadmin/slsint-file/slsint_log/slsintout.log
log4j.appender.R.Threshold=INFO
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=LOG\:[%d{yyyy-MM-dd HH\:mm\:ss}] %5p %c{1}\:%L - %m%n

log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.File=${catalina.base}/slsinterr.log
#log4j.appender.A2.File=/home/slsadmin/slsint-file/slsint_log/slsinterr.log
log4j.appender.A2.Threshold=ERROR
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=LOG\:[%d{yyyy-MM-dd HH\:mm\:ss}] %5p %c{1}\:%L - %m%n


# You can change this to be an absolute path or even an environment variable
# If you're using an environment variable, you will have to set JAVA_OPTS
# to contain this variables - for example in the catalina.sh or catalina.bat
# file

#log4j.appender.R.File=slsint.log

#log4j.appender.R.MaxFileSize=1000KB

# Don't keep a backup file
#log4j.appender.R.MaxBackupIndex=0

#log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

# If programmed properly the most messages would be at DEBUG 
# and the least at FATAL.
log4j.logger.com.krm.dao=WARN
log4j.logger.com.krm.util=WARN
log4j.logger.com.krm=DEBUG
log4j.logger.com.krm.roubdableBalacnce=WARN

# Control logging for other open source packages
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.net.sf.acegisecurity=WARN
log4j.logger.net.sf.acegisecurity.intercept.event.LoggerListener=WARN
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=WARN

# Don't show debug logs for WebTest
log4j.logger.com.canoo.webtest=WARN

# All hibernate log output of "info" level or higher goes to stdout.
# For more verbose logging, change the "info" to "debug" on the last line.
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=WARN

# Changing the log level to DEBUG will result in Hibernate generated
# SQL to be logged.
log4j.logger.org.hibernate.SQL=ERROR

# Changing the log level to DEBUG will result in the PreparedStatement
# bound variable values to be logged.
log4j.logger.org.hibernate.type=ERROR

#\u52a0\u5165\u6b64\u914d\u7f6e\u53ef\u4ee5\u770b\u5230\u9875\u9762\u8df3\u8f6c\u7684\u60c5\u51b5
log4j.logger.org.apache.struts.action.RequestProcessor=ERROR
 


新增的XML文件,需要下载一个"log4j.dtd"文件,在以下XML文件中会引用到:

  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="Custom" class="org.apache.log4j.RollingFileAppender">
  5         <param name="File" value="${catalina.base}/slsininfo.log" />
  6         <param name="Append" value="true" />
  7         <param name="MaxFileSize" value="50MB" />
  8         <layout class="org.apache.log4j.PatternLayout">
  9             <param name="ConversionPattern"
 10                 value="LOG\:[%d{yyyy-MM-dd HH\:mm\:ss}] %5p %c{1}\:%L - %m%n" />
 11         </layout>
 12         <filter class="com.krm.slsint.common.CustomLogFilter">
 13             <param name="LevelMin" value="20050" />
 14             <param name="LevelMax" value="20050" />
 15         </filter>
 16     </appender>
 17 
 18     <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
 19         <param name="target" value="System.out" />
 20         <layout class="org.apache.log4j.PatternLayout">
 21             <param name="ConversionPattern" value="%p %c{1}.%M(%L) | %m%n" />
 22         </layout>
 23     </appender>
 24 
 25     <appender name="R" class="org.apache.log4j.DailyRollingFileAppender">
 26         <param name="File" value="${catalina.base}/slsintout.log" />
 27         <param name="Threshold" value="INFO" />
 28         <param name="Append" value="true" />
 29         <layout class="org.apache.log4j.PatternLayout">
 30             <param name="ConversionPattern"
 31                 value="LOG\:[%d{yyyy-MM-dd HH\:mm\:ss}] %5p %c{1}\:%L - %m%n" />
 32         </layout>
 33     </appender>
 34 
 35     <appender name="A2" class="org.apache.log4j.DailyRollingFileAppender">
 36         <param name="File" value="${catalina.base}/slsinterr.log" />
 37         <param name="Threshold" value="ERROR" />
 38         <layout class="org.apache.log4j.PatternLayout">
 39             <param name="ConversionPattern"
 40                 value="LOG\:[%d{yyyy-MM-dd HH\:mm\:ss}] %5p %c{1}\:%L - %m%n" />
 41         </layout>
 42     </appender>
 43 
 44     <logger name="com.krm.dao">
 45         <level value="WARN" />
 46     </logger>
 47     <logger name="com.krm.util">
 48         <level value="WARN" />
 49     </logger>
 50     <logger name="com.krm">
 51         <level value="DEBUG" />
 52     </logger>
 53     <logger name="com.krm.roubdableBalacnce">
 54         <level value="WARN" />
 55     </logger>
 56 
 57     <logger name="com.opensymphony.oscache">
 58         <level value="ERROR" />
 59     </logger>
 60     <logger name="net.sf.navigator">
 61         <level value="ERROR" />
 62     </logger>
 63     <logger name="net.sf.acegisecurity">
 64         <level value="WARN" />
 65     </logger>
 66     <logger name="net.sf.acegisecurity.intercept.event.LoggerListener">
 67         <level value="WARN" />
 68     </logger>
 69     <logger name="org.apache.commons">
 70         <level value="ERROR" />
 71     </logger>
 72     <logger name="org.apache.struts">
 73         <level value="WARN" />
 74     </logger>
 75     <logger name="org.displaytag">
 76         <level value="ERROR" />
 77     </logger>
 78     <logger name="org.springframework">
 79         <level value="WARN" />
 80     </logger>
 81 
 82     <logger name="com.canoo.webtest">
 83         <level value="WARN" />
 84     </logger>
 85 
 86     <logger name="org.hibernate.ps.PreparedStatementCache">
 87         <level value="WARN" />
 88     </logger>
 89     <logger name="org.hibernate">
 90         <level value="WARN" />
 91     </logger>
 92 
 93     <logger name="org.hibernate.type">
 94         <level value="ERROR" />
 95     </logger>
 96     <logger name="org.hibernate.sql" >
 97         <level value="ERROR" />
 98     </logger>
 99 
100     <logger name="org.apache.struts.action.RequestProcessor">
101         <level value="ERROR" />
102     </logger>
103 
104     <root>
105         <priority value="INFO" />
106         <appender-ref ref="stdout" />
107         <appender-ref ref="R" />
108         <appender-ref ref="A2" />
109         <appender-ref ref="Custom" />
110     </root>
111 </log4j:configuration>  

  在开发时用的Tomca中间件,所以日志相对路径写为${catalina.base}/

  如果换成别的中间件需要改一下变量名:

  如TongWeb下:${tongweb.root}/

  在Windows环境下,可以使用Weblogic的环境变量:set JAVA_PROPERTIES=-Dplatform.home=%WL_HOME% -Dwls.home=%WLS_HOME% -Dweblogic.home=%WLS_HOME%

  ${platform.home}/ 或 ${wls.home}/

 

  程序调用的时候:

 

1 Logger customloger = Logger.getLogger(LoginAction.class);  
2 
3 CustomLog.customLog(customloger, "log content");  

 

posted @ 2016-04-25 15:44  何鸿涛  阅读(380)  评论(0)    收藏  举报