log4j2简介
log4j是一个Java 日志框架, 旨在为应用程序提供记录日志的功能。 log4j大体可以分为2个版本: 1.x和2.x, 1.x已经不再维护,目前主流的应用版本是2.x, 2.x也被称为log4j2。
log4j2与其他日志框架的关系
slf4j
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
SLF4J是Java中各种日志框架的抽象, 比如java.util.Logging、logback、log4j等, 它允许在部署时插入所需的日志框架。
SLF4J通过加载org.slf4j.api.LoggerFactoryBinder的实现类org.slf4j.impl.StaticLoggerBinder来绑定真正的日志组件,具体的绑定方法在LoggerFactory的bind方法里面。
SLF4J的使用方式为:
public class HelloWorld{
private static final LoggerFactory LOGGER = LoggerFactory.getLogger(HelloWorld.class);
public static void main(String[] args){
LOGGER.info("this is info");
LOGGER.debug("this is debug");
// ...
}
}
通过SLF4J提供的工厂类LoggerFactory获取日志对象Logger, 它们的API如下:
- LoggerFactory
getLogger(Class<?> clazz): 最终通过调用下面的重载实现,name为clazz的getName返回值。getLogger(String name):获取真正的绑定日志组件ILoggerFactory的实现子类, 调用它的getLogger(String name)获取日志对象。
- Logger: Logger是一个接口, 提供了各种日志级别的方法定义,如:trace、debug、info、warn、error和getName, 如:
public String getName();
public void trace(String format, Object arg1, Object arg2);
public void debug(String format, Object arg);
public void info(String msg);
public void warn(Marker marker, String msg, Throwable t);
public void error(Marker marker, String msg, Throwable t);
log4j
log4j一般特指log4j 1.x, 是log4j 1.x多个版本的统称,目前已经停止维护。
log4j和log4j2的主要区别:
- 配置文件类型
- log4j通过一个.properties作为主配置文件。
- log4j2主要采用.xml、.json或.jsn来完成配置。
- 核心JAR包
- log4j: log4j只需引入
log4j:log4j一个jar包。- log4j2: log4j2需要引入
org.apache.logging.log4j:log4j-core和org.apache.logging.log4j:log4j-api2个jar包。
- 文件渲染
- log4j: log4j想要生效, 需要在
web.xml中配置, 支持自由配置。- log4j2: 配置文件需要放在工程
resources目录下,并且命名为log4j2.[xml/json]
- Log调用
- log4j: Logger logger = Logger.getLogger(name);
- log4j2: Logger logger = LoggerManager.getLogger(name);
log4j2
log4j2是log4j 2.x版本的统称, 是目前log4j主流的版本, 相比log4j和logback, 根据官网描述,它具有以下优点:
- 日志准确性: log4j2不会丢失事件(实际会存在丢失的情况)。
- 性能提升: log4j2支持基于
LMAX disruptor的异步Logger, 在多线程场景下, 性能优于log4j和logback10个数量级。- 产生垃圾少: log4j2在独立应用程序是无垃圾的, 在web应用程序中是低垃圾的,这可以减轻垃圾回收器的压力。
- 插件化配置: 通过添加
Appender、Filters、Layout、Patterns、Lookup扩展框架。- 自定义日志级别。
- 支持Java8 Lambda表达式。
- 支持SysLog
- 并发支持并支持最低级别锁定, 避免死锁问题, 避免同步调用。
logback
logback作为log4j1.x的继承者,重构优化了log4j1.x存在的一些问题,logback分为3各模块:
logback-core: 基础模块。logback-classic: log4j1.x的改进版本, 原生实现SLF4J。logback-access:集成Tomcat和Jetty等容器, 提供Http访问日志功能。
Log4j2特点
Log4j2是目前Java世界中最好的日志组件, 相比其他日志组件使用更加广泛, 性能更加优异,参考官方Benchmarks。
Log4j2入门
Log4j2核心架构
Log4j2核心架构如下:
使用时, 通过LogManager请求具有特定名称的Logger, LogManager会定位到具体的LoggerContext, 然后从中获取Logger。
public class Log4j2Use {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("this is a log4j2 log");
}
}
LoggerContext
LoggerContext是Logging系统的上下文, 一个应用程序可能会有多个LoggerContext,一搬来说独立应用程序只有一个。它主要维护了应用的Logger列表和Configuration配置。
Configuration
每个LoggerContext都有一个活动的Configuration。它包含了所有的Appenders、上下文范围的Filter、LoggerConfigs,并包含大对StrSubstitutor的引用,其实就是对应Log4j2的配置文件。当重新配置时,将存在2个配置对象,直到所有Logger指向新的配置, 旧的配置将被停止并丢弃。
Logger
Logger是Log4j的核心接口, 并不执行任何直接操作, 它只是有一个名称和Appender相关联,它扩展了AbstractLogger并实现了真实调用的方法, 如果配置修改了, Logger也会关联不同的LoggerConfig对象, 最终导致行为被修改。
调用LoggerManager.getLogger方法, 相同的日志名称始终返回相同的Logger对象的应用, 比如:
Logger a = LoggerManager.getLogger("ab");
Logger b = LoggerManager.getLogger("ab");
Log4j采用软件名称来命名Logger, 通过在每个类中实例化一个Logger来完成,Logger的名称是类的完全限定类名, 这样可以很方便识别日志消息的来源, 但是Log4j不限定名称, 可以自定义实现。
Logger并不等同于配置文件中定义的
Logger节点, 相反Logger中会维护一个PrivateConfig对象,它包含了Configuration、LoggerConfig等引用。可以理解为此处的Logger是面向用户的日志入口, 可以存在多个, 多个Logger可以引用相同的LoggerConfig。
LoggerConfig
LoggerConfig对应于配置文件中的Logger要素,LoggerConfig包含了一组Filter、AppenderRef的引用,以及level、name、additivity。
Filter
Filter用来定义过滤规则, 与防火墙的过滤规则类则类似, 每个过滤器返回的结果有3种类型:
Accept: 通过事件。Deny: 拒绝事件Neutral:传递给其他事件,如果没有其他事件, 则处理。
Appender
Appender意为附加器,即输出的目的地,Log4j支持控制台、文件、Socket、Flume、JMS、Syslog以及各种数据库。
发送给Logger的每个消息都将转发给此Logger的LoggerConfig中定义的所有Appender以及LoggerConfig父级LoggerConfig的Appender。
Layout
Layout用来定义输出的格式。
Log4j2日志级别
Log4j2支持以下日志级别:
ALL: 匹配所有级别事件。TRACEDEBUGINFOWARNERRORFATALOFF: 不匹配任何事件。
Log4j2配置规范
配置方式
- 配置文件方式:
XML、JSON、YAML或properties 文件。 - 编程方式: 创建
ConfigurationFactory和Configuration的实现。 - 编程方式: 通过调用
Configuration中公开的API添加组件到默认配置中。 - 编程方式: 通过调用内部
Logger类的方法。
配置架构
Log4j2的配置反映为树形结构, 每个配置元素对应一个节点, 节点包含了一组属性,一组子节点和一个插件类型。实际上,每个节点必须有一个对应的插件, 因为插件是实际执行节点的工作组件。
Log4j2支持的每一种格式都有一个对应的ConfigurationFactory。Factory默认是一个插件, 它声明了支持的文件类型、优先级。 其中Properties Format优先级最高, 依次为YAML、JSON、XML。
Log4j2工作时,会执行每一个Factory, 以确定提供了哪种配置方式, 并创建相应的配置对象。
由于Propeties Format方式不是树结构, 相对其他几种文件格式配置文件较为冗余。
Log4j的配置对大小写不敏感。
自动配置
Log4j2具有在初始化期间自动化配置的能力, 如上节所说, 它启动时会找到所有的ConfiguationFactory插件, 并按优先级从高到低排序它们。它默认提供4种ConfigurationFacotry插件。
它的启动顺序如下:
- 检查系统属性:
log4j2.configurationFile,尝试使用匹配文件扩展名的ConfigurationFactory来加载配置, 不限于本地位置,也可能包含URL. - 如果没有设置该属性, 则按照优先级依次尝试在
classpath上寻找以下文件加载配置:log4j2-test.propetieslog4j2-test.yaml|log4j2-test.ymllog4j2-test.json|log4j2-test.jsnlog4j2-test.xmllog4j2.propertieslog4j2.yaml|log4j2.yamllog4j2.json|log4j2.jsnog4j2.xml
3.如果找不到配置文件,则DefaultConfiguration则会启用, 这会导致日志输出到控制台。
DefaultConfiguration的配置如下:
- 附加到
ROOT的ConsoleAppender。 PatternLayout的配置为:%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n。ROOT的默认日志级别为ERROR。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
从URL配置
URI加载过程
- 当系统属性
log4j2.configurationFile引用了URI时, 先确认URL是否使用文件协议, 如果URL有效会继续处理。 - 如果使用文件协议以外的协议, 则会检查系统属性
log4j2.Configuration.allowedProtocols是否包含指定的协议,如果包含则定位文件并继续处理。 - 如果不包含该协议, 则会抛出错误并记录。
- 如果
log4j2.Configuration.allowedProtocols系统属性无设置值, 则默认采用Https协议。 - 如果将系统属性
log4j2.Configuration.allowedProtocols设置为"_none", 则代表不支持文件协议之外的其他协议。
远程身份认证
Log4j支持需要远程身份认证的URI, 认证方式如下:
- 如果指定了
log4j2.Configuration.username和log4j2.Configuration.password,则用于身份认证。 - 如果密码被加密, 可以在
log4j2.Configuration.passwordDecryptor系统属性中自定义密码解密器的完全限定类名称。 log4j2.Configuration.authenticationProvide系统属性设置AuthenticationProvider的自定义完全限定类名。
可加性(Additivity)
Additivity表示事件是否被父级记录器记录。如果为false表示会被父级记录器记录, 否则不会传递给父级记录器, 默认为true。
比如:
<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>
com.foor.Bar的日志会被记录2此, 第一次被com.foor.Bar记录, 第二次被其父级记录器Root记录。 如果设置为false,则只会被com.foo.Bar记录一次, 如下:
<Logger name="com.foo.Bar" level="TRACE" additivity="false"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>
自动重新配置
从文件配置时, Log4j能自动检测对配置文件的修改并重新配置自身。如果配置了monitorInterval元素并且值不为零, 会定时检测并重新加载配置, 最小为5秒。如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
...
</Configuration>
配置语法
Configuration配置语法
Configuration主要包含了Loggers、Appenders、Filters3个子元素。
-
Configuration元素属性monitorInterval:重新加载的间隔时间, 单位秒。name: 配置名称。advertiser: 广告上配置。packages: 用于搜索插件的package名称逗号分隔列表。shutdownTimeout: JVM关闭时超时时间, 单位毫秒, 默认零。status: 记录Log4j内部事件的级别, 可以用来Debug。strict:是否允许使用严格的XML格式。schema: 标识类加载器的位置,以定位用于验证配置的 XML 模式。仅当strict设置为true时才有效。如果未设置,则不会进行架构验证。
-
Configuration子元素-
Loggers: 记录器LoggerConfig配置。 -
Appenders: 附加器配置 -
Properties: 属性配置。 -
Filters/Filter: 过滤器配置。 -
CustomLevelsType/CustomLevelType: 自定义日志级别。
-
Configuration配置示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config" status="trace" name="test-log4j2"
strict="false" shutdownTimeout="30">
<Properties>
<Property name="test.key">good</Property>
<Property name="jdk.version">1.8</Property>
</Properties>
<Filter type="ThresholdFilter" level="info" onMatch="ACCEPT" onMismatch="Neutral"/>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
Loggers配置语法
Loggers包含了Root和Logger2种子元素, 其中Root是一种特殊的的Logger, 用来定义Root记录器, Root默认会输出至控制台, 日志级别默认是ERROR; Logger可以定义多个。
Loggers子元素Root: 子元素,Root记录器,是默认记录器,所有Logger的父级记录器。Logger: 子元素,记录器。
Root元素:Root记录器不能设置Filter, 它是所有其他记录器的父级记录器。- level: 日志级别。
- AppenderRef: 关联的附加器, 可以关联多个。
Logger元素: 用户自定义记录器。name: 属性, Logger名称。level: 属性, 日志级别。additivity:属性, 可加性配置。AppendRef: 子元素,关联的附加器, 可以关联多个。Filter/Filters:子元素, 过滤器配置。
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="error" name="test-log4j2" shutdownTimeout="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</Console>
<File name="org.good" filename="info.log">
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="console"/>
<AppenderRef ref="org.good"/>
</Root>
<Logger name="org.good" level="info" additivity="false">
<AppenderRef ref="org.good"/>
<AppenderRef ref="console"/>
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</Logger>
</Loggers>
Async Logger
AsyncLogger是异步记录器, 配置和Logger基本一致, 如下:
name: 属性, Logger名称。level: 属性, 日志级别。additivity:属性, 可加性配置。AppendRef: 子元素,关联的附加器, 可以关联多个。Filter/Filters:子元素, 过滤器配置。
示例如下:
<AsyncLogger name="org.good" level="info" additivity="false">
<AppenderRef ref="org.good"/>
<AppenderRef ref="console"/>
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</AsyncLogger>
Appenders配置语法
Appenders附加器主要包含2个子节点, 分别是Console和Appender, Console代表输出到控制台, Appender代表输出至其他地方, Appender的实现有很多种, 配置方式因具体的实现而异。
下面列举几种常用的Appender配置方式:
Console Appender
ConsoleAppender输出到控制台。
name: 属性, Console的名称。target: 属性, 输出目的地, 2种选择:SYSTEM_OUT或者SYSTEM_ERR, 默认SYSTEM_OUT。Filter: 子元素, 过滤器。Layout: 子元素, 布局, 输出格式。pattern: 属性, 输出格式。
示例如下:
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Console>
File Appender
FileAppender是一个写入文件的附加器, 它写入filename属性声明的文件中。
fileName: 属性, 输出的文件名。append: 属性,是否追加记录, 默认true, 如果为false, 每次写入会清空文件。name: 属性, Appender名称。filter: 元素, 过滤器设置。layout: 元素, 布局设置。 其他属性或元素见官方文档。示例如下:
<File name="org.good" filename="info.log" append="false" >
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</File>
RollingFile Appender
RollingFileAppender是一个滚动写入文件的附加器, 它会写入filename属性声明的定义中,并按照TriggeringPolicy和RolloverPolicy滚动文件, 比如线上日志过大影响性能, 需要按时间或文件大小风格文件。
fileName: 属性, 输出的文件名。append: 属性,是否追加记录, 默认true, 如果为false, 每次写入会清空文件。name: 属性, Appender名称。filter: 元素, 过滤器设置。layout: 元素, 布局设置。filePattern: 属性, 归档日志文件的文件命名格式。policy: 元素, 用于确定是否发生滚动的策略。strategy: 元素, 用于确定存档文件的名称和位置的策略。 其他属性或元素见官方文档。示例如下:
<RollingFile name="web" filename="web.log" append="false" filepattern="web.log.$${date:yyyy-MM-dd}.gz">
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20MB" />
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
RandonAccessFile Appender
RandomAccessFileAppender和FileAppender类似,它总是被缓冲, 采用随机文件,性能会有大幅提升。
fileName: 属性, 输出的文件名。append: 属性,是否追加记录, 默认true, 如果为false, 每次写入会清空文件。name: 属性, Appender名称。filter: 元素, 过滤器设置。layout: 元素, 布局设置。 其他属性或元素见官方文档。示例如下:
<RandomAccessFile name="random" filename="random.log" >
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</RandomAccessFile>
Async Appender
AsyncAppender是一个异步记录器,它接收其他Appender的引用, 并使用一个线程单独写入, 它应该晚于引用的Appender配置。
AppenderRef: 元素,引用的Appender。errorRef: 元素, 发生错误时引用的Appender。blocking: 属性, 是否阻塞。shutdownTimeout:属性, 停止时超时等待时间。filter: 元素, 过滤器配置。name: 属性, appender名称。 其他属性或元素见官方文档。示例如下:
<Async name="Async" blocking="false">
<AppenderRef ref="org.good"/>
</Async>
Socket Appender
SocketAppender是通过Socket发送日志到远程服务器的Appender。
name: 属性, Appender名称。host:属性, 远程服务器host。port: 属性, 远程服务器端口。protocol: 属性, 协议: TCP/UDP。ssl: 元素, SSL配置。filter: 元素, 过滤器配置。layout: 元素, 布局配置。connectTimeoutMillis: 属性, 连接超时时间。 其他属性或元素见官方文档。示例如下:
<Socket name="socket" host="127.0.0.1" port="8080" protocol="tcp">
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%r [%t] %-5p %c - %m%n"/>
</Socket>
其他Kafka配置见官方文档。
Filter配置语法
Filter用来过滤事件, 它有2个重要属性:
onMatch: 属性,事件匹配时的action。onMismatch: 属性, 事件不匹配时的action。
如前文所述, action可以是以下3种类型:
Accept: 通过事件。Deny: 拒绝事件Neutral:传递给其他事件,如果没有其他事件, 则处理。
过滤器有很多种:
-
BurstFilter: 提供了一种机制来控制处理 LogEvent 的速率,方法是在达到最大限制后静默丢弃事件。 -
CompositeFilter: CompositeFilter 提供了一种指定多个过滤器的方法。它作为过滤器元素添加到配置中,并包含要评估的其他过滤器。filters 元素不接受任何参数。 -
DynamicThresholdFilter: 允许根据特定属性按日志级别进行过滤。 -
MapFilter:允许过滤 MapMessage 中的数据元素。 -
MarkerFilter: 将配置的 Marker 值与 LogEvent 中包含的 Marker 进行比较。当标记名称与日志事件的标记或其父项之一匹配时,就会发生匹配。 -
NoMarkerFilter: 检查 LogEvent 中是否包含任何标记。当日志事件中没有标记时发生匹配。 -
RegexFilter: 允许将格式化或未格式化的消息与正则表达式进行比较。 -
Script: 执行返回 true 或 false 的脚本。 -
StructuredDataFilter: 是一个 MapFilter,它还允许过滤事件 id、类型和消息。 -
ThresholdFilter: 如果 LogEvent 中的级别与配置的级别相同或更具体,则此过滤器返回 onMatch 结果,否则返回 onMismatch 值 -
TimeFilter: 时间过滤器可用于将过滤器限制在一天中的某个时间段。
ThresholdFilter
其中ThresholdFilter时比较常见的过滤器, 可以根据日志级别进行匹配过滤, 它的配置方式为:
level: 属性, 日志级别onMatch: 属性,事件匹配时的action。onMismatch: 属性, 事件不匹配时的action。
示例如下:
<Filters>
<ThresholdFilter level = "info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
Layout配置语法
Appender使用Layout将日志事件格式化为满足日志消费需求的格式。Log4j1.x和Logback的布局将日志事件转换为字符串, Log4j2.x布局返回一个字节数组。
Layout支持以下几种类型:
- CSV Layout: 生成CSV格式的日志。
- GELF Layout: 生成满足GrayLog格式的日志。
- HTML Layout: 生成HTML页面。
- JSON Layout: 生成JSON格式的日志。
- JSON Template Layout: 高效、可定制、无垃圾的JSON模板布局。
- Pattern Layout: 格式化字符串的布局。
- XML Layout: XML格式的布局。
- YAML Layout: YAML格式的布局。
- SysLog Layout: 支持Syslog规范的布局。
Pattern Layout
Pattern Layout是最常用的布局方式, 类似于C中的Printf, 将日志消息转换为特定的字符串格式。
转换模式由文字文本和转换说明符组成。
- 任何文字文本(包括特殊字符)都可能包含在转换模式中。特殊字符包括\n、\r、\t 等, 使用\在输出中插入一个反斜杠。*
- 转换说明符由格式控制表达式组成, 类似C和Java中的字符串转换。
转换符
转换符以%开头, 后面跟可选的格式修饰符和转换字符。
- 格式修饰符: 控制字段宽度、填充、左右对齐等内容。
- 转换字符: 数据类型,比如类别、日期、线程名称、优先级等等。 比如: **"%-5p [%t]: %m%n"**转换模式的输出为:
DEBUG [main]: Message 1
- 转换字符
-
%c{precision}: 输出记录器名称。 -
%C{precision}: 输出调用者的全限定类名。 -
%d{pattern}: 输出日志记录时间, pattern是时间格式。 -
%[enc|encode]{pattern}{[HTML|XML|JSON|CRLF]}: 以特定语言标记编码和转义特殊字符, 默认HTML。比如用JSON编码: {message: "%enc{%m}{JSON}"}, 特殊字符就会转换为JSON支持的格式, 如\r转换为\\r。 -
%equals{pattern}{test}{substitution}: 用substitution替换pattern中匹配的test。 -
%equalsIgnoreCase{pattern}{test}{substitution}: 用substitution替换pattern中匹配的test。 -
%[ex|exception|throwable]{[none|full|...|n]}: 输出绑定到日志事件的异常堆栈, none、full等关键词用来定义输出的堆栈格式, 比如%ex{0}, 不输出异常堆栈。 -
%highlight{pattern}{style}: 输出日志的颜色。 -
%[m|msg|message]{ansi}: 输出与日志事件关联的应用程序提供的信息。 -
%[K|map|MAP]{key}: 输出MapMessage中的key, 如果key未指定,全部输出。 -
%[I|locaion]: 输出生成日志的位置信息。 -
%[L|line]: 输出代码行号。 -
%[M|method]: 输出日志的方法名称。 -
%[maxLen|maxLength]{pattern}{length}: 输出日志的最大长度, 如果超过会阶段, 如果长度大于20, 结尾会包含一个省略号。 -
%n{separator}: 指定日志的行分隔符。 -
%[N|nano]: 输出日志的创建时间。 -
%[pid|processId]{[defaultValue]}: 输出进程ID, 如果平台不支持,使用默认值。 -
%[p|level]{level=lable,level=lable}: 输出日志的级别, level是日志的级别, lable是应该显示的值。 -
%[p|level]{length=n}, 输出日志的级别, 取日志级别名称的的前n位, 如果n大于日志级别名称的长度, 则取正常日志级别名称。 可以组合以上两种, 如%level{ERROR=error, length=2}, 则ERROR级别的日志输出为error, 其他日志级别则输出前2位。 -
%[p|level]{lowerCase=true}: 输出日志级别名称的大小写。 -
%{r|relative}: 输出JVM启动以来的毫秒数。 -
%{T|tid|threadId}: 输出线程ID。 -
%{t|tn|thread|threadName}: 输出线程名称。 -
%{tp|threadPriority}: 输出线程的优先级。 -
%fqcn: 输出记录器的完全限定类名。 -
%R|repeat{string}{length}: 输出指定字符串的重复n次结果。 -
%replace{pattern}{regex}{substitution}: 用substitution替换模式中匹配的正则regex。 -
%notEmpty{pattern}: 输出不为空的日志。 -
%r[Ex|Exception|Throwable]: 和%throwable差不多, 但是堆栈跟踪从引发的第一个异常出发。 -
%sn: 输出递增的序列号。 -
%style{pattern}{ANSI style}: 设置模式的样式, 和%highlight类似。 -
%[u|uuid]{"RANOM"|"TIME"}: 输出UUID。 -
%[x|NDC]: 输出线程上下文堆栈。 -
%[X|mdc|MDC]{key}: 输出上下文线程堆栈中的key对应的值, 和%K用法类似。 -
%[xEx|xException|xThrowable]: 和%ex差不多, 但是会输出package信息和jar包信息。
-
- 格式修饰符: 格式修饰符放在%和转换字符之间, 用来修饰输出的字段宽度、对齐方式等, 格式为
%{justification flag}{min width}.{justification flag}{max width}{pattern}.justification flag: 对齐方式, 默认右对齐,左对齐使用负号-。min width: 最小宽度,小于最小宽度,进行填充。max width: 最大宽度, 大于最大宽度,进行截断。
%-30c: 左对齐,最小宽度30,无最大宽度。
%30c: 右对齐,最小宽度30,无最大宽度。
%.30c: 最大宽度30, 如果超过则从头开始截断。
%20.30c: 右对齐,最小宽度20, 最大宽度30.
%-20.-30c: 左对齐,最小宽度20, 最大宽度30
Log4j2实践
Maven依赖
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
SLF4J绑定
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
异步日志依赖
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>