log4j2配置基础介绍

8 篇文章 0 订阅

一、配置概述

将日志请求插入应用程序代码需要大量的规划和努力。观察表明,大约4%的代码用于日志记录。因此,即使是中等规模的应用程序,其代码中也会嵌入数千条日志语句。鉴于其数量众多,必须能够在无需手动修改的情况下管理这些日志语句。

Log4j 2可以通过以下四种方式之一进行配置:

  1. 使用XML、JSON、YAML或属性文件格式的配置文件。
  2. 通过编程方式创建ConfigurationFactoryConfiguration实现。
  3. 通过调用Configuration接口中暴露的API将组件添加到默认配置中。
  4. 通过调用内部Logger类的方法。

所有可用格式在功能上是等效的。例如,可以使用属性格式重写XML格式的配置文件,反之亦然,而不会损失任何功能。然而,由于XML、JSON和YAML文件自然支持嵌套,因此它们通常更易于捕获Log4j配置的层次结构。

请注意,与Log4j 1.x不同,Log4j 2的公共API不暴露添加、修改或删除AppenderFilter或以任何方式操纵配置的方法。

二、配置架构

  1. 节点树结构

    • Log4j的配置以树结构呈现。每个配置元素都会生成一个节点,节点包含属性、子节点和插件类型。每个节点必须有对应的插件来执行实际工作。
    • Log4j支持的每种文档类型都有一个ConfigurationFactory,它是一个Log4j插件,声明了它支持的文件扩展名和优先级。属性文件的优先级最高,其次是YAML、JSON和XML。
    • 各种配置实现(如XMLConfiguration、YamlConfiguration、JsonConfiguration等)的主要任务是将配置文本转换为节点树,通常使用适合该文档类型的工具进行解析。Java属性语法不是树结构,因此Log4j使用的Java属性语法要求所有属性遵循一种命名模式,以便明确树结构,这使得Java属性格式比其他文档类型更冗长。
    • 创建节点树后,控制权交给AbstractConfiguration,它使用Log4j的插件系统将节点转换为相应的Java对象,并提供所有通用功能。
  2. 仲裁器(Arbiters)

    • 在某些情况下,希望有一个可以在任何部署环境中使用的单一日志配置。例如,在生产环境和开发环境中可能需要不同的默认日志级别,或者在本地运行和部署到容器中使用不同的Appender。一种解决方法是使用像Spring Cloud Config Server这样的工具,或者在配置中包含仲裁器。
    • 仲裁器是一个Log4j插件,用于确定其他配置元素是否应包含在生成的配置中。仲裁器在节点树构建后但在转换为配置之前执行,它本身也是一个节点,在处理节点树之前会被移除。仲裁器提供一个返回布尔值的方法,决定其子节点是否应保留在配置中
    • 仲裁器可以在配置中的任何允许元素的地方出现,可以封装简单的属性声明或一整套AppendersLoggers。仲裁器可以嵌套,但只有当祖先仲裁器返回true时,后代仲裁器才会被评估。
    • Log4j内置了一些仲裁器,如SystemPropertyArbiter(根据系统属性判断)、ClassArbiter(根据指定类是否存在判断)、ScriptArbiter(根据配置的脚本结果判断)和SpringProfile(针对Spring Boot用户,根据Spring的环境配置判断)。

三、自动配置

  1. 初始化时自动配置

    • Log4j在初始化时能够自动配置自己。它会查找所有的ConfigurationFactory插件,并按照优先级从高到低排列。Log4j提供了四种ConfigurationFactory实现:分别用于JSON、YAML、属性文件和XML。
    • Log4j会检查系统属性log4j2.configurationFile,如果设置了该属性,它将尝试使用与文件扩展名匹配的ConfigurationFactory加载配置。配置文件可以位于本地文件系统或包含URL。
    • 如果没有设置系统属性,属性文件的ConfigurationFactory会在类路径中查找log4j2-test.properties。如果找不到,YAML的ConfigurationFactory会查找log4j2-test.yamllog4j2-test.yml,以此类推。如果都找不到配置文件,将使用DefaultConfiguration,这会将日志输出到控制台。
  2. 从URI配置

    • log4j2.configurationFile引用一个URL时,Log4j首先确定URL是否使用文件协议引用文件。如果是,它将验证文件URL是否有效,并继续按前面描述的方式处理。如果URL包含其他协议,Log4j将检查系统属性log4j2.Configuration.allowedProtocols的值。如果提供的列表包含指定的协议,Log4j将使用URI定位配置文件。如果不满足条件,将抛出异常并记录错误消息。如果未提供系统属性值,默认值为“https, file, jar”。可以通过将系统属性值设置为“_none”来阻止使用除“file”以外的任何协议。
    • Log4j支持访问需要身份验证的远程URL,可以使用基本认证,通过系统属性log4j2.Configuration.usernamelog4j2.Configuration.password指定用户名和密码,如果密码加密,可以通过系统属性log4j2.Configuration.passwordDecryptor指定自定义密码解密器,还可以通过系统属性log4j2.Configuration.authenticationProvider指定自定义的AuthenticationProvider

