Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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 跨项目应用程序上不显示log4j日志记录?_Java_Maven_Log4j_Pom.xml - Fatal编程技术网

Java 跨项目应用程序上不显示log4j日志记录?

Java 跨项目应用程序上不显示log4j日志记录?,java,maven,log4j,pom.xml,Java,Maven,Log4j,Pom.xml,简介: 我有几个项目:proj-a、proj-b、proj-c等等。这些项目通过依赖关系中的pom.xml连接起来 现在我的问题是: proj-a是一个主要的框架项目,所有项目的共同点都在这里。因此,我的静态日志处理程序包含在该项目中。它现在被proj-b引用,并且日志处理程序可以访问,但是每次我尝试记录某些内容时,它都不会写入指定的文件或控制台。我知道我的配置是正确的,因为我尝试在proj-a上创建junit测试,并测试了log hander,它输出我需要它输出的内容,文件中的日志和控制台显示

简介: 我有几个项目:proj-a、proj-b、proj-c等等。这些项目通过依赖关系中的pom.xml连接起来

现在我的问题是: proj-a是一个主要的框架项目,所有项目的共同点都在这里。因此,我的静态日志处理程序包含在该项目中。它现在被proj-b引用,并且日志处理程序可以访问,但是每次我尝试记录某些内容时,它都不会写入指定的文件或控制台。我知道我的配置是正确的,因为我尝试在proj-a上创建junit测试,并测试了log hander,它输出我需要它输出的内容,文件中的日志和控制台显示

proj-b示例代码:

public class TestServicePublisher {

    public static void main(final String[] args) {
        //  System.out.println("Test Service started.");
        //  Endpoint.publish("http://localhost:8080/cas-service", new TestService());
        LogHandler.logDebug(TestServicePublisher.class, "main", "Starting Login Service");
        Endpoint.publish("http://localhost:8080/cas-service/login", new LoginService());
    }

}
项目a中的logHandler示例如下:

public static String logDebug(Class clazz, String methodName,
        Integer messageCode, List<String> messageAttributes) {
    List<String> classMethodAttributes = createClassMethodAttributes(clazz,
            methodName);
    String message = retrieveMessage(messageCode, messageAttributes,
            classMethodAttributes);
    Logger logger = Logger.getLogger(clazz);
    logger.debug(message);
    return message;
}
publicstaticstringlogdebug(类clazz,stringmethodname,
整数messageCode,列出messageAttributes){
List classMethodAttributes=createClassMethodAttributes(clazz,
方法名称);
字符串消息=检索消息(消息代码、消息属性、,
类方法属性);
Logger=Logger.getLogger(clazz);
调试(消息);
返回消息;
}

proj-a包含log4jjar文件以及log4j.xml。

为什么不在运行时设置该文件,而不是在配置文件中设置它呢

在守则中:

System.setProperty("file.name","your path"); 
在log4j配置文件中:

log4j.appender.appender_name.File = ${file.name}

另一种方法是在代码中使用函数,并在运行时设置文件名。

我怀疑这是类路径和类加载器的问题。 log4j配置文件位于项目a中内置的jar中。 项目B的类路径中有来自项目A的jar文件,以及log4j.jar文件。 当主类尝试初始化log4j系统时,它使用主类的类加载器查找log4j配置文件,但找不到它,因此您应该将错误打印到stderr,如:

log4j:警告:找不到记录器(TestServicePublisher)的附加器

log4j:警告请正确初始化log4j系统


要验证这一点,请使用log4j.configuration系统属性显式设置配置文件。

我现在有了解决问题的方法。我重新检查了所有项目上的所有POM,并在projectC上找到了另一个log4j依赖项实例

显然,这是slf4j和slf4j jdk带来的,这就是为什么我看到的信息级别日志与slf4j手册中的示例相同。从POM中删除这些依赖项后,我能够在任何相关项目上运行主方法,而不会出现任何问题


当我在projectA上运行junits或main方法时,我也得到了调试信息,因为它不依赖于任何其他项目,这意味着它不包括slf4j和slf4j jdk。

显然,在尝试运行ProjectB的main方法时,我没有收到这些警告。我尝试过这样看,但每次运行projectB的主方法启动我的服务,它确实经过projectA的日志处理程序,但没有给出您在此处指定的错误。您是否尝试调试log4j初始化?您可以通过将JVM属性log4j.debug设置为true来实现这一点。如果我在projectA上创建了一个主属性并使用-Dlog4j.debug命令运行它,它将运行并显示日志。如果我在projectB上尝试,则不会显示任何日志。附加信息:如果我添加loggger.info(“此处的某些消息”),它会出现在控制台上,调试级别不会出现。这就是我试图获取的:)我几个月前遇到了slf4j问题。遗憾的是,shamis,如果我使用junit测试,我无法使用任何这些属性文件,因为属性文件可以工作。但如果我在projectA中创建一个main方法,它就会出现Oded Peer在他的帖子中所说的错误。