log4j2最佳实践2

 多项政策

滚动文件追加器仅允许一个嵌套的触发策略元素。如果您希望使用多个策略,则需要将它们包装在Policies元素中。元素本身没有配置属性。

 

同时使用两种基于时间的触发策略( CronTriggeringPolicyTimeBasedTriggeringPolicy )的效果未定义。

例如,以下 XML 片段定义了滚动日志的策略:

  •   当 JVM 启动时。

  • 当日志大小达到 10 MB 时。

  •   当地时间午夜。

示例log4j2.xml的片段
<RollingFile name="FILE"
             fileName="app.log"
             filePattern="app.%d{yyyy-MM-dd}.%i.log">
  <JsonTemplateLayout/>
  <Policies>
    <OnStartupTriggeringPolicy/>
    <SizeBasedTriggeringPolicy/>
    <TimeBasedTriggeringPolicy/>
  </Policies>
</RollingFile>

展期策略RolloverStrategy

翻转策略决定如何轮换或删除旧的存档文件以便为新的存档文件腾出位置。翻转期间执行的操作包括:

  • 以循环方式重命名文件。有关更多详细信息,请参阅递增文件索引

  • 归档日志文件的压缩。有关更多详细信息,请参阅压缩存档文件

  • 删除旧的存档日志文件。有关更多详细信息,请参阅Delete操作

  • 更改归档日志文件的 POSIX 权限。有关更多详细信息,请参阅PosixViewAttribute操作

有两种不同的现成可用的翻转策略:

DefaultRolloverStrategy

这是使用的默认策略,如果 fileName名配置属性 已指定。 它将当前日志文件存储在fileName指定的位置,将归档日志文件存储在 fileName 指定的位置 filePattern 。

DirectWriteRolloverStrategy

这是使用的默认策略,如果 fileName名配置属性 为null 。它将当前日志文件直接存储在filePattern指定的滚动位置中。

 

不鼓励在fileName配置属性中使用运行时查找,因为它会破坏DefaultRolloverStrategy的逻辑。使用DirectWriteRolloverStrategy代替,并在配置中省略fileName属性。

增加文件索引

在翻转事件期间,当前日志文件将移动到通过评估确定的位置 filePattern ,使用min作为%i转换模式的值。如果旧日志文件已存在于该位置,则滚动文件附加程序:

  1. 尝试使用fileIndex配置属性指定的策略来增加%i的值。

  2. 如果失败,它将删除最旧的日志文件并轮换剩余的日志文件以为新的日志存档腾出位置。

有以下三种策略可供选择:

min

使用min策略,最新的日志文件将具有索引min ,最旧的日志文件将具有索引max 。

 

这是传统 UNIX 工具和 Log4j 1 使用的日志轮转策略。它不是Log4j 2 的默认策略。

假设min="1"max="3"日志文件的轮换如下图所示:

Diagram
max

使用max策略,最旧的日志文件将具有索引min ,最新的日志文件将具有索引max 。

 

这是 Log4j 2 以来的默认策略。

假设min="1"max="3"日志文件的轮换如下图所示:

Diagram
nomax

使用nomax策略,不会删除任何文件,并且将从min开始为较新的存档文件分配递增的索引号。

Diagram

 

压缩存档文件

当当前日志文件被归档时,滚动文件追加器可以对其进行压缩。根据存档文件名的扩展名激活压缩。可以识别以下扩展名:

  扩大 支持compressionLevel   描述

.zip

ZIP 存档使用 放气 算法

.gz

使用 DEFLATE 算法的GZIP存档

.bz2依赖

BZip2算法

.deflate部门

放气算法

.pack200 dep

Pack200算法

.xz相关

  XZ算法

.zst dep

Z标准算法

 dep

使用这些压缩算法需要额外的依赖项:

runtimeOnly 'org.apache.commons:commons-compress:1.27.1'

.xz.zst扩展名需要额外的依赖项。 看 共享压缩文档 了解更多详情。

可选操作

文件的轮换和压缩始终由滚动文件附加程序自动处理。从 Log4j 2.6 开始,可以手动配置其他操作。

