Jdbc 在log4j2中打印intLevel

Jdbc 在log4j2中打印intLevel,jdbc,log4j2,pattern-layout,Jdbc,Log4j2,Pattern Layout,您可以在与内置log4j2日志记录级别对应的数值中看到,例如INFO->400。如何在patternlayout resp中引用它。在JDBC记录器配置中 我有一个JDBC的旧log4j1.x配置,它被称为%iprio 解决方法是使用 级别{OFF=0,FATAL=100,ERROR=200,WARN=300,INFO=400,DEBUG=500,TRACE=600,ALL=1000} 但是我对此不太满意。听起来您想记录日志级别的整数值,而不是名称,而且您不想使用PatternLayout的le

您可以在与内置log4j2日志记录级别对应的数值中看到,例如INFO->400。如何在patternlayout resp中引用它。在JDBC记录器配置中

我有一个JDBC的旧log4j1.x配置,它被称为%iprio

解决方法是使用

级别{OFF=0,FATAL=100,ERROR=200,WARN=300,INFO=400,DEBUG=500,TRACE=600,ALL=1000}


但是我对此不太满意。

听起来您想记录日志级别的整数值,而不是名称,而且您不想使用
PatternLayout
level
参数的标签功能

一种可能的解决方案是创建一个,下面是一些示例代码:

package example;

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "level", category = "Lookup")
public class LevelLookup implements StrLookup{
    /**
     * Lookup the value for the key.
     * @param key  the key to be looked up, may be null
     * @return The value for the key.
     */
    public String lookup(String key) {
        return null;
    }


    /**
     * Lookup the value for the key using the data in the LogEvent.
     * @param event The current LogEvent.
     * @param key  the key to be looked up, may be null
     * @return The value associated with the key.
     */
    public String lookup(LogEvent event, String key) {
        return String.valueOf(event.getLevel().intLevel());
    }
}
接下来,这里是一个使用新查找的示例配置-注意
${level:}

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] ${level:} %logger{36} - %msg%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />           
        </Root>
    </Loggers>
</Configuration>
最后是输出:

22:49:29.438 [main] 500 example.SomeClass - This is some debug!
22:49:29.440 [main] 400 example.SomeClass - Here's some info!
22:49:29.440 [main] 200 example.SomeClass - Some erorr happened!

希望这有帮助

谢谢,这与一个附加补充一起工作:log4j不会处理@Plugin注释,除非在配置标签的packages属性中明确告诉他:packages=“example”。我还应该提到的是,根据法律,我们不允许使用camelcased查找名称。我想使用${intLevel:},但它不起作用。很高兴这对您有用。请注意,log4j2应该在构建过程中自动创建“序列化插件列表文件”,除非您已禁用此功能。此外,我不知道在命名除唯一性以外的查找时有任何命名限制。在示例代码中将查找名称“level”替换为“intLevel”时,效果很好。也许这是旧版本log4j2中的一个bug,因为您链接的问题是OP使用的是2.2和2.3
22:49:29.438 [main] 500 example.SomeClass - This is some debug!
22:49:29.440 [main] 400 example.SomeClass - Here's some info!
22:49:29.440 [main] 200 example.SomeClass - Some erorr happened!