`
ixp
  • 浏览: 12502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j经验总结——如何正确使用log4j?

    博客分类:
  • Java
阅读更多
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给大家带来更加愉快的开发体验。
分享到:
评论

相关推荐

    log4j2.0教程(英文版)

    ### Log4j 2.0 教程及使用手册知识点概览 #### 1.1 欢迎使用 Log4j 2! ##### 1.1.1 引言 几乎每一个大型应用都有其自己的日志或跟踪API。遵循这一规则,E.U.SEMPER项目在1996年初决定编写其自己的跟踪API。经过...

    log4c开发手册

    Log4C的设计灵感来源于Java平台上的Apache Log4J项目,但其完全采用C语言编写,以满足那些希望在资源受限或不支持虚拟机的系统上使用高效日志功能的需求。该库的核心特性包括: - **动态配置**:Log4C支持通过外部...

    自己抓的IPSEC的包

    在压缩包内的文件名称“Log4j详解.doc”与IPSec主题看似无关,但Log4j是一个广泛使用的Java日志框架,它的出现可能是因为在分析IPSec过程中,博主可能用到了包含Log4j的日志系统来记录或分析过程中的信息。Log4j能够...

    SVN使用指南——Windows环境版

    **SVN(Subversion)** 是一款开源的版本控制系统,广泛应用于软件开发团队协作中,以管理和跟踪项目文件的变更。...这份PPT详细介绍了Windows环境下SVN的使用,无论你是初学者还是有经验的开发者,都能从中受益。

    java软件开发——顶岗实习周记25篇.rar

    8. **日志系统**:理解日志的重要性,使用Log4j、SLF4J等日志框架进行调试和问题定位。 最后,实习生在实习过程中可能会面临的问题解决、团队协作、需求沟通等软技能也是重要的一部分。通过周记的形式记录这些经历...

    图像处理——边缘检测

    总结来说,这个资料包提供了一个全面的平台,让我们能够学习和实践图像处理中的边缘检测技术,包括理论知识和实际编程经验。通过这个过程,我们不仅可以了解各种边缘检测算法的原理,还能提升处理图像数据的能力,这...

    Laravel开发-log-viewer

    在本文中,我们将深入探讨Laravel开发中的一个重要工具——"Laravel开发-log-viewer",这是一个专为Laravel 5框架设计的日志查看器。它为开发者提供了一个方便的界面来浏览、分析和管理应用程序产生的日志文件。通过...

    算法导论——习题解答

    4. **第四章:概率分析与随机化算法** - **Lecture Notes**:概率分析是评估算法性能的一种重要方法,特别是在处理不确定性的输入时。本章将介绍概率分析的基本概念以及随机化算法的设计。 - **Solutions**:展示...

    SSM框架——详细整合教程.docx

    &lt;value&gt;classpath:log4j.properties ``` - **Spring MVC配置**:创建`spring-mvc.xml`文件,配置Spring MVC的相关属性。 ```xml &lt;!-- spring-mvc.xml 配置文件示例 --&gt; xmlns:xsi=...

    多年管理系统开发经验总结~代码解决方案.docx

    ### 多年管理系统开发经验总结——代码解决方案 #### 背景与问题分析 随着项目的迭代更新和技术的发展,管理系统在日常工作中扮演着越来越重要的角色。然而,在实际开发过程中,经常遇到一些由于早期设计不足或...

    jquery引用文件——jquery.js

    总结,jQuery通过提供高效、简洁的API,降低了JavaScript开发的门槛,提高了开发效率。无论是新手还是经验丰富的开发者,都能从中受益。理解并熟练掌握jQuery的核心概念和用法,对于提升Web开发能力具有重要意义。在...

    Universal Log Viewer-开源

    《Universal Log Viewer——开源日志分析利器》 在IT运维和开发过程中,日志分析是一项不可或缺的任务,它有助于我们理解系统运行状态,定位问题根源。本文将深入探讨一个专为Windows平台设计的开源日志查看工具...

    好用的JS图片裁剪工具——jquery.Jcrop-0.9.8

    总结来说,jQuery.Jcrop是一款强大且易于集成的JavaScript图片裁剪插件,能够帮助开发者快速实现图片裁剪功能,同时提供了丰富的配置选项和回调机制,以适应各种应用场景。无论你是前端新手还是经验丰富的开发者,...

    spring-framework-reference 4.0.1 手册

    - **使用Log4j**:讲解了Log4j的配置方法及与Spring的集成方式。 #### 二、Spring框架4.x新增功能 **3. 新功能与增强** - **改进的入门体验**:简化了初始设置流程,使开发者能更快地上手。 - **移除已废弃的包...

    “博”出信息时代教师风采——网络时代教师必备ICT技能之实践反思篇.pdf

    【博出信息时代教师风采——网络时代教师必备ICT技能之实践反思篇】 随着信息技术的快速发展,互联网已经成为我们生活和工作中不可或缺的一部分,特别是在教育领域。在这个数据时代,教师的角色正在发生深刻变化,...

    Log File Paladin-开源

    《Log File Paladin——开源日志监控利器》 在IT运维领域,日志文件的管理和监控是不可或缺的一部分。Log File Paladin,作为一个开源项目,为技术人员提供了一种高效且便捷的方式来自动监视远程日志,使得对客户端...

    课程设计之斗地主1.zip

    例如,可能使用了Apache Commons、Google Guava等库来处理数据,或者使用Log4j进行日志记录。第三方库的引入有助于提升项目的效率和质量。 6. **设计模式**:设计模式是解决软件设计中常见问题的经验总结。在这个...

    JavaEE程序员简历最新版

    * 熟练运用 struts2、hibernate、spring、springmvc、mybatis、jquery、Ajax、JSTL/EL、WebService、jdbc、dom4j、log4j 等技术 * 掌握常用的 JAVA 设计模式 * 熟悉软件设计开发流程 * 了解 MySql、Oracle 等数据库 ...

    DrinkeryManage.rar_DrinkeryManage

    Log4j或SLF4J等日志框架用于记录程序运行中的事件和错误信息。此外,系统还需要有完善的异常处理机制,以优雅地处理可能出现的问题。 7. **单元测试与持续集成**:为了保证代码质量,开发者可能会使用JUnit进行单元...

    CoreFS平台持久层框架使用说明

    - `logImpl`: 日志实现方式,默认使用LOG4J。 - `localCacheScope`: 本地缓存的作用范围。 - `cacheEnabled`: 是否启用缓存,默认开启。 ##### 3.2 构建SqlSessionFactory - **SqlSessionFactory**: 这是CoreORM...

Global site tag (gtag.js) - Google Analytics