说明: 我有几个项目:proj-a,proj-b,proj-c等。这些项目通过依赖项中的pom.xml连接。
现在我的问题是: proj-a是主要的框架项目,所有项目的所有共同点都在那里。因此,我的静态日志处理程序包含在该项目中。它现在由proj-b引用,并且日志处理程序是可访问的,但每次我尝试记录某些内容时,它都不会写入指定的文件或控制台。我知道我的配置是正确的,因为我试图在proj-a上创建一个junit测试并测试日志处理程序,它输出我需要它输出的内容,一个文件和控制台显示中的日志。
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());
}
}
和proj-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;
}
proj-a包含log4j jar文件以及log4j.xml。
答案 0 :(得分:0)
为什么不在运行时设置文件,而不是在配置文件中设置它。
在代码中:
System.setProperty("file.name","your path");
在log4j配置文件中:
log4j.appender.appender_name.File = ${file.name}
另一种方法是在代码中使用setFile(String fileName)函数并在运行时设置文件名。
答案 1 :(得分:0)
我怀疑这是一个类路径和类加载器问题。 您的log4j配置文件位于项目A中内置的jar中。 项目B在其类路径中包含项目A的jar文件以及log4j.jar文件。 当你的主类尝试初始化log4j系统时,它使用你的Main类的类加载器来查找log4j配置文件,但它找不到它,因此你应该把错误打印到stderr,如:
log4j:WARN找不到记录器(TestServicePublisher)的附加程序。
log4j:WARN请正确初始化log4j系统。
要验证这是使用log4j.configuration系统属性显式设置配置文件。
答案 2 :(得分:0)
我现在有一个解决我的困境的方法。我已经重新检查了所有项目中的所有POM,并在projectC上找到了另一个log4j依赖项实例。
显然,这附带了slf4j和slf4j-jdk,这就是为什么我看到信息级别的日志与slf4j手册中的示例here相同。从POM中删除这些依赖项之后,我能够在任何相关项目上运行主要方法而没有任何问题。
当我在projectA上运行junits或main方法时,我得到了调试信息,因为它不依赖于任何其他项目,这意味着它不包括slf4j和slf4j-jdk。