【Java日志系列】Log4j日志框架

[复制链接]
发表于 2026-2-5 16:21:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
媒介
一、Log4j简介
二、Log4j组件先容
1. Loggers
2. Appenders
3. Layouts
三、快速入门
1. 入门代码
2. 日志日志级别
四、设置文件的利用
五、自界说日志日志输特殊式
六、设置差别的Appender
1. 输出到文件
2. 输出到数据库
七、自界说Logger设置
总结 


媒介

  日志日志是软件开发中不可或缺的一部门,它可以大概资助开发者追踪步调的运行状态,诊断标题,以及监控监控体系性能。Apache Log4j作为一款成熟的日志框架,因其高度的机动性和可设置性,在Java开发范畴得到了广泛的应用。本文将先容Log4j的根本概念、构成部门、怎样设置及利用。
一、Log4j简介

  Log4j是Apache的一个开源项目,通过利用Log4j,我们开源控制日志信息运送的目的地是控制台、文件、GUI组件,乃至是套接口服务器、NT的变乱纪录器、UNIX Syslog守卫历程等;我们也可以控制每一条日志的输特殊式;通过界说每一条日志的输特殊式;通过界说每一条日志信息的级别,我们可以大概更加过细地控制日志的天生过程。最令人感爱好的是,这些可以通过一个设置文件来机动地举行设置,而不必要修改应用的代码。
二、Log4j组件先容

  Log4j重要由Loggers(日志纪录器)、Appenders(输出控制器)和Layout(日志格式化器)构成。此中Loggers控制日志的输出以及输出级别;Appenders指定日志的输出方式(输出到控制台、文件等);Layout控制日志信息的输特殊式。
1. Loggers

  日志纪录器,负责网络处理处罚日志纪录,实例的定名就是类的全限定名,如com.bjpowernode.log4j.XX,Logger的名字巨细写敏感,其定名具有继续机制:比方:name为com.bjpowernode.log4的logger会继续name为com.bjpowernode。Log4j中有一个特殊的logger叫做“root”,他是全部logger的根,也就意味着其他全部的logger都会直接大概间接地继续自root。root logger可以用Logger.getRootLogger()方法获取。自log4j 1.2 版本以来,Logger类已经代替了Category类。对于认识早期版本的log4j的人来说,Logger类可以被视为Category类的别名。
  关于日志级别信息,比方DEBUG、INOFO、WARN、ERROR...级别是分巨细的,DEBUG < INFO < WARN < ERROR,分别用来指定这条日志信息的告急水平,Log4j输出日志级别的规则是:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
2. Appenders

  纪录日志以及界说日志的级别仅仅是Log4j的根本功能,Log4j日志体系还提供很多强大的功能,好比答应把日志输出到差别的地方,好比控制台、文件等,可以根据天数大概文件巨细产生新的文件,可以以流的情势发送到其他地方等等。以下是一些常用的Appenders:


  • ConsoleAppender:将日志输出到控制台。
  • FileAppender:将日志输出到文件中。
  • DailyRollingFileAppender:将日志输出到一个日志文件,而且根据时间的差别输出差别的文件,默认天天输出一个文件。
  • RollingFileAppender:将日志信息输出到一个日志文件,而且指定文件的尺寸,当文件巨细到达指定尺寸时,会主动把文件改名,同时产生一个新的文件。
  • JDBCAppender:把日志信息生存到数据库中。
3. Layouts

  偶尔用户盼望根据本身的喜好格式化本身的日志输出,Log4j可以再Appenders的反面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包罗日志级别与信息的样式和包罗日志时间、线程、种别等信息的样式。以下是一些常用的Layouts:


  • HTMLLayout:格式化日志输出为HTML表格情势。
  • SimpleLayout:简单的日志输特殊式化,打印的日志如默认INFO级别的消息。
  • PatternLayout:最强大的格式化组件,可以根据自界说格式输出日志,假如没有指定转换格式,就是用默认的转换格式。
三、快速入门

1. 入门代码

  在正式编写代码之前,我们起首必要导入log4j的依靠,下面是一个示例:
  1. <dependency>
  2.      <groupId>log4j</groupId>
  3.      <artifactId>log4j</artifactId>
  4.      <version>1.2.12</version>
  5. </dependency>
复制代码
  接下来编写我们的快速入门代码,代码示比方下:
  1. // 快速入门
  2. @Test
  3. public void testQuick() {
  4.     BasicConfigurator.configure(); // 加载初始化配置
  5.     Logger logger = Logger.getLogger(Log4jTest.class);
  6.     logger.info("info");
  7. }
