原文地址:http://www.codeceo.com/article/log4j-usage.html

日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。

一、入门实例

1、 新建一个Java工程,导入Log4j包,pom文件中对应的配置代码如下:

<!-- log4j support -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

2、 resources目录下创建log4j.properties文件

### 设置###
log4j.rootLogger = debug,stdout,D,E### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志到=/home/duqi/logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /home/duqi/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 输出ERROR 级别以上的日志到=/home/admin/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/home/admin/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3、输出日志的例子如下

package com.javadu.log;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Log4JTest {private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);public static void main(String[] args) {// 记录debug级别的信息logger.debug("This is debug message.");// 记录info级别的信息logger.info("This is info message.");// 记录error级别的信息logger.error("This is error message.");}
}

4、输出结果
首先,控制台输入如下图所示:

控制台输出结果

然后,查看 /Users/duqi/logs 目录下的debug.log和error.log文件,内容分别如下,可以看出,:

  • debug.log
  • error.log

二、Log4J基本使用方法

Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容

2.1 定义配置文件

其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:

  1. 配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指把日志信息输出到哪个地方。您可以同时指定多个输出目的地,例如上述例子我们制定了stdout、D和E这三个地方。

  1. 配置文件的输出目的地Appender,一般,配置代码的格式如下
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN

其中,Log4j提供的appender有以下几种:

  • org.apache.log4j.ConsoleAppender(控制台)
  • org.apache.log4j.FileAppender(文件)
  • org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  • org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  • org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
  1. 配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN

其中,Log4j提供的layout有以下几种:

  • org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  • org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

  • %m 输出代码中指定的消息
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r 输出自应用启动到输出该log信息耗费的毫秒数
  • %c 输出所属的类目,通常就是所在类的全名
  • %t 输出产生该日志事件的线程名
  • %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

2.2 在代码中使用Log4j

  1. 获取记录器
    使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:public static Logger getLogger( String name);通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

  2. 读取配置文件
    当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
  1. 插入记录信息(格式化日志信息)
    当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;

2.3 日志级别

每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。

上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用b了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

三、Spring中使用Log4J

一般是在web.xml配置文件中配置Log4j监听器和log4j.properties文件,代码如下:

<context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:/config/log4j.properties</param-value>
</context-param>
<context-param><param-name>log4jRefreshInterval</param-name><param-value>60000</param-value>
</context-param>
<listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

四、实战经验总结

在商业项目中,日志可用于数据化运营,需要记录关键的业务数据;开发过程中必须准确记录业务日志,如果丢失业务数据则是很严重的故障。

日志信息的打印会影响到服务的性能(吞吐量和响应时间),在业务逻辑简单的服务中更加明显。举个例子,我最近负责的一个会话管理的模块,在性能压测的时候发现TPS只能达到250左右,被这个问题困扰了很久。首先找出性能的瓶颈:缓存操作和数据库操作

  • 发现在缓存操作中有一行打印日志的语句使用了JSON库,例如JSON.toJsonString(obj),这个对象非常复杂,导致一个读取缓存的操作可以达到300ms左右,而实际上应该在10ms左右;
  • 发现数据库操作非常耗时,但是经过分析,在系统稳定后,压力并不是很大时,数据库操作也比较正常;但是一旦并发数增高,则RT迅速增大,通过链路分析工具,查看在系统负载变高的过程中的指标发现
    CallAppenders() 方法占据了将近40%以上的CPU时间,因此我才考虑到需要将日志级别调整为ERROR级别——不打印DEBUG级别的日志,至此,这个问题算是解决了。