Log4j Core 提供了两种开箱即用的操作:

常用动作配置

这两个操作都支持以下配置属性:

表 13. 常见操作配置属性
  属性   类型   默认值   描述

basePath

Path

 

它设置操作的基目录。该操作将仅限于该目录中的文件,并且所有路径都将相对于该目录。

  必需的

followLinks

boolean

false

如果设置为true ,操作将遵循符号链接。

 

将此值设置为true将允许操作访问basePath外部的文件,这可能会带来安全风险。

maxDepth

int

1

可访问的最大目录级别数。默认情况下,该操作不会递归到basePath的子目录中。

 

 

  类型   多重性   描述

PathCondition

  零个或多个

一组路径条件。该操作仅对条件返回true文件执行。

Delete操作

Delete操作将删除符合配置条件的旧日志文件。

 

此操作的有限版本会自动执行以增加文件索引

如果您使用%d模式,则仅需要显式Delete操作。

除了常见的配置选项之外, Delete操作还支持以下选项:

表 15. Delete操作配置属性
  属性   类型   默认值   描述

testMode

boolean

false

如果为true ,则不会删除任何文件,但将发出INFO级别的状态记录器消息。

表 16. Delete操作嵌套元素
  类型   多重性   描述

PathCondition

  零个或多个

如果存在,则仅对条件返回true文件执行该操作。

必需的,除非提供了ScriptCondition ,在这种情况下这些元素将被忽略。

PathSorter

  零或一

basePath中包含的文件提供排序顺序。

默认实现是 PathSortByModificationTime ,按修改时间戳升序对文件进行排序。

ScriptCondition

  零或一

如果存在,则忽略所有嵌套的PathCondition并执行提供的脚本以选择要删除的文件。

路径条件

为了选择文件进行其他操作,Log4j 提供了以下路径条件:

IfAccumulatedFileSize

当对文件列表进行评估时,此条件将每个文件的大小与前面文件的大小相加。对于超过可配置阈值的文件,它返回true 。

 

此条件的结果取决于文件的排序顺序。有关详细信息,请参阅PathSorter 。

表 19. IfAccumulatedFileSize配置属性
  属性   类型   默认值   描述

exceeds

FileSize

 

条件匹配的阈值大小。

承认与SizeBasedTriggeringPolicysize属性相同的语法。

  必需的

表 20. IfAccumulatedFileSize嵌套元素
  类型   多重性   描述

PathCondition

  零个或多个

一组可选的嵌套条件。仅当所有嵌套条件也匹配时,此条件才匹配。

IfAccumulatedFileCount

当对文件列表进行评估时,如果文件从 1 开始的索引超过可配置的阈值,则此条件返回true 。

 

此条件的结果取决于文件的排序顺序。有关详细信息,请参阅PathSorter 。

表 21. IfAccumulatedFileCount配置属性
  属性   类型   默认值   描述

exceeds

int

 

条件匹配的阈值。

  必需的

表 22. IfAccumulatedFileCount嵌套元素
  类型   多重性   描述

PathCondition

  零个或多个

一组可选的嵌套条件。仅当所有嵌套条件也匹配时,此条件才匹配。

IfFileName

根据文件对于基目录的路径来匹配文件。

表 23. IfFileName配置属性
  属性   类型   默认值   描述

glob

  细绳

 

使用glob模式匹配相对于基目录的路径。

看 FileSystem.getPathMatcher() 了解支持的glob语法。

必需的,除非指定了regex表达式。

regex

Pattern

 

使用正则表达式匹配相对于目录的路径。

看 Pattern 了解支持的正则表达式语法。

必需的,除非指定了glob 。

IfLastModified

根据文件的上次修改时间戳接受文件。

表 25. IfLastModified配置属性
  属性   类型   默认值   描述

age

Duration

 

该条件接受与指定持续时间一样旧或早于指定持续时间的文件。

  必需的

表 26. IfLastModified嵌套元素
  类型   多重性   描述

PathCondition

  零个或多个

