自定义 Log4j2 包装器和输出

custom Log4j2 wrapper and output

我有一个围绕 Log4j2 的自定义包装器。我在输出上有一些问题,在 XXX 行下是我想要的。但是当我使用 "Log.info()" 时,我无法得到相同的结果。除 "Log .getLog().info()"

之外的任何解决方法

这是代码

public class TestMyLog {
public static void main(String[] args){
    Log.info("asdasggg");
    Log.debug("asdasda");
    Log.fatal("asdwefe");
    Log.error("fgggg");
    Log.warn("sdsdee");
    Log.trace("ioimom");
    System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    Log.getLog().info("sdss");
    Log.getLog().debug("dddddd");
    Log.getLog().error("erffs");

}

}

public class Log{
public static Log4j getLog(){
    return new Log4j2Wrapper();
}
public static void info(String str){
    new  Log4j2Wrapper().info(str);
}
public static void debug(String str){
    new  Log4j2Wrapper().debug(str);
}
public static void error(String str){
    new  Log4j2Wrapper().error(str);
}
public static void fatal(String str){
    new  Log4j2Wrapper().fatal(str);
}
public static void trace(String str){
    new  Log4j2Wrapper().trace(str);
}
public static void warn(String str){
    new  Log4j2Wrapper().warn(str);
}
public static boolean isInfoEnabled(){
    return new Log4j2Wrapper().isInfoEnabled();
}
public static boolean isDebugEnabled(){
    return new Log4j2Wrapper().isDebugEnabled();
}
public static boolean isErrorEnabled(){
    return new Log4j2Wrapper().isErrorEnabled();
}
public static boolean isFatalEnabled(){
    return new Log4j2Wrapper().isFatalEnabled();
}
public static boolean isWarnEnabled(){
    return new Log4j2Wrapper().isWarnEnabled();
}
public static boolean isTraceEnabled(){
    return new Log4j2Wrapper().isTraceEnabled();
}

}

public class Log4j2Wrapper implements Log4j{
private static final String FQCN = Log4j2Wrapper.class.getName();
private ExtendedLoggerWrapper log;

public Log4j2Wrapper() {
    Logger logger = LogManager.getLogger();
    log = new ExtendedLoggerWrapper((ExtendedLogger) logger,
            logger.getName(), logger.getMessageFactory());
}

public boolean isInfoEnabled() {
    return log.isInfoEnabled();
}
public boolean isDebugEnabled() {
    return log.isDebugEnabled();
}
public boolean isErrorEnabled() {
    return log.isErrorEnabled();
}
public boolean isFatalEnabled() {
    return log.isFatalEnabled();
}
public boolean isWarnEnabled() {
    return log.isWarnEnabled();
}
public boolean isTraceEnabled() {
    return log.isTraceEnabled();
}
public void info(String str) {
    log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), null);
}
public void info(String str, Throwable t) {
    log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), t);
}
public void debug(String str){
    log.logIfEnabled(FQCN, Level.DEBUG,null,new SimpleMessage(str),null);
}
public void error(String str){
    log.logIfEnabled(FQCN, Level.ERROR,null,new SimpleMessage(str),null);
}
public void fatal(String str){
    log.logIfEnabled(FQCN, Level.FATAL,null,new SimpleMessage(str),null);
}
public void trace(String str){
    log.logIfEnabled(FQCN, Level.TRACE,null,new SimpleMessage(str),null);
}
public void warn(String str){
    log.logIfEnabled(FQCN, Level.WARN,null,new SimpleMessage(str),null);
}

}

public interface Log4j {
boolean isInfoEnabled();
boolean isDebugEnabled();
boolean isErrorEnabled();
boolean isFatalEnabled();
boolean isWarnEnabled();
boolean isTraceEnabled();
void info(String str);
void info(String str, Throwable t);
void debug(String str);
void error(String str);
void fatal(String str);
void warn(String str);
void trace(String str);

}

如果您在 log4j2.xml 文件中使用 PatternLayout,我相信此模式会为您提供所需的输出。

pattern="%d{dd HH:mm:ss.SSS} %-5level %-10logger{2} %-10M() ] %msg%n" />

https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers

如果您想编写自定义 Logger 包装器,则很难正确获取位置信息,因为 Log4j2 遍历堆栈跟踪许多步骤以找到该位置,并且您的包装器添加了一个额外的 StacktraceElement。

我建议您使用 Log4j2 工具创建自定义包装器:查看 manual page for custom log levels。此工具可以为正确处理位置信息的自定义记录器生成代码。

P.S。 请注意,遍历堆栈跟踪以查找日志记录位置在性能方面非常昂贵。 async logging page 有一些具体数字。这就像每条日志消息都抛出一个异常。