Log4j(三)----实战技巧篇(转载)
来源:互联网 发布:东方财富国际证券知乎 编辑:程序博客网 时间:2024/06/05 05:07
文章转载自:原文出处链接
这里主要总结几点Log4j使用过程中的常见问题和注意事项,阅读一下内容之前,下面的文章将假设你已经有一定的Log4j使用经验了。
一、获取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。
二、Logger共有6个log级别,按优先级由低到高排序分别是:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
他们分别对应Logger的trace, debug, info, warn, error和fatal方法进行输出,但是我们通常只使用debug、info和error这三个最常用的级别。运行时的log输出级别可以通过更改log4j配置文件来进行配置,就免去了注释掉debug代码的尴尬。
三、输出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方法。
四、debug、info、error等输出log的方法是线程安全的,请放心使用。
五、log有风险,输出需谨慎!由于输出log过程需要进行磁盘操作,且log4j为了保证log输出过程的线程安全性而使用同步锁,就使得输出log成为很耗时的操作,所以log信息一定要言简意赅,不要输出一些无用的log。
- Log4j(三)----实战技巧篇(转载)
- 多线程编程——实战篇(三)(转载)
- Log4j简介(三)
- C#实战小技巧(三):Semaphore信号量
- Log4J学习笔记(转载)
- log4j 简明手册(转载)
- log4j配置(转载的)
- Log4j配置详解(转载)
- Log4j简明手册(三)
- MyBatis(三) OGNL log4j
- log4j 应用 实战篇
- log4j实战篇
- (转)log4j详解与实战
- VC技巧(转载)
- 面试技巧(转载)
- Openlayers3实战(三)
- AngularJs实战(三)
- RocketMQ实战(三)
- csdn上第一篇first pager!
- 听老师课堂笔记及感受总结
- 算法复习:二叉树的镜像
- 头文件和库文件有何区别和联系
- Codeforces 822A I'm bored with life
- Log4j(三)----实战技巧篇(转载)
- java关键字注意要点与总结
- 润乾填报实现用背景色标识数据已修改单元格
- 《加密与解密》笔记四(三)
- Hibernate--一对一的关联映射
- 信源编码作业五
- Nginx入门以及开源博客Tale的部署
- HDU1533:Going Home(最小费用流)
- Codeforces Round #407 (Div. 1) B. Weird journey —— dfs + 图