深入理解 SpringBoot 日志框架:从入门到高级应用——(五)Log4j2配置文件详解
作者:mmseoamin日期:2023-12-25

文章目录

  • log4j2.xml 配置项
  • Configuration 节点
  • Properties 变量
  • Appender 附加器
    • ConsoleAppender
    • FileAppender
    • RollingFileAppender
    • SMTPAppender
    • Loggers 日志记录器
    • Filters 过滤器
    • Layout 输出格式
    • Log4j2-spring.xml 样例

      Log4j2 官方文档:https://logging.apache.org/log4j/2.x/manual/index.html

      Log4j2 是一个Java日志框架,用于记录应用程序在运行时的信息。它是 Log4j 的升级版本,提供了更快的处理速度,更快的日志记录和更丰富的日志记录功能,并支持异步日志记录,减少了对应用程序性能的影响。它可以非常灵活地配置和定制日志记录。是 Apache 软件基金会的开源项目,可以免费使用和修改。

      以下是一些 Log4j2 的主要特点:

      1. 高性能:Log4j2 拥有优秀的性能,可以轻松处理大量的日志数据。

      2. 灵活性:Log4j2 可以根据应用程序的需求进行高度自定义,包括定制输出格式、选择不同的日志记录器等。

      3. 可扩展性:Log4j2 支持许多扩展插件,可以轻松地与其他框架集成。

      4. 多线程安全:Log4j2 的设计考虑到了多线程安全问题,可以在多线程环境下正常使用。

      5. 可配置性:Log4j2 支持多种配置文件格式,包括 XML、JSON 和 YAML 等。

      总之,Log4j2 是一个功能强大、性能高效、灵活可扩展的日志框架,可以满足广泛的应用程序日志需求。

      log4j2.xml 配置项

      
        
          ...
        
        
          ...
        
        
          ...
        
      
      

      log4j2.xml 配置文件中包含以下配置项:

      配置项说明
      Configuration用于指定 Log4j2 的配置信息,包括日志级别、日志存储位置、日志格式等
      Appenders用于指定日志输出的目的地,包括文件、控制台、数据库等。每个 Appender 都需要指定一个 Layout(日志格式)
      Loggers用于指定每个日志记录器的日志级别和 Appender。可以通过指定 Logger 的名称、级别、以及添加的Appender,来控制日志的输出
      Filters用于指定针对特定Logger、Appender或LogEvent的过滤器,如正则表达式过滤、阈值过滤等
      Properties用于指定 Log4j2 的全局变量,可以在 Log4j2 配置文件中使用这些变量来配置一些参数
      Script用于指定 JavaScript 脚本,允许通过脚本来动态地生成日志信息
      Custom Levels用于定义自定义日志级别
      Include用于引入其他 XML 配置文件,允许将多个配置文件合并为一个配置

      这些配置项可以结合使用,通过配置文件的方式灵活地控制 Log4j2 的行为。

      Configuration 节点

      Log4j2 的 XML 配置文件包含以下几个部分:

      
        
          ...
        
        
          ...
        
        
          ...
        
      
      

      配置文件的根元素是,以下是一个 Log4j2.xml 的 Configuration 节点示例:

      
        
      
      

      其中,status属性指定日志的级别,monitorInterval 属性指定监控日志文件变化的时间间隔。其他常用的属性包括name、packages、shutdownHook、strict等。Log4j2.xml的 Configuration 属性包括:

      属性说明
      status指定日志记录器的状态,可以是“trace”、“debug”、“info”、“warn”或“error”
      monitorInterval配置文件监视间隔,单位是毫秒
      verbose是否在启动时显示详细的日志记录信息
      name指定日志配置文件的名称,可以为空
      packages指定需要自动配置的日志包
      shutdownHook指定是否使用JVM Shutdown Hook关闭日志记录器
      strict是否启用严格模式,如果启用则会强制要求所有配置项必须正确配置
      schema指定XML配置文件的模式
      advertiser指定广告器的类名,广告器用于将日志记录发送到远程或者本地的其他进程或应用

      Properties 变量

      log4j2.xml 文件中的 Properties 元素定义了一组键值对,可以在日志记录中使用。这些属性可以在配置文件中定义,也可以通过环境变量或其他方式在运行时指定。

      以下是一个示例Properties元素的配置:

      
         myApp
         /var/log/myApp
      
      

      在上述示例中,定义了两个属性:appName 和 logDir。这些属性可以在日志记录模板中使用,如下所示:

      
         
      
      

      在这个例子中,通过使用${appName}和${logDir}在日志记录模板中使用了定义的属性。这将会被解析为实际的值,如myApp和/var/log/myApp。

      通过使用 Properties 元素,可以轻松地在整个配置文件中共享常量值,并且可以在运行时方便地更改这些值。

      Appender 附加器

      Log4j2 的 Appender 是用于将日志消息输出到指定目的地的组件。Log4j2 提供了多种 Appender,包括但不限于:

      附加器类型说明
      ConsoleAppender将日志消息输出到控制台
      FileAppender将日志消息输出到文件
      RollingFileAppender将日志消息输出到文件,并支持日志轮换
      SocketAppender将日志消息发送到远程服务器的Socket端口
      JMSAppender将日志消息发送到JMS队列或主题
      SMTPAppender将日志作为电子邮件发送
      SyslogAppender将日志输出到 Syslog 服务器
      JDBCAppender将日志写入数据库
      KafkaAppender将日志消息发送到Kafka主题

      通过配置 Log4j2 的 Appender,我们可以根据不同的需求将日志消息输出到不同的目的地,方便后续的日志分析和管理。

      ConsoleAppender

      ConsoleAppender 是一种用于将日志输出到控制台的日志输出器。一个简单的样例如下:

      
        
          
        
      
      

      以下是一些常用的 ConsoleAppender 参数:

      参数说明
      name指定日志输出器的名称
      target指定输出目标,例如 System.out 或 System.err,默认为 System.out
      follow指定是否跟踪 stdout 或 stderr 的变化(仅适用于 Windows 平台)
      encoding指定字符编码,用于控制台输出
      immediateFlush指定是否立即将日志消息刷新到控制台,默认为 True

      FileAppender

      以下是一个log4j2.xml的FileAppender样例:

      
        
          
        
      
      

      在这个配置中,我们定义了一个 FileAppender,并配置了输出文件为 logs/myapp.log,这意味着日志消息都将被写入 logs/myapp.log 文件中。我们使用了 PatternLayout 指定了输出日志格式。

      Log4j2的FileAppender有以下参数:

      参数说明
      name指定Appender的名称
      fileName日志文件的保存路径和名称。可以使用相对路径和绝对路径,也可以使用变量(${})
      append是否在原有的日志文件中追加日志,默认为true
      bufferedIo是否开启缓存写入,默认为true
      bufferSize缓冲区的大小,默认为8192
      immediateFlush是否立即写入日志文件,默认为true
      layout指定日志文件的输出格式
      filePermissions指定日志文件的权限。可以是UNIX风格的数字权限(如0644)或者文件权限符号(如rwxr-xr–)
      fileOwner指定日志文件的拥有者
      fileGroup指定日志文件的所属组

      RollingFileAppender

      RollingFileAppender 是 Log4j2 中用于将日志输出到文件的一种 appender,它可以实现日志文件的滚动和压缩,以支持更长时间的日志存储。

      
        
          
          
            
            
          
          
        
      
      

      在这个配置中,我们定义了一个RollingFileAppender 来处理日志。它的名称是“RollingFileAppender”,它的文件名是“logs/myapp.log”,并且它的文件模式是“logs/myapp-%d{yyyy-MM-dd}-%i.log.gz”。这将导致日志文件以日期和索引进行轮换,并使用gzip进行压缩。

      在RollingFileAppender中,我们使用了PatternLayout来指定日志的格式。我们还添加了两个策略,一个是TimeBasedTriggeringPolicy,它基于时间触发轮换,另一个是 SizeBasedTriggeringPolicy,它基于文件大小触发轮换。我们还指定了一个 DefaultRolloverStrategy 来定义轮换的最大文件数。

      RollingFileAppender 的参数如下:

      参数说明
      name指定Appender的名称
      fileName日志文件的保存路径和名称。可以使用相对路径和绝对路径,也可以使用变量(${})
      filePattern日志文件的文件名模式,支持日期格式化。例如:logs/myapp-%d{yyyy-MM-dd}-%i.log,表示按日期划分日志文件,并使用索引号区分不同的日志文件
      append是否在原有的日志文件中追加日志,默认为true
      bufferedIo是否开启缓存写入,默认为true
      bufferSize缓冲区的大小,默认为8192
      immediateFlush是否立即写入日志文件,默认为true
      layout指定日志文件的输出格式
      policy滚动策略,支持基于时间、文件大小等方式滚动,默认为 DefaultRolloverStrategy
      strategy日志消息的格式化方式,需指定一个 Layout 实例
      filter日志过滤器,需指定一个 Filter 实例
      ignoreExceptions是否忽略错误,当写入日志文件发生错误时是否抛出异常,默认为 true

      SMTPAppender

      SMTPAppender是log4j2中的一个appender,它允许将日志信息通过电子邮件发送。以下是一个示例log4j2.xml配置文件中SMTPAppender发送html格式的邮件:

      
        
          
        
      
      
        
          
        
      
      

      在这个配置文件中,我们使用SMTPAppender来发送邮件。其中,我们设置了SMTP服务器的主机名、端口、用户名和密码等信息,并指定了发送的邮件内容为html格式。我们还定义了一个HtmlLayout来格式化邮件内容,它将普通的日志信息格式化为html形式。

      在实际使用中,只需将to和from设置为你的邮箱地址,以及填写正确的smtpHost、smtpPort、smtpUsername和smtpPassword即可成功发送一封带有html格式的邮件。

      以下是SMTPAppender的属性:

      参数说明
      nameAppender的名称
      to指定邮件接收者的电子邮件地址
      cc指定邮件抄送者的电子邮件地址
      bcc指定邮件密送者的电子邮件地址
      from指定邮件发送者的电子邮件地址
      smtpHostSMTP服务器的主机名或IP地址
      smtpPortSMTP服务器的端口号,默认为25
      smtpUsernameSMTP服务器的用户名
      smtpPasswordSMTP服务器的密码
      smtpProtocolSMTP服务器的协议,默认为smtp
      bufferSize缓冲区大小,默认为512
      subject邮件主题,默认为Log4j Log Message
      layout指定日志信息的格式
      filter指定日志信息的过滤器
      ignoreExceptions是否忽略异常,默认为true。如果设置为false,则发生异常时邮件发送将会失败。

      以上是 SMTPAppender 的属性,可以根据需要进行配置。

      Loggers 日志记录器

      log4j2.xml文件中的loggers元素定义了日志记录器的配置。它包含一个或多个logger元素,每个logger元素代表一个具体的日志记录器。每个logger元素可以指定日志级别、日志输出目标(appender)、日志过滤器(filter)等。

      以下是一个示例loggers元素的配置:

      
          
              
              
          
          
              
              
          
      
      

      在上面的示例中,有两个 logger 元素。第一个 logger 元素的 name 属性为“com.example”,表示这是一个名为“com.example”的日志记录器。它的 level 属性为“info”,指定日志级别为“info”级别。additivity 属性为“false”,表示在这个日志记录器中,日志不会被发送到它的父级日志记录器中。

      第二个 logger 元素是 root 元素,表示所有未被明确指定日志记录器的日志都会被记录到这个 root 记录器中。它的 level 属性为“error”级别。

      两个 logger 元素都引用了两个 appender(CONSOLE 和 FILE),这表示日志会被输出到控制台和文件中。

      Filters 过滤器

      log4j2.xml 中的 Filters 指的是过滤器,可以帮助我们过滤掉不需要的日志。Filters可以被配置在 Logger、Appender、Layout 等组件中。常用的 Filters 有以下几种:

      过滤器说明
      ThresholdFilter根据日志级别过滤,比如只输出ERROR级别及以上的日志
      RegexFilter根据正则表达式过滤,比如只输出满足特定正则表达式的日志
      MapFilter根据键值对过滤,比如只输出包含特定键值对的日志
      StructuredDataFilter根据结构化数据过滤,比如只输出带有指定结构化数据的日志

      Filters 可以被链式组合起来,以实现更复杂的过滤逻辑。例如,可以使用 ThreadContextMapFilter 过滤指定键值对,然后再使用 ThresholdFilter 过滤指定级别的日志事件。

      可以在 log4j2.xml 文件中通标签中添加一个或多个Filters。例如:

      
        
          
          
        
      
      

      该配置文件将所有级别为WARN及以上的日志事件过滤掉,并将其输出到控制台。其中,onMatch 和 onMismatch 表示匹配和不匹配时的处理方式,可以取值为DENY(拒绝)、NEUTRAL(中立)和ACCEPT(接受)。

      Layout 输出格式

      Log4j2的Layout是用于指定日志消息输出格式的组件。它定义了日志事件的消息格式,以便它可以被写入到指定的输出目标中。

      Log4j2提供了多种Layout实现,包括:

      LayoutType说明
      PatternLayout通过指定一个格式化字符串来输出日志消息。
      HtmlLayout用HTML标记格式化日志消息,使其在网页上更容易查看。
      XmlLayout以XML格式输出日志事件。
      CsvLayout以逗号分隔的格式输出日志消息,方便导入到Excel等表格软件中。
      JsonLayout以JSON格式输出日志事件。

      用户可以根据需要选择合适的Layout实现,并根据自己的需求进行配置和定制化。例如,可以通过设置Layout的属性来控制时间和日期格式、输出日志级别等信息。

      Log4j2-spring.xml 样例

      下面是一个示例的 log4j2.xml 配置文件,其中包含了按大小滚动的设置,以及控制日志输出的配置选项:

      
      
          
              
              
                  
                  
                      %d %p %c{1.} [%t] %m%n
                  
                  
                      
                  
                  
              
              
              
                  
                      %d %p %c{1.} [%t] %m%n