log4j日志记录没有显示在跨项目应用程序上?

时间:2011-11-22 12:08:24

标签: java maven log4j pom.xml

说明: 我有几个项目: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。

3 个答案:

答案 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。