Apache Log4j Java 日志组件详解

2023/05/12 posted in  开发技术

前言:
Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件、甚至是套接口服务 器、NT 的事件记录器、UNIX Syslog 守护进程等;

我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

1 主要的组件

Log4j有三个主要的组件:
loggers: 负责捕获日志信息 ,即日志纪录器,控制日志的输出以及输出级别(JUL做日志级别用Level类)
appenders: 负责输出信息到不同的目的地 ,即输出日志到指定的地方
layouts: 负责使用不同的样式输出日志,即格式化日志

1.1 日志级别

例如DEBUG、INFO、WARN、ERROR…级别是分大小的,
DEBUG < INFO < WARN < ERROR,可以用来代指该日志的重要程度,可以由这个来设置对应的。
image.png

1.2 日志输出位置

日志输出的位置是由参数appender决定的,根据不同的参数设定,可以将日志文件自定义输出到控制台、文件中等

- 常用Appenders:
    - ConsoleAppender  
        将日志输出到控制台
    - FileAppender 
        将日志输出到文件中
    - DailyRollingFileAppender (根据天数来对新日志文件的创建)  
        将日志输出到一个日志文件,并且每天输出到一个新的文件
    - RollingFileAppender (根据大小来对新日志文件的创建)  
        将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
    - JDBCAppender 
        把日志信息保存到数据库中

1.3 日志格式化

在日志输出中,用户可以根据自己的实际需求,把对应的日志按照自己的想法和格式进行输出,在Layouts给用户提供四种日志输出样式。

  • 根据HTML样式

  • 自由指定样式

  • 包含日志级别与信息的样式

  • 包含日志时间、线程、类别等信息的样式

  • 常用Layouts:

    • HTMLLayout
      格式化日志输出为HTML表格形式
    • SimpleLayout
      简单的日志输出格式化,打印的日志格式如默认INFO级别的消息
    • PatternLayout
      最强大的格式化组件,可以根据自定义格式输出日志,如果没有指定转换格式, 就是用默认的转换格式

案例使用:

- %m 输出代码中指定的日志信息
- %p 输出优先级,及 DEBUG、INFO 等
- %n 换行符(Windows平台的换行符为 “\n”,Unix 平台为 “\n”)
- %r 输出自应用启动到输出该 log 信息耗费的毫秒数
- %c 输出打印语句所属的类的全名
- %t 输出产生该日志的线程全名
- %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
- %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.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字符,就从左边交远销出的字符截掉

1.4 项目使用情况说明:

输出日志使用是DailyRollingFileAppender,会每天生成日志。
==优化点:== 目前项目中有实时库的存在,写日志会很多,导致当日日志文件也会很大,查看日志的时候会存在打开困难的情况,可以考虑使用按大小创建日志比如300MB创建一个新的,给一个新的命名。

输出级别:
目前的级别是在debug info warn error 这几个级别中
分为两个目录写日志 debug_log 、 error_log 这两个,error中写的是info最小的,debug中写的是debug最小的。
==优化点:== 两个日志写入内容有重复,
1、可以在控制层对日志进行整理处理,分别在不同的地方写入不同的日志。
2、规划重要耗时做debug处理,其他警告、报错信息放到error中去。

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE log4j:configuration PUBLIC  
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">  
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
  
    <appender name="A_ERROR" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="Append" value="true"/>  
        <param name="Encoding" value="UTF-8" />  
        <param name="File" value="/var/opt/meta/webapp/logs/meta_error.log"/>  
        <param name="DatePattern" value="'.'yyyyMMdd"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss} [%-5p] - %m%n"/>  
        </layout>  
        <filter class="org.apache.log4j.varia.LevelRangeFilter">  
            <param name="LevelMin" value="info"/>  
            <param name="LevelMax" value="error"/>  
            <param name="AcceptOnMatch" value="true"/>  
        </filter>  
    </appender>  
  
    <appender name="A_DEBUG" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="Append" value="true"/>  
        <param name="Encoding" value="UTF-8" />  
        <param name="File" value="/var/opt/meta/webapp/logs/meta_debug.log"/>  
        <param name="DatePattern" value="'.'yyyyMMdd"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss} [%-5p] - %m%n"/>  
        </layout>  
        <filter class="org.apache.log4j.varia.LevelRangeFilter">  
            <param name="LevelMin" value="debug"/>  
            <param name="LevelMax" value="error"/>  
            <param name="AcceptOnMatch" value="true"/>  
        </filter>  
    </appender>  
  
    <!-- framework logger -->  
    <logger name="java.sql">  
        <level value="warn" />  
    </logger>  
  
    <logger name="org.mybatis">  
        <level value="warn" />  
<!--        <appender-ref ref="STDOUT" />-->  
    </logger>  
  
    <logger name="org.apache">  
        <level value="warn" />  
    </logger>  
  
    <logger name="org.springframework">  
        <level value="warn" />  
    </logger>  
  
    <!-- the root logger -->  
    <root>  
        <level value="all" />  
        <appender-ref ref="A_ERROR" />  
        <appender-ref ref="A_DEBUG" />  
    </root>  
  
</log4j:configuration>

参考链接 :
【精选】日志框架(2) : Log4j介绍及使用_log4j日志的使用-CSDN博客

log4j配置详解 log4j中文文档_log4j官方文档-CSDN博客

本文作者:redtea 红茶的博客
本文链接:https://redtea.top版权声明:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可,非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。