一组可选的嵌套条件。仅当所有嵌套条件也匹配时,此条件才匹配。

IfNot

否定嵌套条件的结果。

表 27. IfNot嵌套元素
  类型   多重性   描述

PathCondition

  

要否定的路径条件。

IfAll

如果所有嵌套条件都为真,则接受文件。

表 28. IfAll嵌套元素
  类型   多重性   描述

PathCondition

  一个或多个

要检查的嵌套条件。

IfAny

表 29. IfAny嵌套元素
  类型   多重性   描述

PathCondition

  一个或多个

要检查的嵌套条件。

ScriptCondition

ScriptCondition使用 JSR 223 脚本来确定匹配文件的列表。

它的配置由单个嵌套脚本元素组成:

表 30. ScriptCondition嵌套元素
  类型   多重性   描述

Script , ScriptFile 或者 ScriptRef

  

对要执行的脚本的引用。

有关脚本编写的更多详细信息,请参阅脚本

该脚本必须返回一个列表 PathWithAttributes 对象并支持以下绑定:

表 31. 脚本绑定
  绑定名称   类型   描述

basePath

Path

基本目录的路径。

configuration

Configuration

Configuration对象。

pathList

List<PathWithAttributes>

基本目录中包含的文件列表。

路径是通过以下方式获得的 解决 相对文件名 basePath 。

substitutor

StrSubstitutor

StrSubstitutor用于替换查找变量。

statusLogger

Logger

脚本中的诊断消息使用的状态记录器

<key>

String

如果<key>不是上述之一,它将绑定到给定的值 全局Properties配置元素。

有关ScriptCondition用法的示例,请参阅下面的使用ScriptCondition示例。

  配置配方

logrotate等效配置

Logrotate是一种常见的 UNIX 实用程序,用于轮换日志文件。

由于无法通知 Java 应用程序需要重新加载日志文件,因此可以通过其copytruncate选项将logrotate与 Java 应用程序一起使用(请参阅 logrotate(8)手册页)。因此,示例logrotate配置文件可能如下所示:

/var/log/app.log {
  copytruncate
  compress
  rotate 15
  daily
  maxsize 100k
}

这个配置有一个问题, copytruncate选项的文档中有解释:

请注意,复制文件和截断文件之间的时间片非常短,因此可能会丢失一些日志记录数据。

幸运的是,您可以使用滚动文件附加程序来替换logrotate的使用。等效的配置如下所示:

RollingFile:
  name: "FILE"
  fileName: "/var/log/app.log"
  filePattern: "/var/log/app.log.%i.gz" 
  JsonTemplateLayout: {}
  DefaultRolloverStrategy:
    max: 15 
  Policies:
    CronTriggeringPolicy:
      schedule: "0 0 0 * * ?" 
    SizeBasedTriggeringPolicy:
      size: "100k" 
  相当于compress :压缩存档文件。
  相当于rotate 15 :只保留最新的15日志文件。
  相当于daily :日志将在每天的午夜轮换。
  相当于maxsize 100k :如果日志大小超过 100 kB,则日志将被轮换。

带时间戳的日志文件名

以下配置每天创建一个日志文件并删除超过 15 天的日志文件。

RollingFile:
  name: "FILE"
  filePattern: "/var/log/app.%d{yyyy-MM-dd}.log.gz"
  JsonTemplateLayout: {}
  DirectWriteRolloverStrategy:
    Delete:
      basePath: "/var/log"
      IfFileName:
        regex: "app\.\d{4}-\d{2}-\d{2}\.log\.gz"
      IfLastModified:
        age: "P15D"
  TimeBasedTriggeringPolicy: {}

每月单独的文件夹

我们还可以为临时相关的文件创建单独的文件夹。在下面的示例中,我们为每个月创建一个不同的文件夹:

RollingFile:
  name: "FILE"
  filePattern: "/var/log/app/%d{yyyy-MM}/%d{yyyy-MM-dd}.log.gz"
  JsonTemplateLayout: {}
  DirectWriteRolloverStrategy:
    Delete:
      basePath: "/var/log/app"
      maxDepth: 2
      IfLastModified:
        age: "P90D"
  TimeBasedTriggeringPolicy: {}

 我们使用两个%d模式来指定文件夹和文件名。 我们增加了Delete操作的递归深度以扩展到基本目录的子文件夹。

 