复制代码
  增补:可以在代码的最前面加上LogLog.setInternalDebugging(true); 输出日志加载更加详细的信息。
    这里必要注意的是,我们必要写上BasicConfigurator.configure()来加载初始化的设置信息,否则在运行的时间会给我们弹出如下的告诫:

2. 日志级别

  Log4j提供了8个级别的日志输出,分别为:


  • ALL 最低品级,用于打开全部级别的日志纪录。
  • TRACE 表现步调推进下的追踪信息,这个追踪信息的日志级别非常低,一样寻常环境下是不会利用的DEBUG 指出细粒度信息变乱堆调试应用步调黑白常有资助的,重要是共同开发,在开发过程中打印一些告急的运行信息。
  • INFO 消息的粗粒度级别运行信息。
  • WARN 表现告诫,步调在运行过程中会出现的有大概会发生的隐形的错误 注意:有些信息不是错误,但是这弓级别的输出目的就是给步调员以提示。
  • ERROR 体系的错误信息,发生的错误不影响体系的运行 一样寻常环境下,假如不想输出太多的日志,则利用该级别即可。
  • FATAL 表现严肃错误,它是那种一旦发生体系就不大概继续运行的严肃错误 假如这中级别的错误出现了,表现步调可以克制运行了
  • OFF 最高品级的级别,用户关闭全部的日志纪录此中。
  此中,DEBUG是我们在没有举行设置的环境下,默认的日志输出级别。
四、设置文件的利用

  在利用Log4j的时间,我们大概必要通过自界说设置文件来界说一些设置信息,增长编码的机动性,那么,我们该在那边界说我们的设置文件呢?设置文件中的属性又该怎样界说呢?下面的视频将对这个标题举行一个源码的追踪:
   
  有关源码追踪的步调如下图所示:

  下面是一个简单的自界说设置示例:
  1. log4j.rootLogger=trace,console
  2. # 配置appender输出方式
  3. log4j.appender.console=org.apache.log4j.ConsoleAppender
  4. # 配置输出的格式
  5. log4j.appender.console.layout=org.apache.log4j.SimpleLayout
复制代码
五、自界说日志输特殊式

  我们可以在设置文件中利用PatternLayout组件,并添加上自界说的格式设置,让日志格式按照步调员的想法举行输出,与自界说日志输特殊式的相干设置示比方下所示:
  1. log4j.rootLogger=all,console
  2. # console组件
  3. log4j.appender.console=org.apache.log4j.ConsoleAppender
  4. # layout组件
  5. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  6. # 自定义输出格式
  7. log4j.appender.console.layout.conversionPattern=%r [%t] %p %c %x - %m%n
复制代码
  在末了一行界说了日志的相干输特殊式,这种格式化输出接纳雷同于C语言的printf函数的打印格式格式化日志信息,详细的占位符及其寄义如下:
占位符寄义
%m输出代码中指定的消息
%p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r输出自应用启动到输出该log信息泯灭的毫秒数
%c输出所属的类目,通常就是地点类的全名
%t输生产生该日志变乱的线程名
%n输出一个回车换行符
%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在厥后指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},输出雷同:2002年10月18日 22:10:28,921
%l输出日志变乱的发生位置,包罗类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%F输出日志消息产生时地点的文件名称
%L输出代码中的行号
%%出一个"%"字符
  可以在%与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对齐方式,如:


  • %5c  输出category名称,最小宽度是5,category < 5,默认的环境下右对齐。
  • %-5c  输出category名称,最小宽度是5,category < 5,"-"号指定左对齐,会有空格。
  • %.5c  输出category名称,最大宽度是5,category > 5,就会将左边多出的字符截掉,< 5不会有空格。
  • %20.30c  输出category名称,< 20补空格,而且右对齐;> 30字符,就从左边交远销出的字符截掉。
六、设置差别的Appender