四、可加性(Additivity)

可以通过配置日志级别和添加新的Logger定义来控制日志输出。默认情况下,Logger具有可加性,即子Logger的事件会传递给父Logger。可以通过设置additivity属性为false来禁用可加性。

五、自动重新配置

当从文件配置时,Log4j可以自动检测配置文件的变化并重新配置自己。可以通过设置配置元素的monitorInterval属性来指定检查配置文件变化的时间间隔,最小间隔为5秒。

六、Chainsaw与广告器配置

Log4j可以通过广告器配置将Appender的配置细节暴露给外部系统,如Chainsaw。Log4j提供了一个“multicastdns”广告器,它使用JmDNS库通过IP多播广告Appender配置细节。Chainsaw可以自动发现这些广告,并在其Zeroconf选项卡中显示。要广告一个Appender配置,需要将JmDNS库添加到应用程序类路径中,设置配置元素的advertiser属性为“multicastdns”,设置Appender元素的advertise属性为true,如果是基于FileAppender的配置,还需要设置advertiseURI属性。

七、配置语法

  1. XML配置

    • Log4j可以使用两种XML格式进行配置,即简洁格式和严格格式。
    • 简洁格式的元素名称与它们代表的组件匹配,易于配置,但不能用XML模式验证。例如,ConsoleAppender可以通过在其父元素Appenders下声明一个名为Console的XML元素来配置。属性可以作为XML属性或没有属性且有文本值的XML元素指定。
    • 严格格式可以用XML模式验证,通过将友好的元素名称替换为其对象类型来配置。例如,ConsoleAppender配置为一个带有type属性为“Console”的Appender元素。
  2. JSON配置

    • JSON格式与简洁XML格式类似,每个键代表一个插件,键值对表示插件的属性。Route元素可以声明为数组,但对于AppenderFilter等元素,如果要定义为数组元素,每个元素必须声明一个名为“type”的属性,包含Appender的类型。
  3. YAML配置

    • 结构与XML和JSON配置格式类似。
  4. 属性文件配置

    • 从Log4j 2.4版本开始支持,语法与Log4j 1.x不同,以插件和插件属性的方式定义配置。
    • 在2.6版本之前,需要列出AppenderFilterLogger的标识符,从2.6版本开始,名称可以在首次使用时推断,但如果要使用更复杂的标识符,仍需要使用列表。
    • 可以使用rootLoggerlogger.key属性指定日志级别和Appender引用。

XML文件中的配置元素接受多个属性,包括advertiser(广告器插件名称)、dest(输出目标)、monitorInterval(检查配置文件变化的时间间隔)、name(配置名称)、packages(已弃用,将在Log4j 3.0中删除)、schema(用于验证配置的XML模式位置)、shutdownHook(指定JVM关闭时Log4j是否自动关闭)、shutdownTimeout(指定Appender和后台任务在JVM关闭时的关闭时间)、status(内部Log4j事件的日志级别)、strict(启用严格XML格式)和verbose(加载插件时启用诊断信息)。

八、配置日志记录器(Loggers)、AppenderFilter

  1. 配置日志记录器

    • 使用<logger>元素配置LoggerConfig,必须指定name属性,通常指定level属性,还可以指定additivity属性。可以配置includeLocation属性来控制是否捕获位置信息。LoggerConfig可以配置属性,这些属性可以在AppenderFilterLayout等中引用。LoggerConfig还可以配置一个或多个AppenderRef元素。
    • 每个配置必须有一个根日志记录器,它没有name属性,也不支持additivity属性,默认级别为ERROR,并附加一个ConsoleAppender
  2. 配置Appender

    • 可以使用特定的Appender插件名称或带有type属性包含插件名称的appender元素来配置Appender。每个Appender必须有唯一的name属性,大多数Appender还支持配置布局。
  3. 配置Filter

    • Log4j允许在四个地方配置Filter:与AppenderLogger和属性元素同一级别;在Logger元素中;在Appender元素中;在Appender引用元素中。可以使用<filters>元素配置多个Filter,它代表CompositeFilter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心六神通

你的鼓励是我持续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值