Log4j v1 properties配置中logger名称如何定义
配置行分类说明
提供的所有配置行均为非Root自定义logger的配置项,未包含appender绑定、日志格式、日志器继承开关(additivity)等其他类型的配置。
每一行的结构统一为log4j.logger.<logger名称段>=<日志级别>:
- 等号左侧,固定前缀
log4j.logger.之后的字符串部分,作用是定义logger的唯一名称 - 等号右侧的日志级别(ERROR/DEBUG/INFO/WARN等)是该logger的级别属性配置,不属于名称定义范畴
各配置项对应的logger名称列表
所有配置行提取出的logger名称及对应配置级别如下:
- org.apache.axis.utils:ERROR
- strike:DEBUG
- strike.textfiles:DEBUG
- org.krake.strike.trace:INFO
- org.medusa.orm.armadillo.Loader:DEBUG
- org.medusa.orm.armadillo.functions.ProcessBulkErrors:WARN
- org.medusa.orm.engine.Armadillo:INFO
- org.medusa.orm.armadillo.lib:INFO
- org.medusa.orm.armadillo.ORM2ExecutionContext:DEBUG
- org.medusa.orm.armadillo.lib.GetFieldValue:DEBUG
- org.medusa.orm.toolkit.ORMt2ORMx:DEBUG
- org.krake.box.abstraction.slidr.service.job.manager.Cpu:DEBUG
- org.krake.box.abstraction.slidr.service.job.manager.Block:DEBUG
- org.krake.box.abstraction.slidr.service.job.manager.SimpleCloudWorkerManager:INFO
- org.krake.box.abstraction.impl.scheduler.common.AbstractExecutor:DEBUG
- org.krake.box.abstraction.impl.scheduler.pbs.PBSExecutor:DEBUG
- org.krake.box.armadillo.workflow.events.WorkerSweeper:WARN
- org.krake.box.armadillo.workflow.nodes.FlowNode:WARN
- org.krake.box.armadillo.scheduler.WeightedHostScoreScheduler:INFO
- org.krake.box.abstraction.impl.common.task.TaskImpl:INFO
- org.krake.box.abstraction.slidr.rlog:INFO
- com.senatus.impl.execution.ec2:DEBUG
- com.endeca:INFO
- com.endeca.itl.web.metrics:INFO
Log4j v1 properties格式的logger名称解析规则
所谓“隐式定义”是误解,Log4j v1对properties配置中logger名称的解析是硬编码的固定逻辑,没有模糊推断规则,具体算法如下:
- 配置加载时逐行读取键值对,先匹配键的前缀:
- 若键完全等于
log4j.rootLogger,判定为根日志器配置,无自定义名称 - 若键以
log4j.logger.为固定前缀,判定为非Root自定义logger配置
- 若键完全等于
- 提取自定义logger名称时,直接将键中
log4j.logger.前缀之后的所有完整字符串原样截取,不做任何截断、转义、层级拆分,截取结果就是该logger的唯一匹配名称。 - 配置中大量和Java包名、全限定类名一致的logger名称,不是Log4j做了自动类扫描绑定,是业务代码调用日志API时,通常会传入当前类的Class对象作为参数,日志框架内部会自动取该类的全限定名作为logger名称,和配置里截取到的名称做精确字符串匹配——名称中的
.只是普通字符,没有语法含义,哪怕logger名称不带.(比如示例里的strike),只要代码中获取logger时传入的名称和配置截取结果完全一致,就能正常生效。 - 非Root类型的logger确实必须配置名称,Log4j v1不会自动生成未显式声明名称的自定义logger,名称匹配是纯字符串精确匹配逻辑,不存在未公开的特殊隐式规则。早期官方文档只给出了配置示例,没有单独拆解这段解析逻辑,才会造成“规则隐式”的误解。
内容的提问来源于stack exchange,提问作者Borea Deitz
相关产品推荐
相关产品推荐

