如何正确使用log4j

2024-08-23 21:08
文章标签 使用 正确 log4j

本文主要是介绍如何正确使用log4j,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自: http://blog.sina.com.cn/s/blog_616b57310100f36s.html

 

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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1100498

相关文章

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否

Python使用Turtle实现精确计时工具

《Python使用Turtle实现精确计时工具》这篇文章主要为大家详细介绍了Python如何使用Turtle实现精确计时工具,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录功能特点使用方法程序架构设计代码详解窗口和画笔创建时间和状态显示更新计时器控制逻辑计时器重置功能事件

Swagger2与Springdoc集成与使用详解

《Swagger2与Springdoc集成与使用详解》:本文主要介绍Swagger2与Springdoc集成与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1. 依赖配置2. 基础配置2.1 启用 Springdoc2.2 自定义 OpenAPI 信息3.

Golang interface{}的具体使用

《Golanginterface{}的具体使用》interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golanginterface{}的具体使用,具有一定的参考价值,感兴趣的可以了... 目录一、什么是 interface{}?定义形China编程式:二、interface{} 有什么特别的?✅

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设