字符编码

所有预定义的布局都会生成String ,最终使用配置的Charset集将其转换为byte 。在执行此操作时,除非指定显式编码配置,否则它们默认使用UTF-8 。如果您希望所有日志事件都采用与所采用的布局默认值不同的特定字符编码格式,请确保根据需要配置布局的字符编码。

位置信息

一些布局提供了包含位置信息的指令:调用者类、方法、文件和行。 Log4j 拍摄堆栈快照,并遍历堆栈跟踪以查找位置信息。 这是一项昂贵的操作,在性能敏感的设置中应该避免。

图案布局

PatternLayout是一个可定制的、高效的无垃圾的、人类可读的字符串布局,使用用户提供的模式生成布局。它类似于String#format()具有注入LogEvent某些属性的专门指令。

 

模式布局不适用于结构日志记录目的。对于生产环境,强烈建议您使用JSON 模板布局来生成 JSON 输出,以便将其传送到日志摄取系统(例如 Elasticsearch 或 Google Cloud Logging)。

 property-substitution

 

财产替代

支持属性替换(例如${myProperty} ),包括查找(例如${java:version} 、 ${env:USER} 、 ${date:MM-dd-yyyy} ),但需要额外小心采取。 我们强烈建议您在使用前仔细阅读配置手册

 

查找旨在作为一种非常通用、方便的实用程序来执行字符串插值,特别是对于缺乏此机制的配置文件和组件(例如布局)。 模式布局有丰富的转换器集合,只要有可能,您应该总是更喜欢它而不是查找。

 

 

线程名称

输出生成日志事件的线程的名称

t
tn
thread
threadName

  线程优先级

输出生成日志事件的线程的优先级

tp
threadPriority

  通用唯一识别码

包括随机或基于时间的 UUID

UuidPatternConverter说明符语法
u{RANDOM|TIME}
uuid{RANDOM|TIME}

基于时间的 UUID 是使用每个主机的 MAC 地址生成的类型 1 UUID 为了确保同一主机上多个 JVM 和/或类加载器的唯一性,0 到 16,384 之间的随机数将与 UUID 生成器类的每个实例相关联,并包含在生成的每个基于时间的 UUID 中。
另请参见log4j2.uuidSequence 。由于基于时间的 UUID 包含 MAC 地址和时间戳,因此应谨慎使用。

C{precision}
class{precision}
  图案   输出示例

%d{DEFAULT}

2012-11-02 14:34:02,123

%d{DEFAULT_MICROS}

2012-11-02 14:34:02,123456

%d{DEFAULT_NANOS}

2012-11-02 14:34:02,123456789

%d{ISO8601}

2012-11-02T14:34:02,781

%d{ISO8601_BASIC}

20121102T143402,781

%d{ISO8601_OFFSET_DATE_TIME_HH}

2012-11-02’T'14:34:02,781-07

%d{ISO8601_OFFSET_DATE_TIME_HHMM}

2012-11-02’T'14:34:02,781-0700

%d{ISO8601_OFFSET_DATE_TIME_HHCMM}

2012-11-02’T'14:34:02,781-07:00

%d{ABSOLUTE}

14:34:02,781

%d{ABSOLUTE_MICROS}

14:34:02,123456

%d{ABSOLUTE_NANOS}

14:34:02,123456789

%d{DATE}

02 Nov 2012 14:34:02,781

%d{COMPACT}

20121102143402781

%d{UNIX}

1351866842

%d{UNIX_MILLIS}

1351866842781

 

您可以在 throwable 转换词后面加上%throwable{option}形式的选项。

%throwable{short}输出Throwable的第一行。

%throwable{short.className}输出发生异常的类的名称。

%throwable{short.methodName}输出发生异常的方法名称。

%throwable{short.fileName}输出发生异常的类的名称。

