如何以我想要的方式/格式使用log4j?

时间:2012-07-24 13:19:20

标签: java logging log4j

我想了解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)?

3 个答案:

答案 0 :(得分:1)

这一行:

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

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

答案 1 :(得分:0)

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

log4j.appender.rollingFile.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

答案 2 :(得分:0)

行:

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

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

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