【转】最详细的Log4J使用教程一、入门实例二、Log4J基本使用方法三、Spring中使用Log4J四、实战经验总结相关推荐

  1. spring中加入log4j

    spring中加入log4j <context-param><param-name>log4jConfigLocation</param-name><para ...

  2. Python 3 教程一:入门

    Python已经是3.1版本了,与时俱进更新教程.(由于Django不支持python3, 所以为了你的发展潜力, 建议你学习python2.x ) python 2.x教程地址: http://ww ...

  3. Zen Coding 系列教程一:入门

    Zen Coding 是一款高效用于开发HTML与CSS的编码插件,可以安装到很多软件中使用 Zen Coding 项目:http://code.google.com/p/zen-coding/    ...

  4. Spring中使用Log4j记录日志

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/logging-with-log4j.html: 例子: pom.xml: <project ...

  5. 二维码制作方法有哪些?教你简单的二维码制作方法

    二维码是怎么制作的呢?二维码是用某种特定的几何图形按照一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.现如今,随着智能手机的广泛普及和技术的不断改进,二维码已经被广泛应用于商业领域中 ...

  6. 【计算机网络实验】教程一:用最短的时间组建小型局域网(亲身经历)

    [计算机网络实验]教程一:用最短的时间组建小型局域网(亲身经历) 目录 [计算机网络实验]教程一:用最短的时间组建小型局域网(亲身经历) 一.前言 二.准备工作 (一)认识窗口及相关组件 (二)特别需 ...

  7. 腾讯云服务器使用教程,手把手教你入门

    腾讯云服务器使用教程包括注册账号实名认证.选择云服务器CVM或轻量应用服务器CPU内存带宽和系统盘配置.安全设置和云服务器远程连接.安全组端口开通教程.云服务器环境部署以搭建网站为例手把手网站上线,云 ...

  8. AUTOCAD自学教程一

    AUTOCAD自学教程一 AUTOCAD自学教程 在学习任何一款软件的时候,第一步也是非常必要的一步就是如何的安装软件. 下面我们讲解如何的安装这个软件. 1.安装autocad 2.安装产品 3.正 ...

  9. pytorch打印模型参数_Pytorch网络压缩系列教程一:Prune你的模型

    Pytorch网络压缩系列教程一:Prune你的模型 本文由林大佬原创,转载请注明出处,来自腾讯.阿里等一线AI算法工程师组成的QQ交流群欢迎你的加入: 1037662480 深度学习模型取得了前所未 ...

最新文章

  1. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)
  2. ros 工作流程图4
  3. php连接mysqli面向过程,PHP基础知识总结:MySQLi 面向过程
  4. Web前端技术分享:全栈工程师常用的开发工具
  5. 2000坐标系高程与85高程转换_【科普】测量人必须知道的几大坐标系
  6. jboss修改服务器端口,改了默认端口的jboss不能用shutdown.sh关闭,怎样解决
  7. 红魔1android版本能升到多少,红魔5G:实力全开,比快更快
  8. 超过屏幕长度字符省略
  9. 苦苦发愁学习Python?七天掌握Python就在此时
  10. 使用JMH做Java微基准测试(二)Hello2020!
  11. android+4.3+usb存储模式,点点点:点出来安卓4.3的USB调试
  12. paip.提升用户体验---论文本编辑器的色彩方案
  13. 通过js获取本机的IP地址
  14. 在CAD中加载卫星影像的免费插件
  15. android计算器如何保存记录,计算器历史记录怎么看
  16. 网易花19亿买地,要在上海建总部大楼,团队至少2000人
  17. 纽约州立石溪分校计算机科学排名,纽约州立大学石溪分校计算机科学专业排名第40(2020年USNEWS美国排名)...
  18. buuctf Mark loves cat
  19. 把nasm集成到Visual studio 2013中
  20. 今天你吃粽子了吗?快进来看看你都吃过哪一种粽子吧

热门文章

  1. 关于markdown编辑器下(语雀的).md文件导入csdn,图片无法显示的问题
  2. ESP32 开发笔记(四)LVGL控件学习 Table 表格控件
  3. Java中的byte类型是有符号的吗_JAVA中byte类型的介绍。 谢谢
  4. 微信小程序引入vant Weapp
  5. objectARX中如何插入动态块
  6. CCNet: Criss-Cross Attention for Semantic Segmentation论文读书笔记
  7. 安装Git和注册GitHub账号
  8. linux jq 数组,Shell 数组
  9. php solr docker搭建,深入浅出Docker技术- 基于Docker Solr集群的搭建
  10. 密码学基础篇----密码学的加解密