%throwable{short.lineNumber}输出发生异常的行号。

%throwable{short.message}输出消息。

%throwable{short.localizedMessage} 输出本地化消息。

%throwable{n}输出堆栈跟踪的前n行。

指定%throwable{none}%throwable{0}会抑制异常的输出。

使用{filters(packages)} (其中packages是包名称列表)以抑制堆栈跟踪中的匹配堆栈帧。

使用{suffix(pattern)}在每个堆栈帧的末尾添加模式的输出。

使用{separator(…​)}作为行尾字符串,例如, separator(\|) 。默认值是line.separator系统属性,该属性取决于操作系统。

 

异常转换器不是无垃圾的。

xEx|xException|xThrowable
  { "none"
  | "full"
  | depth
  | "short"
  | "short.className"
  | "short.fileName"
  | "short.lineNumber"
  | "short.methodName"
  | "short.message"
  | "short.localizedMessage"
  }
  {filters(package,package,...)}
  {suffix(pattern)}
  {separator(separator)}

%throwable conversion不同,在异常的每个堆栈元素的末尾,有一个字符串,其中包含包含类或类所在目录的 JAR 文件的名称以及在该 JAR 清单中找到的Implementation-Version将被添加。如果信息不确定,则类包装数据前面将带有~ (波形符)字符。

等级

输出日志事件的级别

LevelPatternConverter说明符语法
p|level{level=label, level=label, ...}
p|level{length=n}
p|level{lowerCase=true|false}

 

 图案   记录器名称   输出

%c{1}

org.apache.commons.Foo

Foo

%c{2}

org.apache.commons.Foo

commons.Foo

%c{10}

org.apache.commons.Foo

org.apache.commons.Foo

%c{-1}

org.apache.commons.Foo

apache.commons.Foo

%c{-2}

org.apache.commons.Foo

commons.Foo

%c{-10}

org.apache.commons.Foo

org.apache.commons.Foo

%c{1.}

org.apache.commons.Foo

o.a.c.Foo

%c{1.1.~.~}

org.apache.commons.test.Foo

o.a...Foo

%c{.}

org.apache.commons.test.Foo

…​.Foo

%c{1.1.1.*}

org.apache.commons.test.Foo

o.a.c.test.Foo

%c{1.2.*}

org.apache.commons.test.Foo

o.a.c.test.Foo

%c{1.3.*}

org.apache.commons.test.Foo

o.a.commons.test.Foo

%c{1.8.*}

org.apache.commons.test.Foo

org.apache.commons.test.Foo

 

进程号

如果底层平台支持,则输出进程 ID

pid{defaultValue}
processId{defaultValue}

如果平台不支持进程 ID,则可以指定显示可选的defaultValue 。

 根异常

exception转换器相同,但堆栈跟踪从因果链中抛出的第一个异常开始打印,然后是每个后续包装异常。

rEx|rException|rThrowable
  {
    ["none" | "short" | "full" | depth]
    [,filters(package,package,...)]
    [,separator(separator)]
  }
  {ansi(
    Key=Value,Value,...
    Key=Value,Value,...
    ...)
  }
  {suffix(pattern)}

Throwable 转换说明符后面可以跟一个%rEx{short}形式的选项,它只会输出Throwable的第一行,或者%rEx{n} ,其中将打印堆栈跟踪的前n行。

指定%rEx{none}%rEx{0}将禁止打印异常。

使用filters(packages) ,其中packages是包名称列表,以抑制堆栈跟踪中的匹配堆栈帧。

使用separator字符串分隔堆栈跟踪的行,例如, separator(|) 。默认值是line.separator系统属性,它与平台相关。

仅当有Throwable需要打印时,才使用rEx{suffix(pattern)}pattern的输出添加到输出中。

以下是类别转换说明符的各种格式修饰符示例。

  图案   左对齐   分钟。宽度   最大限度。宽度   评论

%20c

false

20

none

如果类别名称长度小于 20 个字符,则左补空格。

%-20c

true

20

none

如果类别名称长度小于 20 个字符,则右补空格。

