#************************************************************   
# 書陋堂 <https://reionchan.github.io>                       #
#                                                           #
#        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]