1. 输出到文件

    有关文件情势的输出,有三个Appender,分别为FileAppender、RollingFileAppender和DailyRollingFileAppender。后两者是对第一者的一个增强,此中RollingFileAppender中可以设置每个日志文件的巨细以及日志文件的数量,当日志文件的数量高出设定的数量时,默认将覆盖生存时间最久的日志文件,原则就是生存新的,覆盖旧的。而DailyRollingFileAppender是默认按照天来纪录日志,天天纪录一个日志文件,该Appender暂不支持日志文件的覆盖。下面是对三者的一个设置:
  1. # 配置输出形式为文件
  2. # Appender组件
  3. log4j.appender.file=org.apache.log4j.FileAppender
  4. # 第一个file是我们自己命名的appenderName,第二个file是我们用来指定文件位置的属性
  5. log4j.appender.file.file=1.log
  6. # 指定编码
  7. log4j.appender.file.encoding=UTF-8
  8. # layout组件
  9. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  10. # 自定义输出格式
  11. log4j.appender.file.layout.conversionPattern=%r [%t] %p %c %x - %m%n
  12. # 以文件大小来切分文件
  13. # Appender组件
  14. log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
  15. # 第一个file是我们自己命名的appenderName,第二个file是我们用来指定文件位置的属性
  16. log4j.appender.rollingFile.file=1.log
  17. # 指定编码
  18. log4j.appender.rollingFile.encoding=UTF-8
  19. # 指定日志文件的内容大小
  20. log4j.appender.rollingFile.maxFileSize=1MB
  21. # 指定日志文件的数量
  22. log4j.appender.rollingFile.maxBackupIndex=5
  23. # layout组件
  24. log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
  25. # 自定义输出格式
  26. log4j.appender.rollingFile.layout.conversionPattern=%r [%t] %p %c %x - %m%n
  27. # 以时间来切分文件
  28. # Appender组件
  29. log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
  30. # 指定文件名称
  31. log4j.appender.dailyRollingFile.file=1.log
  32. # 指定编码
  33. log4j.appender.dailyRollingFile.encoding=UTF-8
  34. # 指定日志文件的时间形式
  35. log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd
  36. # layout组件
  37. log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
  38. # 自定义输出格式
  39. log4j.appender.dailyRollingFile.layout.conversionPattern=%r [%t] %p %c %x - %m%n
复制代码
  利用上述设置,RollingFileAppender输出的结果如下图所示:

  利用上述设置,DailyRollingFileAppender输出的结果如下图所示:

   增补:对于日志文件的时间情势,我们也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
  

  • '.'yyyy-MM:每月
  • '.'yyyy-ww:每周
  • '.'yyyy-MM-dd:天天
  • '.'yyyy-MM-dd-a:天天两次
  • '.'yyyy-MM-dd-HH:每小时
  • '.'yyyy-MM-dd-HH-mm:每分钟
  2. 输出到数据库

  在这里,我先利用Navicat在我本机捏造机的数据库中创建了如下图所示的log表:

   接下来在maven中导入mysql毗连的依靠,并在设置文件中编写数据库毗连有关的设置:
  1. <dependency>
  2.      <groupId>com.mysql</groupId>
  3.      <artifactId>mysql-connector-j</artifactId>
  4.      <version>8.3.0</version>
  5. </dependency>
复制代码
  1. # Appender组件
  2. log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
  3. # 指定数据库驱动
  4. log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
  5. # 指定数据库地址
  6. log4j.appender.logDB.URL=jdbc:mysql://192.168.56.107:3307/logtest
  7. # 指定连接的用户名
  8. log4j.appender.logDB.User=root
  9. # 指定连接的密码
  10. log4j.appender.logDB.Password=123456
  11. # 定义执行的SQL语句
  12. log4j.appender.logDB.Sql=insert into log(create_time, level, category, file_name, message) values('%d{yyyy-MM-dd HH:mm:ss}', '%p', '%c', '%F', '%m')
  13. # Layout组件
  14. log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
  15. # 自定义输出格式
  16. log4j.appender.logDB.layout.conversionPattern=%r [%t] %p %c %x - %m%n
复制代码
   利用该设置运行后,输出到数据库的结果如下图所示:

七、自界说Logger设置

  我们从前所创建出来的Logger对象,默认都是继续rootLogger的,我们也可以自界说logger,让其他logger继续自自界说logger,这种继续关系就是按照包结构的关系来举行指定的,比方:   Logger logger = Logger.getLogger(Log4jTest.class); 路径是cn.sumou.Log4jTest,它的父Logger就是上层路径大概更上层的路径,如cn.sumou、cn。在设置文件中,我们可以按照如下图所示的方式自界说Logger的设置:

  输出结果如下图所示:

   增补:假如根节点的logger和自界说logger设置的输出位置是差别的,则取二者的并集;假如二者设置的日志级别差别,则按照自界说的logger的级别输出。
  总结 

  本文从Log4j的根本概念入手,先容了其核心组件(Loggers、Appenders、Layouts),并通过实际示例演示了怎样设置和利用Log4j。通过本文的学习,您应该可以大概明确Log4j的工作原理,把握日志纪录的根本操纵,以及怎样自界说日志输出的格式和目的地。别的,文章还先容了怎样通过设置文件机动地控制日志纪录的举动,这对于生产环境中日志管理和监控监控尤为告急。
  末了,固然Log4j是一个较为成熟的日志框架,但在选择日志工具时还必要思量项目的需求和技能栈的发展趋势。比年来,也有一些新的日志框架如Logback和SLF4J徐徐成为主流,它们在某些方面大概提供了更好的性能和特性支持。因此,在实际项目中选择符合的日志框架也是值得思量的因素之一。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表