#************************************************************ # 書陋堂 # # # # LOG4J 2 PROPERTIES CONFIGURATION SAMPLE # # # # Since version 2.4 # # # #************************************************************ ############################################## # Configuration # ############################################## name = nameOfThisConfig # log4j2 内部日志打印级别 status = [trace|debug|info|warn|error|fatal] # 加载插件是否显示诊断信息,默认 false verbose = [false|true] # 内部日志输出位置,可以是 stderr、文件、URL dest = [err|filePath|URL] # 配置文件是否变更检查,单位:秒 monitorInterval = 60 # JVM 关闭时是否 log4j2 也自动关闭,默认 enable shutdownHook = [enable|disable] # JVM 关闭时 appenders、后台任务多久后也关闭,单位:毫秒。 # 默认 0,表示 appenders 按其自身的超时时间,其忽略后台任务是否完成 # 设置时间太短有丢失记录,如果 shutdownHook 关闭时,最好不要用此参数 shutdownTimeout = 1000 # 插件搜索所在的包名,可含多个包,以逗号隔开 packages = org.foo,org.bar # Advertiser 插件名,用来发布 FileAppender 或 SocketAppender 的配置信息 # 目前仅有的支持此功能的插件名为 multicastdns advertiser = multicastdns ############################################## # Properties # ############################################## # 自定义属性变量,下面定义了两个变量:pro1、pro2 property.pro1 = value_1 property.pro2 = value_2 ############################################## # Scripts # ############################################## # 类型一:直接在配置文件中写入脚本 script.s1.type = script script.s1.name = s1 script.s1.language = javascript script.s1.text = textOfScript # 类型二:配置文件仅指名脚本文件路径 script.s2.type = scriptFile script.s2.name = s2 script.s2.path = scriptFilePath ############################################## # CustomLevels # ############################################## # 下面定义两个自定义级别:level1、level2,权重分别为:101、102 customLevel.level1 = 101 customLevel.level2 = 102 ############################################## # Filters # ############################################## # 2.6 版本之前的写法 # -------------------------------------------- # 定义两过滤器变量 f1、f2 filters = f1,f2 # f1 的过滤器插件类型,值来源于具体过滤器类的注解 `@Plugin` 的 name 属性值 # 必填 filter.f1.type = nameOfFilterPlugin # 可以不设置,默认 neutral filter.f1.onMatch = [accept|neutral|deny] # 可以不设置,默认 deny filter.f1.onMismatch = [accept|neutral|deny] # 可能还有其他属性,取决于具体过滤器类型 filter.f1.xxx = xxx filter.f2.type = nameOfFilterPlugin filter.f2.onMatch = [accept|neutral|deny] filter.f2.onMismatch = [accept|neutral|deny] # DENY - 丢弃当前日志事件,且不传给其它过滤器 # NEUTRAL - 中立,当前日志事件直接传给其他过滤器 # ACCEPT - 接受当前日志事件,且不传给其他过滤器 # 2.6 版本及之后的写法,自推断出不同过滤器,无须定义变量列表 # ---------------------------------------------- filter.f1.type = nameOfFilterPlugin filter.f1.onMatch = [accept|neutral|deny] filter.f1.onMismatch = [accept|neutral|deny] filter.f1.xxx = xxx filter.f2.type = nameOfFilterPlugin filter.f2.onMatch = [accept|neutral|deny] filter.f2.onMismatch = [accept|neutral|deny] ############################################## # Appenders # ############################################## # 2.6 版本前也需要定义变量列表,由于与过滤器类似,这里直接写 2.6版本之后的写法 # appender 类型,值来源于具体过滤器类的注解 `@Plugin` 的 name 属性值 # 必填 appender.ap1.type = Console # 此 name 用来给下面的 Loggers 引用 # 必填 appender.ap1.name = nameOfAppender1 # appender 其他属性取决于具体的 appender 类型 # 本例中 Console 类型的它就含有一个 target 的属性 appender.ap1.target = [SYSTEM_OUT|SYSTEM_ERR] # appender 自身的过滤器(选配),具体配置同上面独立的过滤器类似 appender.ap1.filter.type = [accept|neutral|deny] appender.ap1.filter.onMatch = [accept|neutral|deny] appender.ap1.filter.onMisMatch = [accept|neutral|deny] # appender 自身的layout(选配),其 type 属性必填 # 值来源于具体过滤器类的注解 `@Plugin` 的 name 属性值 appender.ap1.layout.type = PatternLayout # layout 其他属性取决于具体的 layout 类型 # 本例中 PatternLayout 具有 pattern 属性 appender.ap1.layout.pattern = [%t] %-5p %c - %m%n appender.ap2.type = typeOfAppender2 appender.ap2.name = nameOfAppender2 appender.ap2.xxx = xxx appender.ap2.layout.type = xxx appender.ap2.layout.xxx = xxx appender.ap2.filter.type = [accept|neutral|deny] appender.ap2.filter.onMatch = [accept|neutral|deny] appender.ap2.filter.onMisMatch = [accept|neutral|deny] ############################################## # Loggers # ############################################## # 2.6 版本前也需要定义变量列表,由于与过滤器类似,这里直接写 2.6版本之后的写法 # 记录器名称,一般是包或类的全限定名称,注意:会忽略名称叫 `root` 的 logger # 必填 logger.log1.name = org.foo # 设置是否将日志事件打印到父、先辈的 appender 上 # 注意:向上传的是所有日志事件,未经过自己的 logger 过滤 # 具体在父、先辈如何过滤,要看父、先辈的 appender 上的过滤器 logger.log1.additivity = true # 是否包含记录器所在业务代码的位置信息(高开销) # 同步 logger 默认为 true, # 异步 logger 默认为 false,因为涉及位置信息快照在不同线程之间传递 logger.log1.includeLocation = [true|false] # 日志记录级别,左到右权重越来越大,确定级别后,小于等于其权重的都被记录 logger.log1.level = [off|fatal|error|warn|info|debug|trace|all] # 需要异步 logger,就需要 type属性,其值为 AsyncLogger logger.log1.type = AsyncLogger # 该 logger 的记录信息需要发送到的 appender 引用,其值为 appender 定义中的 name 属性 # 一个 logger 可以配置多个 appender,通过 appenderRef.XXX 变量名来区分 # 必填 logger.log1.appenderRef.ap1.ref = nameOfAppender1 # 确定小于等于哪个日志级别的消息需要传递到该 appender logger.log1.appenderRef.ap1.level = [off|fatal|error|warn|info|debug|trace|all] # 在上面参数定义的 levle 范围内再次进行过滤,且只能包含一个过滤器 logger.log1.appenderRef.ap1.filter.f.type = xxx logger.log1.appenderRef.ap1.filter.f.onMatch = [accept|neutral|deny] logger.log1.appenderRef.ap1.filter.f.onMisMatch = [accept|neutral|deny] # 如果想要多组过滤器,只能将这些过滤器组合成一个组合过滤器 CompositeFilter,格式如下: # type 设置为 `filters`,就能找到 CompositeFilter 插件 logger.file.appenderRef.random.filter.f.type = filters logger.file.appenderRef.random.filter.f.f1.type = xxx logger.file.appenderRef.random.filter.f.f1.xxx = xxx logger.file.appenderRef.random.filter.f.f2.type = xxx logger.file.appenderRef.random.filter.f.f2.xxx = xxx # 一个 logger 可以有多个 appenderRef,如下所示为第二个定义 logger.log1.appenderRef.ap2.ref = nameOfAppender2 logger.log1.appenderRef.ap2.level = [off|fatal|error|warn|info|debug|trace|all] logger.log1.appenderRef.ap2.filter.f1.type = xxx logger.log1.appenderRef.ap2.filter.f1.onMatch = [accept|neutral|deny] logger.log1.appenderRef.ap2.filter.f1.onMisMatch = [accept|neutral|deny] # 注意 logger 中日志级别的优先级: # log1.level > log1.appenderRef.ap1.level > log1.appenderRef.ap1.filter # 也就是说,ap1.filter 在 ap1.level定义的范围做过滤, # 而 ap1.level 又在 log1.level 的范围内限制 ############################################## # RootLogger # ############################################## # 与上面 Loggers 相比,除不能有 name、additivity 属性定义外 # 最重要是配置节点元素变成了 rootLogger,且它后面必要根变量名,直接写它的属性,因为只有一个 root # rootLogger 不能配置名称,不代表它没有名称,它的名称为:“” 空字符串,不是 null # 需要异步 logger,就需要 type属性,其值为 AsyncLogger rootLogger.type = AsyncLogger # 是否包含记录器所在业务代码的位置信息(高开销) # 同步 logger 默认为 true, # 异步 logger 默认为 false,因为涉及位置信息快照在不同线程之间传递 rootLogger.includeLocation = [true|false # 默认为 error rootLogger.level = [off|fatal|error|warn|info|debug|trace|all] rootLogger.appenderRef.ap1.ref = xxx rootLogger.appenderRef.ap1.level = [off|fatal|error|warn|info|debug|trace|all] # 在上面参数定义的 levle 范围内再次进行过滤,且只能包含一个过滤器 rootLogger.appenderRef.ap1.filter.f.type = xxx rootLogger.appenderRef.ap1.filter.f.onMatch = [accept|neutral|deny] rootLogger.appenderRef.ap1.filter.f.onMisMatch = [accept|neutral|deny]