我想了解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)?
答案 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的模式布局。