深入理解 SpringBoot 日志框架:从入门到高级应用——(五)Log4j2配置文件详解

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 配置项

<Configuration>
  <Appenders>
    ...
  </Appenders>
  <Loggers>
    ...
  </Loggers>
  <Properties>
    ...
  </Properties>
</Configuration>

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 配置文件包含以下几个部分:

<Configuration>
  <Appenders>
    ...
  </Appenders>
  <Loggers>
    ...
  </Loggers>
  <Properties>
    ...
  </Properties>
</Configuration>

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

<Configuration status="warn" monitorInterval="30">
  <!-- ... -->
</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元素的配置:

<Properties>
   <Property name="appName">myApp</Property>
   <Property name="logDir">/var/log/myApp</Property>
</Properties>

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

<File name="File" fileName="${logDir}/myApp.log">
   <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p ${appName} - %m%n"/>
</File>

在这个例子中,通过使用${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 是一种用于将日志输出到控制台的日志输出器。一个简单的样例如下:

<Appenders>
  <Console name="Console" target="SYSTEM_OUT">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
  </Console>
</Appenders>

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

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

FileAppender

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

<Appenders>
  <File name="FileAppender" fileName="logs/myapp.log">
    <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
  </File>
</Appenders>

在这个配置中,我们定义了一个 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,它可以实现日志文件的滚动和压缩,以支持更长时间的日志存储。

<Appenders>
  <RollingFile name="RollingFileAppender" fileName="logs/myapp.log"
               filePattern="logs/myapp-%d{yyyy-MM-dd}-%i.log.gz">
    <PatternLayout pattern="%d %p %C{1.} [%t] %m%n"/>
    <Policies>
      <TimeBasedTriggeringPolicy />
      <SizeBasedTriggeringPolicy size="100 MB" />
    </Policies>
    <DefaultRolloverStrategy max="10"/>
  </RollingFile>
</Appenders>

在这个配置中,我们定义了一个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格式的邮件:

<Appenders>
  <SMTP name="smtpAppender" subject="Log4j2 Test Mail" to="[email protected]"
        from="[email protected]" smtpHost="smtp.gmail.com" smtpPort="587" smtpUsername="yourusername"
        smtpPassword="yourpassword" smtpProtocol="smtp" smtpDebug="true"
        htmlMsgLayout="${htmlMsgLayout}">
    <ThresholdFilter level="WARN"/>
  </SMTP>
</Appenders>
<Layouts>
  <HtmlLayout title="Log4j2 Test Mail">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
  </HtmlLayout>
</Layouts>

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

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

以下是SMTPAppender的属性:

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

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

Loggers 日志记录器

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

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

<Loggers>
    <Logger name="com.example" level="info" additivity="false">
        <AppenderRef ref="CONSOLE" />
        <AppenderRef ref="FILE" />
    </Logger>
    <Root level="error">
        <AppenderRef ref="CONSOLE" />
        <AppenderRef ref="FILE" />
    </Root>
</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>标签中添加一个或多个Filters。例如:

<Appenders>
  <Console name="ConsoleAppender" target="SYSTEM_OUT">
    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
  </Console>
</Appenders>

该配置文件将所有级别为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 配置文件,其中包含了按大小滚动的设置,以及控制日志输出的配置选项:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <!-- Size-based rolling policy -->
        <RollingFile name="SizeBasedRollingFileAppender" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd}-%i.log" >
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>

        <!-- Console appender -->
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
        </Console>
        
    </Appenders>
    <Loggers>
        <!-- Root logger -->
        <Root level="INFO">
            <AppenderRef ref="SizeBasedRollingFileAppender" />
            <AppenderRef ref="ConsoleAppender" />
        </Root>
    </Loggers>
</Configuration>

猜你喜欢

转载自blog.csdn.net/qq_20185737/article/details/131252893