try{ ... }catch(Exception e){ logger.error(e.getMessage(),e); throw new XXXXException(...); }
这样在开发过程中,只要把日志级别设为比error级别低就可以打印异常信息,但是问题出现了,开发完成后要给客户演示时,不希望客户看到异常信息,如果演示过程中出现了异常,只把异常信息写入日志中,过后检查日志进行修正,如果要达到这样的目的,我们只把把日志级别设为FATAL,然而FATAL级别是表示会影响程序退出等重大的错误,显然不符合要求
关于log4j的日志级别描述为:
- DEBUG 表明细粒度信息事件对调试应用程序是非常有帮助的
- INFO 表明消息在粗粒度级别上突出强调应用程序的运行过程
- WAEN 表明会出现潜在错误的情形
- ERROR 表明虽然发生错误事件,但仍然不影响系统的继续运行
- FATAL 指出每个严重的错误事件将会导致应用程序的退出
此外还有如下两个级别
- ALL 最低级别,用于打开所有日志记录
- OFF 最高级别,用于关闭所有日志记录
于是想到给加一个日志级别,查阅了网上的实现,都是在要使用自定义的级别时需要先实例化,不能像上面的方式一样使用,于是开始了log4j源码修改之旅。
下载apache-log4j-1.2.16.zip
打开后找到源码,主要修改如下几个类:Level.java,Category.java,Loglog.java这几个文件(修改后的源码会在附件中),修改完成后,需要对其重新打包,打包时要注意了,使用maven2来进行打包,在控制台下运行命令:mvn compile,看到build successful信息后再运行mvn jar:jar命令即可打包成功,到根目录下去找target目录,看到jar文件了吧,这个就是我们修改之后的jar包了,好了,下面是测试列子:
lo4j.properties
log4j.rootLogger=SERIOUS, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %30c %3x - %m%n
java代码:
import org.apache.log4j.Logger; public class TestMain1 { private static final Logger logger = Logger.getLogger(TestMain1.class); public static void main(String[] args) { logger.debug("111111111"); logger.info("111111111"); logger.warn("111111111"); logger.serious("111111111"); logger.error("111111111"); logger.fatal("111111111"); } }
在配置文件里设置的日志级别是我自定义的级别:SERIOUS
运行代码后,打印的信息为:
0 SERIOUS [main] TestMain1 - 111111111
0 ERROR [main] TestMain1 - 111111111
0 FATAL [main] TestMain1 - 111111111
可以把配置文件修改后再运行代码测试,我们的修改是成功的