6 log4j -- 一个笨的使用方法
log4j的说明:
Log4j是NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
问题:通常我们在工程中配置log4j配置文件后,把工程打包在linux环境上运行的时候,经常出现自己在log4j中设置的日志文件输出没有产生日志文件,通常定位起来很麻烦,有可能是程序未找到该log4j配置文件或者是别的log4j配置文件把该配置文件覆盖了等问题,本人采用一种比较笨的方法显示指明程序采用的log4j配置文件。
方法代码如下:
public static String LOGFILE = ""; static { LOGFILE = getLog4jPath(); if (new File(LOGFILE).exists()) { PropertyConfigurator.configure(LOGFILE); logger.info("log4j配置文件生效,路径为:{}", LOGFILE); } else { logger.warn("log4j配置文件:{}不存在", LOGFILE); } }
这样就确保了程序加载的是你指定的log4j.properties配置文件。
log4j.properties配置文件内容:
### set log levels ### log4j.rootLogger = debug,stdout,R,E ### 输出到控制台 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.Threshold = INFO log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %p [%t] %c{2} (%M:%L) - %m%n ### 输出etl-web日志到文件 ### log4j.appender.R = org.apache.log4j.DailyRollingFileAppender log4j.appender.R.ImmediateFlush=true log4j.appender.R.Append = true log4j.appender.R.File = ${catalina.home}/logs/etl_web.log log4j.appender.R.encoding=UTF-8 log4j.appender.R.Threshold = INFO log4j.appender.R.DatePattern='.'yyyy-MM-dd log4j.appender.R.layout = org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %p [%t] %c{2} (%M:%L) - %m%n ### 保存异常信息到单独文件 ### log4j.appender.E = org.apache.log4j.RollingFileAppender log4j.appender.E.File = ${catalina.home}/logs/etl_error.log log4j.appender.E.encoding=UTF-8 log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %p [%t] %c{2} (%M:%L) - %m%n
日志输出级别是debug,三种输出路径,分别是stdout,R,E
stdout为控制台输出,输出INFO及以上级别
R为按天输出文件,输出级别为INFO及以上,E和R基本相同,但仅输出ERR及以上级别日志。
有时候,你可能不希望有些jar包的日志输出到你的日志里面,你可以在log4j.properties按照如下方式配置:
如log4j.logger.org.springframework=OFF 作用是:org.springframework包下面的日志不再输出,这样就屏蔽了所有的spring日志。
### set log levels ### log4j.rootLogger = debug,stdout,F log4j.logger.org.springframework=OFF log4j.logger.org.directwebremoting=OFF log4j.logger.org.quartz=OFF log4j.logger.org.terracotta.quartz=OFF log4j.logger.org.mybatis=OFF log4j.logger.org.apache.ibatis=OFF ### 输出到控制台 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.Threshold = INFO log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %p [%t] %c{2} (%M:%L) - %m%n ### 输出etl-core任务日志到文件 ### log4j.appender.F = org.apache.log4j.FileAppender log4j.appender.F.ImmediateFlush=true log4j.appender.F.BufferedIO=false log4j.appender.F.Append = true log4j.appender.F.File = ${etl_core_log_path}/etl_core.log log4j.appender.F.encoding=UTF-8 log4j.appender.F.Threshold = INFO log4j.appender.F.layout = org.apache.log4j.PatternLayout log4j.appender.F.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} %p [%t] %c{2} (%M:%L) - %m%n etl_core_log_path=${catalina.home}/logs;
log4j可学习的地方还有很多,如:如何动态更改日志文件位置