%.30c

N/A

none

30

如果类别名称超过 30 个字符,则从头开始截断。

%20.30c

false

20

30

如果类别名称少于 20 个字符,则左补空格。但是,如果类别名称超过 30 个字符,则从头开始截断。

%-20.30c

true

20

30

如果类别名称少于 20 个字符,则右补空格。但是,如果类别名称超过 30 个字符,则从头开始截断。

%-20.-30c

true

20

30

如果类别名称少于 20 个字符,则右补空格。但是,如果类别名称长度超过 30 个字符,则从末尾截断。

  风格修饰符

模式布局支持使用各种 ANSI 转义序列来设置文本样式,这些序列可以通过%highlight%style模式转换器使用。

样式表达式的通用语法是一个以空格分隔的列表:

  • 常数从 AnsiEscape

  • #rrggbbBG_#rrggbb形式的表达式,其中r 、 gb是十六进制数字

 

表 2. 颜色表(8 或 16 色端子)
  文字颜色   背景颜色   视觉的

  8色端子

black

bg_black

 

red

bg_red

 

green

bg_green

 

yellow

bg_yellow

 

blue

bg_blue

 

magenta

bg_magenta

 

cyan

bg_cyan

 

white

bg_white

 

  16色端子

bright_black

bg_bright_black

 

bright_red

bg_bright_red

 

bright_green

bg_bright_green

 

bright_yellow

bg_bright_yellow

 

bright_blue

bg_bright_blue

 

bright_magenta

bg_bright_magenta

 

bright_cyan

bg_bright_cyan

 

bright_white

bg_bright_white

 

如果您的终端支持 24 位颜色,您可以指定:

  • 使用#rrggbb语法的文本颜色,例如#dc143c会将文本着色为深红色,

  • 使用bg_#rrggbb语法的背景颜色,例如bg_#87ceeb将使用天蓝色背景。

  Windows 上的 ANSI 样式

许多平台本机支持 ANSI 转义序列,但 Windows 默认情况下不支持。 要启用 ANSI 支持,请添加 詹西 依赖于您的应用程序,并将log4j2.skipJansi系统属性设置为false 。这允许 Log4j 在写入控制台时使用 Jansi 添加 ANSI 转义码。

无垃圾配置

具有以下有限转换模式集的模式布局是无垃圾的。用于控制字段宽度、填充、左对齐和右对齐等内容的格式修饰符不会生成垃圾。

包含正则表达式和位置信息的模式不是无垃圾的。

 <!--  输入信息格式  带行号显示,对日志输出的性能有影响,在控制台上点击可以直接定位到代码  日志输出格式:
       %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
       %c 类的完整名称
       %d {pattern}日期,{HH:mm:ss.SSS} 表示输出到毫秒的时间
       %F 输出所在的类文件名,如Client.java
       %L 为行号,输出行号
       %l 输出语句所在的行数, 包括类名、方法名、文件名、行数
       %logger 输出logger名称,因为Root Logger没有名称,所以没有输出
       %M 为method,输出所在方法名
       %m 或者%msg为信息,日志文本
       %n 换行
       %t 输出当前线程名称 或 %thread线程名称 %T线程ID %t 线程名称

       Color coding is configured using the %clr conversion word.
       The following colors and styles are supported:
       blue
       cyan
       faint
       green
       magenta
       red
       yellow
       %p %level DEBUG INFO WARN ERROR
       %xwEx Whitespace Extended Throwable 在堆栈周围添加一些额外的空白痕迹。 空白扩展可抛出 https://github.com/spring-projects/spring-boot/issues/15887#issuecomment-462130815
       %esb enclosedInSquareBrackets用于帮助格式化可选值,显示在方括号内。 方括号内  EnclosedInSquareBracketsConverter
-->

Log4j2详解——XML配置详解 - 简书

配置文件的加载顺序

