Java Web开发的过程中,通过会采用输出log的方式来进行调试,产品上线之后,也通常使用log来记录系统的运行状态。最简单的输出log的方式就是使用System.out.println(String msg)和System.err.println(String msg),然而这种方式的弊端是显而易见的,例如:
1. 调试期输出log的代码,在上线运行前需要注释掉,否则可能会影响系统性能或者造成日志文件过于庞大。当出现问题需要跟踪的时候,又需要修改代码,删除注释符以打开这些debug的log,非常不方便;
2. 所有的业务的log都会输出到一个文件中去,查看起来很不方便。
多亏apache开源社区为所有Java开发者提供了Log4j这个非常弓虽大的log工具,把我们从维护log的繁重工作中解脱了出来。Log4j可能通过配置文件实现多logger,每个logger可以有不同的输出文件、输出格式和log级别,具体细节我就不再赘述,不了解的同学可以参考相关的文档或者示例代码。
这里主要总结几点Log4j使用过程中的常见问题和注意事项,阅读一下内容之前,下面的文章将假设你已经有一定的Log4j使用经验了。
1. 获取Logger实例的方法:
protected static final Logger logger = Logger.getLogger("logger_name");
或
private static final Logger logger = Logger.getLogger("logger_name");
还有一个获取Logger的方法:
Logger.getLogger(Class clazz);
1.1 为什么要加“static”?
因为同一个logger name对应唯一的Logger实例,而Logger.getLogger方法在从logger容器中取logger的过程中,有一个步骤被加了同步锁,这就造成了如果在多线程的竞争环境中频繁地调用getLogger操作,有可能会造成堵塞。而且这种操作是没有价值的,所以使用static来保证需要需用Logger的类所有的对象共享一个Logger的引用,并且只获取一次就可以了。
1.2 为什么要加“final”
防止多logger同时使用时,Logger引用不小心被赋值,这是一个良好的编程习惯。
1.3 Logger.getLogger(String loggerName)与Logger.getLogger(Class clazz)有什么区别?
本质上是一样的,Logger.getLogger(Class clazz)方法实际上是调用了Logger.getLogger(clazz.getName())来获取Logger的。
1.4 log4j配置文件中没有配置logger_name对应的logger怎么办?
如果没有logger_name对应的配置,则Logger.getLogger方法返回默认的logger。
2. Logger共有6个log级别,按优先级由低到高排序分别是:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
他们分别对应Logger的trace, debug, info, warn, error和fatal方法进行输出,但是我们通常只使用debug、info和error这三个最常用的级别。运行时的log输出级别可以通过更改log4j配置文件来进行配置,就免去了注释掉debug代码的尴尬。
3. 输出log的正确方式:
if (logger.isInfoEnabled()) {
logger.info("User " + userId + " is using app " + appId);
}
3.1 为什么要加上logger.isInfoEnabled()?
直接使用logger.info("User " + userId + " is using app " + appId)来输出log,也能够达到log级别为INFO或在INFO以下时才输出:("User " + userId + " is using app " + appId),因为logger.info方法内部有判断输出级别的代码。但是在进入logger.info函数之前,("User " + userId + " is using app " + appId) 这个表达式已经通过运算拼接成了一个字符串;而如果事先使用 if (logger.isInfoEnabled())进行判断,那么当log级别在INFO以上时,就能省去上述的字符串操作,在高并发和复杂log信息拼接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。
3.2 ERROR及其以上级别的log信息是一定会被输出的,所以只有logger.isDebugEnabled和logger.isInfoEnabled方法,而没有logger.isErrorEnabled方法。
4. debug、info、error等输出log的方法是线程安全的,请放心使用。
5. log有风险,输出需谨慎!由于输出log过程需要进行磁盘操作,且log4j为了保证log输出过程的线程安全性而使用同步锁,就使得输出log成为很耗时的操作,所以log信息一定要言简意赅,不要输出一些无用的log。
以上为我个人的使用经验,欢迎大家指教和补充。
最后,祝愿log4j给大家带来更加愉快的开发体验。
分享到:
相关推荐
log4j,日志
针对Log4j 2 远程代码执行漏洞,需要用到的升级资源包,适用于maven资源库,包括log4j,log4j-core,log4j-api,log4j-1.2-api,log4j-jpa等全套2.15.0 maven资源库jar包。如果是maven本地仓库使用,需要将zip包解压...
若依框架使用的log4j2.16.0,修复log4j漏洞log4j2下载最新log4j2.16.0下载
apache-log4j-1.2.15.jar, apache-log4j-extras-1.0.jar, apache-log4j-extras-1.1.jar, apache-log4j.jar, log4j-1.2-api-2.0.2-javadoc.jar, log4j-1.2-api-2.0.2-sources.jar, log4j-1.2-api-2.0.2.jar, log4j-...
Apache log4j2零日漏洞,根据 log4j-2.15.0-rc2 版本编译生成log4j-api-2.15.0.jar 1.解压你的jar jar xvf XXX.jar 2. 删除旧版本jar cd ./BOOT-INF/lib rm -rf log4j-api-*.jar 3. 上传新版本log4j-api-2.15.0....
log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解log4j使用详解
Log4j 是一个日志记录框架,Log4j 2 是对 Log4j 的升级,提供了重大改进,超越其前身 Log4j 1.x,并提供许多其它现代功能 ,例如对标记的支持、使用查找的属性替换、lambda 表达式与日志记录时无垃圾等。 Apache ...
Apache log4j2零日漏洞,根据 log4j-2.15.0-rc2 版本编译生成log4j-api-2.15.0.jar 1.解压你的jar jar xvf XXX.jar 2. 删除旧版本jar cd ./BOOT-INF/lib rm -rf log4j-api-*.jar 3. 上传新版本log4j-api-...
log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码,
下面小编就为大家带来老生常谈Log4j和Log4j2的区别(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
赠送jar包:log4j-slf4j-impl-2.12.1.jar; 赠送原API文档:log4j-slf4j-impl-2.12.1-javadoc.jar; 赠送源代码:log4j-slf4j-impl-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-slf4j-impl-2.12.1.pom; ...
log4j.rootLogger=debug,CONSOLE,testfile,A1,MAIL ################### # Console Appender ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Target=...
描述Log4j2的配置详情及相对Log4j的优点,包括效率测试程序
赠送jar包:log4j-to-slf4j-2.12.1.jar; 赠送原API文档:log4j-to-slf4j-2.12.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.12.1.pom; 包含翻译后...
log4j使用教程 log4j使用教程 log4j使用教程
关于配置文件的名称以及在项目中的存放位置 log4j 2.x版本不再支持像1.x中的....如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。
log4j-api-2.12.4.jar和log4j-core-2.12.4.jar,该版本避免log4j漏洞问题。
赠送jar包:log4j-api-2.12.1.jar; 赠送原API文档:log4j-api-2.12.1-javadoc.jar; 赠送源代码:log4j-api-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-api-2.12.1.pom; 包含翻译后的API文档:log4j-api-...
apache下载太慢,特搬到国内下载。修复log4j漏洞log4j2下载最新log4j2.16.0下载
该文档包括log4j的介绍、log4j的配置文件以及配置参数详解、log4j在程序中的使用、以及log4j配置示例四大部分。