本文转自:http://www.oschina.net/translate/the-new-log4j-2-0
不久之前,著名的日志框架log4j发布了一个新的主要版本。从第一个alpha版本诞生以来,log4j已经发布了4个版本。log4j 2较之前的log4j 1有了很大的改动。因此,虽然log4j 2s现在还很年轻,但它的确是更好的解决方案。本文对Apache log4j 2.0的一些新特性进行了解读。
更为先进的API(Modern API)
在这之前,程序员们以如下方式进行日志记录:
if(logger.isDebugEnabled()) {
logger.debug("Hi, " + u.getA() + “ “ + u.getB());
}
log4j 2.0开发团队鉴于以上考虑对API进行了完善。现在你可以这样写代码:
logger.debug("Hi, {} {}", u.getA(), u.getB());
private Logger logger = LogManager.getLogger(MyApp.class.getName());
private static final Marker QUERY_MARKER = MarkerManager.getMarker("SQL");
...
public String doQuery(String table) {
logger.entry(param);
logger.debug(QUERY_MARKER, "SELECT * FROM {}", table);
return logger.exit();
}
19:08:07.056 TRACE com.test.TestService 19 retrieveMessage - entry
19:08:07.060 TRACE com.test.TestService 46 getKey - entry
根据上述配置,log4j 2将会在de.grobmeier.examples.log4j2.plugins包中找寻你的扩展插件。如果你建立了多个命名空间,没关系,用逗号分隔就可以了。
@Plugin(name = "Sandbox", type = "Core", elementType = "appender")
public class SandboxAppender extends AppenderBase {
private SandboxAppender(String name, Filter filter) {
super(name, filter, null);
}
public void append(LogEvent event) {
System.out.println(event.getMessage().getFormattedMessage());
}
@PluginFactory
public static SandboxAppender createAppender(
@PluginAttr("name") String name,
@PluginElement("filters") Filter filter) {
return new SandboxAppender(name, filter);
}
}
强大的配置功能(Powerful Configuration)
log4j 2的配置变得非常简单。如果你习惯了之前的配置方式,也不用担心,你只要花很少的时间就可以从之前的方式转换到新的方式。请看下面的配置:
...
...
监控的时间间隔单位为秒,最小值是5。这意味着,log4j 2在配置改变的情况下可以重新配置日志记录行为。如果值设置为0或负数,log4j 2不会对配置变更进行监测。最为称道的一点是:不像其它日志框架, log4j 2.0在重新配置的时候不会丢失之前的日志记录。
还有一个非常不错的改进,那就是:同XML相比,如果你更加喜欢JSON,你可以自由地进行基于JSON的配置了:
{
"configuration": {
"appenders": {
"Console": {
"name": "STDOUT",
"PatternLayout": {
"pattern": "%m%n"
}
}
},
"loggers": {
"logger": {
"name": "EventLogger",
"level": "info",
"additivity": "false",
"appender-ref": {
"ref": "Routing"
}
},
"root": {
"level": "error",
"appender-ref": {
"ref": "STDOUT"
}
}
}
}
}
新的配置方式实在是太强大了,支持诸如 属性替代( property substitution)的特性。请查看相关配置手册以获得更多细节 manual pages。
Java 5 并发性(Concurrency)
有一段文档是这样描述的:“log4j 2利用Java 5中的并发特性支持,尽可能地执行最低层次的加锁...”。Apache log4j 2.0解决了许多在log4j 1.x中仍然存留的死锁问题。如果你的程序仍然饱受内存泄漏的折磨,请毫不犹豫地试一下log4j 2.0。
构建在Apache软件基金会(Apache Software Foundation)之上
同log4j 1.x一样,log4j 2.x也是Apache软件基金会的项目。这意味着它遵从于Apache License 2.0,因此仍然是免费的。你可以在它的基础上开发自己的产品,你可以根据需要免费地修改它,你甚至可以从商业角度重新发布它。
你不必关心知识产权的问题,它由Apache软件基金会来负责。如果你想了解更多关于license的问题,以及如何在你的项目中使用log4j 2.0,我建议你参考Licensing FAQ。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们