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