Log4j 包含 4 种 ConfigurationFactory 的实现,分别适用于 JSON、YAML、properties 和 XML 配置文件。在 Log4j 启动时可以按照以下顺序自动加载配置文件:

  1. 查找 log4j.configurationFile 系统属性所指定的配置文件名,如果该系统属性值存在,就尝试使用相应文件扩展名的 ConfigurationFactory 来加载指定的配置文件。通过在代码中调用 System.setProperties("log4j.configurationFile","FILE_PATH") 或者将 -Dlog4jconfigurationFile=file://C:/configuration.xml 参数传递给 JVM;
  2. 如果没有找到,则 properties ConfigurationFactory 就在 classpath 中寻找 log4j2-test.properties 配置文件;
  3. 如果没有找到,则 YAML ConfigurationFactory 就在 classpath 中寻找 log4j2-test.yaml 或 log4j2-test.yml 配置文件;
  4. 如果没有找到,则 JSON ConfigurationFactory 就在 classpath 中寻找 log4j2-test.json 或 log4j2-test.jsn 配置文件;
  5. 如果没有找到,则 XML ConfigurationFactory 就在 classpath 中寻找log4j2-test.xml 配置文件;
  6. 如果没有找到测试配置文件,则 properties ConfigurationFactory 就在 classpath 中寻找 log4j2.properties 配置文件;
  7. 如果没有找到,则 YAML ConfigurationFactory 就在 classpath 中寻找 log4j2.yaml 或 log4j2.yml 配置文件;
  8. 如果没有找到,则 JSON ConfigurationFactory 就在 classpath 中寻找 log4j2.json 或 log4j2.jsn 配置文件;
  9. 如果没有找到,则 XML ConfigurationFactory 就在 classpath 中寻找log4j2.xml 配置文件;
  10. 如果上面的配置文件都没有找到,就使用默认的 DefaultConfiguration 配置。

Log4j 提供了一种 multicastdns Advertiser 实现,通过使用 http://jmdns.sourceforge.net 库的 IP 多播来通知 Appenders 的配置信息。Chainsaw 可以自动发现和展示 Log4j 的这种通知。目前,Chainsaw 仅支持 FileAppender 通知。

通知一个 Appender 配置的步骤如下:

  • 将 JmDns 库添加到类路径下;
  • 设置 Configuration 元素的 advertiser 属性值为multicastdns;
  • 设置相应 appender 的 advertise 属性值为 true。

JmDNS 是多播 DNS 的 Java 实现,可以是 用于局域网中的服务注册和发现。 JmDNS 与 Apple 的 Bonjour 完全兼容。

 Log4j2详解——XML配置示例(带详细注释) - 简书

避免自动装箱

我们努力在不需要代码的情况下使日志记录无垃圾 现有应用程序的变化,但有一个领域是这样的 不可能。
记录原始值(即 int、double、boolean、 等等)JVM 自动将这些原始值装箱到它们的对象包装器中 等价物,制造垃圾。

Log4j 提供了Unbox实用程序来防止原语自动装箱 参数。该实用程序包含一个重用的线程本地池 StringBuilder`s. The `Unbox.box(primitive) 方法直接写入 StringBuilder,结果文本将被复制到最终的日志消息文本中,而无需创建临时对象。

import static org.apache.logging.log4j.util.Unbox.box;

LOGGER.debug("Prevent primitive autoboxing {} {}", box(10L), box(2.6d));

该实用程序包含一个重用StringBuilderThreadLocal池。池大小由log4j2.unboxRingbufferSize系统属性配置。 Unbox.box(primitive)方法直接写入StringBuilder ,结果文本将被复制到最终的日志消息文本中,而不创建临时对象。

局限性

并非所有 Log4j API 功能集都是无垃圾的,具体来说:

  • ThreadContext映射(又名 MDC)默认情况下不是无垃圾的,但可以通过设置 log4j2.garbagefreeThreadContextMap 系统属性true 。

  • ThreadContext堆栈(又名 NDC)不是无垃圾的。

  • 记录非常大的消息(即超过log4j2.maxReusableMsgSize个字符,默认为 518),当所有记录器都是异步记录器时,将导致内部StringBuilder RingBuffer将被修剪回其配置的最大大小。

  • 包含${variable}替换的日志消息会创建临时对象。

  • 将 lambda 记录为参数:

    LOGGER.info("lambda value is {}", () -> callExpensiveMethod());

    创建一个可变参数数组。单独记录 lambda 表达式:

    LOGGER.debug(() -> callExpensiveMethod());

      没有垃圾。

  • traceEntry()traceExit()方法创建临时对象。

  • log4j2.usePreciseClock系统属性(默认为false )设置为true时,时间计算不是无垃圾的。

