1.将log4j配置打包在jar之外并调用的方法
默认情况下,log4j会自动加载classloader下的log4j.properties或 log4j.xml文件。所以一般没有特殊要求,只需要将默认文件名的配置文件置于src目录下(web程序还可以放在WEB-INF下面)。
对于单机程序,打包后配置文件会同class一起打到jar中,不利于通过修改配置来改变日志记录方式。
我们可以在项目中建立文件夹conf来放置配置文件,然后程序启动时采用以下方式来告诉log4j配置文件的路径
//------程序初始化阶段---- //读取配置 String currentDir = System.getProperty("user.dir"); PropertyConfigurator.configure(currentDir+"/conf/log4j.properties"); //如果是xml配置 //DOMConfigurator.configure(currentDir+"/conf/log4j.xml"); //此外还可以调用configureAndWatch监听配置的变动并重新加载。 //-----log调用------- Log dbLog = LogFactory.getLog("dbLog"); if(dbLog.isErrorEnabled()){ // 先判断log级别再调用,减少不必要的代码执行。 dbLog.error("test db log"); } //-----程序结束阶段------ //关闭log 稍后文章中会介绍在某些场合关闭log的必要性。 LogManager.shutdown();
注意这里涉及到如何判断程序和结束,对于桌面程序可以自己判断;对于web项目,可以建立一个ServletContextListener来添加初始化和结束代码。
另外,如果在web工程中使用spring,初始化配置可以使用spring提供的org.springframework.web.util.Log4jConfigListener。
web.xml中的相关配置内容如下:
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>WEB-INF/log4j-1.properties</param-value> </context-param> <!-- 如果需要设置监听 <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>20000</param-value> </context-param> --> <context-param> <!-- 配置项目根 环境变量 . 下节会提到 --> <param-name>webAppRootKey</param-name> <param-value>log4jWebTemplate.root</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
2.log4j配置文件常用输出器及参数配置示例
## ------------------rootLogger ------------------ ## # 定义根记录器 日志级别 、两个日志输出源 #日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。 #Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。 log4j.rootLogger=DEBUG,console,file ## ------------------Console------------------------ ## # 控制台输出源 参数设置 log4j.appender.console=org.apache.log4j.ConsoleAppender #默认为System.out log4j.appender.console.target=System.err # 控制台输出源 布局设置 log4j.appender.console.layout=org.apache.log4j.SimpleLayout ## ------------------File------------------ ## # 文件输出源 参数设置 log4j.appender.file=org.apache.log4j.RollingFileAppender #设置输入文件:${webapp.root}/WEB-INF/logs/log.log #注: 环境变量webapp.root由tomcat启动项目时设置 #为了避免多项目同时部署的名称冲突问题,可以在web.xml中配置context-param :webAppRootKey ,示例值:log4jWebTemplate.root #那么可以在配置中使用{log4jWebTemplate.root}来获取项目实际路径。 #对于桌面程序,可以使用${user.dir} 或'.' log4j.appender.file.File=./logs/log.log log4j.appender.file.MaxFileSize=1000KB log4j.appender.file.MaxBackupIndex=20 #定义输入级别,默认采用rootLogger输入级别 #log4j.appender.file.Threshold = DEBUG # 文件输出源 布局设置 # 使用灵活布局方式,参数意义参考:http://www.blogjava.net/xzclog/archive/2006/09/04/67481.html log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%-5p][%t][%C][%d{yyyy-MM-dd HH:mm:ss}] %m%n # 其他的输出源: # FileAppender 指定一个日志文件 # DailyRollingFileAppender 表示每天产生一个日志文件 # WriterAppender 将日志信息以流格式发送到任意指定的地方 参考:http://wanwok.iteye.com/blog/616829 # JDBCAppender 把重要的业务日志异步批量写入数据库 参考:http://www.blogjava.net/xzclog/archive/2006/09/04/67481.html#128134 # SMTPAppender 发送日志到email ## --------------------自定义logger----------------------## #适用于为不同的业务或系统事件建立独立的日志 .使用自定义日志尽量不设置根日志rootLogger。 #logger名:customLog logger输出器 customLogAppender log4j.logger.customLog=DEBUG,customLogAppender ## ***additivity***是否继承父logger输出源 log4j.additivity.customLog=false log4j.appender.customLogAppender=org.apache.log4j.ConsoleAppender #log4j.appender.customLogAppender.target=System.out ## 输出DEBUG级别以上的日志 ##定义独立的日志级别 类似于下面提到的filter log4j.appender.customLogAppender.Threshold = DEBUG log4j.appender.customLogAppender.layout=org.apache.log4j.PatternLayout log4j.appender.customLogAppender.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %m%n ## -------------------自定义 logger dbLog (JDBCAppender)----------------------## log4j.logger.dbLog=ERROR,dbLogAppender log4j.appender.dbLogAppender=org.apache.log4j.jdbc.JDBCAppender log4j.appender.dbLogAppender.URL=jdbc:mysql://localhost:3306/test log4j.appender.dbLogAppender.driver=com.mysql.jdbc.Driver log4j.appender.dbLogAppender.user=root log4j.appender.dbLogAppender.password=xiaodi log4j.appender.dbLogAppender.sql=insert into t_log4j_info(priority,message,catalog,time) values('%p','%m','%c','%d{yyyy-MM-dd HH:mm:ss}') #注意:bufferSize可以缓存日志,设置为>1后,缓存满后再插入数据库。但如果程序终结有可能缓存未输出。需要在程序结束前调用LogManager.shutdown()。 log4j.appender.dbLogAppender.bufferSize=10 log4j.appender.dbLogAppender.layout=org.apache.log4j.PatternLayout ##定义日志的过滤器。可以设定单个日志输出器的日志输出级别范围 log4j.appender.dbLogAppender.filter.filter1=org.apache.log4j.varia.LevelRangeFilter log4j.appender.dbLogAppender.filter.filter1.LevelMin=INFO log4j.appender.dbLogAppender.filter.filter1.LevelMax=ERROR #此外还有 LevelMatchFilter StringMatchFilter
日志测试代码:
//调用一个不存在的自定义log Log noLog = LogFactory.getLog(this.getClass()); //标识log不存在,调用rootLogger的输出器产生输出。如果rootLogger未定义将不会产生输出 if(noLog.isErrorEnabled()){ noLog.error("no exist logger test"); } //调用自定义的log Log customLog = LogFactory.getLog("customLog"); //除了当前log的输出外,还有rootLogger的两个输出器也同时产生了输出(除非设置该日志的additivity=false) if(customLog.isErrorEnabled()){ customLog.error("test customLog working "); } //调用自定义db logger Log dbLog = LogFactory.getLog("dbLog"); if(dbLog.isErrorEnabled()){ dbLog.error("test db log"); }