log4j2 官方文档:https://logging.apache.org/log4j/2.x/manual/index.html
Log4j2 是一个Java日志框架,用于记录应用程序在运行时的信息。它是 Log4j 的升级版本,提供了更快的处理速度,更快的日志记录和更丰富的日志记录功能,并支持异步日志记录,减少了对应用程序性能的影响。它可以非常灵活地配置和定制日志记录。是 Apache 软件基金会的开源项目,可以免费使用和修改。
以下是一些 Log4j2 的主要特点:
-
高性能:Log4j2 拥有优秀的性能,可以轻松处理大量的日志数据。
-
灵活性:Log4j2 可以根据应用程序的需求进行高度自定义,包括定制输出格式、选择不同的日志记录器等。
-
可扩展性:Log4j2 支持许多扩展插件,可以轻松地与其他框架集成。
-
多线程安全:Log4j2 的设计考虑到了多线程安全问题,可以在多线程环境下正常使用。
-
可配置性: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="youremail@mail.***"
from="fromemail@mail.***" smtpHost="smtp.gmail.***" 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 | 指定邮件接收者的电子邮件地址 |
*** | 指定邮件抄送者的电子邮件地址 |
b*** | 指定邮件密送者的电子邮件地址 |
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="***.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 属性为“***.example”,表示这是一个名为“***.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(中立)和A***EPT(接受)。
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="A***EPT" 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>