我使用log4j进行日志记录。我想修改方法:warn(..),error(..)。我想在这个方法中修改消息。 那么,有什么办法,如何创建自己的记录器?
public class MyLogger extends Logger {
protected MyLogger(String name) {
super(name);
}
@Override
public void error(Object message) {
message = "test - " + message;
super.error(message);
}
}
在课堂电话中:
private static final Logger logger = MyLogger.getLogger(TestClass.class);
logger.error("error message");
但是,它不起作用。你可以帮帮我吗?感谢。
答案 0 :(得分:8)
你的问题是:
MyLogger.getLogger(TestClass.class)
是一个static
方法,它返回原始Logger
类。 MyLogger
被忽略。最简单的方法是以decorator模式的精神包装最初返回的Logger
类:
public class MyLogger extends Logger {
final Logger target;
protected MyLogger(Logger target) {
this.target = target;
}
@Override
public void error(Object message) {
target.error(message);
}
//...
}
为了使用MyLogger
装饰器,你必须用它包装原始记录器:
private static final Logger logger =
new MyLogger(Logger.getLogger(TestClass.class));
考虑将其包装在自定义工厂中。
答案 1 :(得分:6)
您永远不应该创建自己的记录器。我已经看到很多不好的理由创造一个,但从来没有一个好的理由。如果要在日志语句中添加一些上下文信息,可以使用Log4J的NDC / MDC功能。
答案 2 :(得分:0)
不要修改记录器 - 记录器只是将日志消息发送到日志记录框架的便捷方式。消息的处理发生在appenders中。
所以你有两个选择:
您可以告诉主appender(附加到根记录器),为您处理这些消息。请看这里:LOG4J: Modify logged message using custom appender
创建一个新的appender,它委托给现有的appender。这样,您可以将此特殊附加器仅附加到一些记录器。
在你的appender中实现AppenderAttachable<E>
。然后,您可以在其配置中使用<appender-ref .../>
。