0

我想了解 log4j 是如何工作的。我已经阅读了很多教程和该站点的所有答案,但我仍然没有得到一个有效的具体示例。

我试过这个:

import org.apache.log4j.*;

public class Exercise {
    private static Logger logger = Logger.getLogger(SimpleLogger.class);

    public static void main(String args[]) {

        BasicConfigurator.configure();

        // ConsoleAppender myAppender = new ConsoleAppender(null, "System.out");
        // myAppender.setLayout(new SimpleLayout());
        // logger.addAppender(myAppender);

        for (int i = 0; i < 5; i++) {
            logger.info("You are here!");
        }

        logger.info("End of program");
    }
}

有了这个类:

import org.apache.log4j.spi.LoggingEvent;

public class SimpleLogger extends org.apache.log4j.Layout {

    @Override
    public void activateOptions() {

    }

    @Override
    public String format(LoggingEvent event) {
        return "log message = " + event.getMessage().toString() + "/n";
    }

    @Override
    public boolean ignoresThrowable() {
        return true;
    }
}

但我的输出是:

0 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - End of program

我也试过了,代码没有注释,但我得到的只是双重形式的输出或其他东西。

问题:如何使输出(控制台或文件)成为我想要的格式?我是否需要修改(log4j.properties)之类的外部文件?

4

3 回答 3

1

这一行:

private static Logger logger = Logger.getLogger(SimpleLogger.class);

只是通知默认记录器当前的记录上下文是 SimpleLogger。它没有指定底层的记录器实现。事实上,您根本不需要实现自定义记录器。您只需要使用允许您在配置文件中指定格式的配置器。一种常见的技术是使用 XmlConfigurator,然后您的 XML 配置文件可以非常具体地在各种上下文下进行格式化。在此处查看有关基于 XML 的配置的详细信息。

于 2012-07-24T13:29:21.483 回答
0

在属性文件中配置 log4j 是最佳实践。
通过指定ConversionPattern您可以获得所需的输出格式。例如

log4j.appender.rollingFile.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
于 2012-07-24T13:26:06.520 回答
0

该行:

private static Logger logger = Logger.getLogger(SimpleLogger.class);

并不意味着现在记录器将使用您的类来记录,它只是意味着它将在 log4j.properties 文件中查找一个被调用的记录器SimpleLogger(或者如果它在一个包中它将查找some.package.SimpleLogger)并且它将使用模式布局为该记录器定义。

如果找不到该记录器,它将默认为根记录器并使用根记录器附加程序的模式布局。

于 2012-07-24T13:29:10.753 回答