在全局上下文中运行的查找

大量查找支持全局上下文中的评估。 这些查找可以安全地用于急切评估的属性 配置文件 使用${prefix:key}语法:

表 1. 在全局上下文中运行的查找
  前缀   依赖性   数据来源

bundle

 

爪哇 资源包

ctx

 

  线程上下文

date

 

  当前时间戳

docker

log4j-docker

  Docker容器

env

 

  环境变量

java

 

  JVM特点

jndi

 

JNDI

log4j

 

Log4j 配置文件的位置

lower

 

它将提供的密钥转换为小写

main

 

JVM 应用程序参数

marker

 

如果存在名为key标记,则返回key

spring

log4j-spring-boot

Spring Boot 2.x 环境。

sys

 

  Java系统属性

upper

 

它将提供的密钥转换为大写

web

log4j-jakarta-web

雅加达 ServletContext 。

Spring Boot 2 查找

  语境   全球的

  句法

spring:<key>

其中<key>Spring Boot 2 Lookup 支持的键之一。

  依赖性

Log4j Spring 启动支持

如果您使用 Spring Boot 3,则应使用第三方Spring Boot 3 Lookup 。

Spring Boot 2 Lookup 允许用户查询 Spring Boot 外部化的配置文件。它支持以下键:

表 8. Spring Boot 2 Lookup 支持的键
  钥匙   描述

profiles.active

以逗号分隔的活动配置文件列表。

profiles.active[<n>]

具有从 0 开始的索引<n>的活动配置文件。

profiles.default

以逗号分隔的默认配置文件列表。

profiles.default[<n>]

具有从 0 开始的索引<n>的默认配置文件。

<key>

Spring 中与<key>关联的值 Environment 。

结构化数据查找

  语境   记录事件

  句法

sd:<key>

其中<key>结构化数据查找虚拟键之一或任何String

结构化数据查找与映射查找非常相似,它检索分配给给定键的值 StructuredDataMessage 。此外,还支持以下虚拟键:

表 9. 结构化数据查找虚拟键
  钥匙   RFC5424字段   描述

id

SD-ID

这 id字段 StructuredDataMessage的。

type

MSGID

这 type字段 StructuredDataMessage的。

系统属性查找

  语境   全球的

  句法

sys:<prop>

其中<prop>是任意String

系统属性查找检索 Java系统属性 与密钥相关联。

启用JMX

默认情况下禁用 JMX 支持。

  在 2.24.0 之前的 Log4j 2 版本中默认启用 JMX 支持。

要启用 JMX 支持,请设置 log4j2.disableJmx 启动Java VM时的系统属性:

log4j2.disableJmx=false

 

RMI 对垃圾收集的影响

请注意,RMI 默认情况下每小时触发一次完整 GC。请参阅 sun.rmi.dgc.server.gcInterval和的Oracle 文档 sun.rmi.dgc.client.gcInterval属性。这两个属性的默认值为 3600000 毫秒(一小时)。在 Java 6 之前,是一分钟。

两个sun.rmi参数反映了您的 JVM 是在服务器模式还是客户端模式下运行。如果要修改 GC 间隔时间,最好指定这两个属性,以确保 JVM 获取该参数。

另一种方法可能是禁用对System.gc()显式调用 与-XX:+DisableExplicitGC一起使用,或者(如果您使用的是 CMS 或 G1 收集器)添加 -XX:+ExplicitGCInvokesConcurrent 确保完整的 GC 与您的应用程序同时并行完成,而不是强制进行 stop-the-world 收集。

 

posted @   CharyGao  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示