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");

浙公网安备 33010602011771号