如何正确使用log4j

如何正确使用log4j?

关键字: 如何正确使用log4j?

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给大家带来更加愉快的开发体验。

时间: 2024-08-03 10:17:30

如何正确使用log4j的相关文章

Log4J使用

Log4J是Apache的一个开放源码的项目.通过使用Log4J.程序猿能够控制日志信息输送的目的地.包含控制台.文件.GUI组件和NT事件记录器,也能够控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加仔细地控制日志的生成过程.以下的代码是一个样例: //Log4J public void log4jDemo() { Logger logger = Logger.getLogger(Test.class); FileReader fr = null; try { fr = new

Log4j基础知识

Log4J是Apache的一个开放源代码的项目.通过使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加细致地控制日志的生成过程. Log4j的组成: Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout). Appender.Layout分别是输出端和日志格式化器的祖先,下图显示了他们的对应关系. 日志记录器Logg

java中Log4J的使用笔记

使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加细致地控制日志的生成过程. Log4j的组成:Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout).Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制:Appenders指定了日志将打印到控制台还是文件中;而Layout则控制日志信息的显示格式

原创Log4j学习----会飞的猪

在前面,我们学习到了关于Log4j的一些知识,如它的构成由三大重要组成部分构成,Logger.Appenders.Layout.相关的作用,这里就不一一介绍了. 如Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制:Appenders指定了日志将打印到控制台还是文件中;而Layout则控制日志信息的显示格式. 下面简单介绍下,如何创建Logger对象及配置log4j.properties文件. A).Logger对象的获得或创建:            Logger被指定为

mybatis输出SQL

1.导包 下载一个log4j-1.2.17.jar,放到WEB-INF的lib下,并加入build path 2.创建配置文件 在src下创建log4j.properties,填入以下内容: log4j.rootLogger=DEBUG,Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayo

log4j的各种类的配置

log4j看上去像是一种简单的,易配置的日志打印技术.但是实际使用的时候发现,还有各种很相似的日志技术.很多地方的配置一乱就不知道怎么对应了.所以应该把log4j的一切做个简单的分类记录. (一)java.util.logging.Logger 这个在java的util包里面,不需要任何Maven依赖,是最最基本的日志打印.功能很不完善,基本没有人在大型软件中使用这个. 示例代码:(日志重要级从上往下递增) 1 public class TestLog { 2 public static voi

MyEclipse导入Maven项目pom文件第一行报错,运行Tomcat报Log4j错误--解决方法

问题描述: 前一段时间电脑第一次导入Maven项目,又是pom文件错,改好后又是运行Tomcat报Log4j错误,一直倒腾了近一个月程序才成功跑起来,太不容易. 也上网查了很长时间,没一个方法能解决我的问题的.特记下解决方法,希望能帮到像我这样的web刚入门者. (刚入门,肯定有说的不对的地方,有错也希望能指出来,我改正) 前期操作:导入项目后clean,install,update,中会报错(因为我已经解决了,所以没有×). 两问题对应解决方法: 1.pom文件第一行大红叉,说明是项目的文件指

commons-logging log4j的联系区别

1.Apache通用日志接口(commons-logging.jar)介绍 Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logger,但是功能很弱.在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的 java.util.logging,如果也找不到就用Simple Logger.commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说S

spring mvc整合mybaitis和log4j

在上一篇博客中,我介绍了在mac os上用idea搭建spring mvc的maven工程,但是一个完整的项目肯定需要数据库和日志管理,下面我就介绍下spring mvc整合mybatis和log4j 一.先把需要用到的jar包配置到pom.xml上(主要是mybaitis和mysql驱动包) <!-- mybatis/spring包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId