Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j2打印具有自动连线log4j包装器的类的名称_Java_Spring_Logging_Autowired_Log4j2 - Fatal编程技术网

Java Log4j2打印具有自动连线log4j包装器的类的名称

Java Log4j2打印具有自动连线log4j包装器的类的名称,java,spring,logging,autowired,log4j2,Java,Spring,Logging,Autowired,Log4j2,我正在使用SpringIOC和Logger的Autowiredbean,这是一个围绕Logger的定制包装器 @Autowired private Loggers logger; 它有一些包装器代码,基本上用于格式化字符串和在传递枚举时打印枚举值 public class Loggers implements Serializable { private static final long serialVersionUID = 1L;

我正在使用SpringIOC和Logger的Autowiredbean,这是一个围绕Logger的定制包装器

    @Autowired
    private Loggers logger;
它有一些包装器代码,基本上用于格式化字符串和在传递枚举时打印枚举值

       public class Loggers implements Serializable {

        private static final long serialVersionUID = 1L;

        public static Logger TRACE = LogManager.getLogger("com.mypackage.class");
        public static String msgXidFormat = " %s : %s : %s ";
        public static String msgFormat = " %s : %s ";

        public static Logger getLogger(Class clazz) {
            Logger logger = LogManager.getLogger(clazz);
            return logger;
        }

        public void info(String message) {
            TRACE.info(String.format(msgXidFormat,message);
        }
}
还有一些语句是从应用程序类中记录的,在这些应用程序类中,这个记录器bean已经自动连接到Ex::

logger.info("Lion is the king of the Jungle");
其中logger指的是上述类别

这是log4j2.xml中的log4j模式布局,我使用它来打印消息以及类名和行号

<PatternLayout pattern="%d{ISO8601}{GMT} %-5p %c{1}:%L - %m%n"/>

但是我得到的每个类的类名是Loggers,我希望这个log语句是从哪个类第一次被请求的。
我有没有办法不改变代码来处理这个问题,因为有很多类都是自动连接的。如果有人遇到过类似的情况或对此有一些想法,请与我们分享。

我看不到您的代码中有任何地方记录者可以了解调用方的类别。这是因为你不知道怎么做,还是我遗漏了什么?@fxm,这就是问题所在,而且有大量的类,其中Logger类是自动连接的,我正在寻找一种不改变的方法,通过进入每个类并改变,但是,如果可以告诉记录器调用方信息,则可以使用任何快捷方式。您始终使用
跟踪
-Logger。这就是为什么它总是记录
Loggers
classname。您必须使用
getLogger
来获取特定于类的记录器。不过,我不知道SpringIOC是如何实现的。要实现您想要的功能,您必须创建一个扩展AbstractLoggerFactory的LoggerFactory和一个自定义记录器。这是必要的,以便您可以定义LoggerFactory和Logger的FQCN。一旦您这样做,Log4j将能够确定调用您的实现的类。你可以在Log4j中看到这样的例子,作为SLF4J适配器,Log4j 1.x桥也做了类似的事情。使用反射:我看不到在您的代码中任何地方记录器可以了解调用方的类。这是因为你不知道怎么做,还是我遗漏了什么?@fxm,这就是问题所在,而且有大量的类,其中Logger类是自动连接的,我正在寻找一种不改变的方法,通过进入每个类并改变,但是,如果可以告诉记录器调用方信息,则可以使用任何快捷方式。您始终使用
跟踪
-Logger。这就是为什么它总是记录
Loggers
classname。您必须使用
getLogger
来获取特定于类的记录器。不过,我不知道SpringIOC是如何实现的。要实现您想要的功能,您必须创建一个扩展AbstractLoggerFactory的LoggerFactory和一个自定义记录器。这是必要的,以便您可以定义LoggerFactory和Logger的FQCN。一旦您这样做,Log4j将能够确定调用您的实现的类。你可以在Log4j中看到这样的例子,作为SLF4J适配器,Log4j 1.x桥也做了类似的事情。使用反射: