Java 关于log4j.xml NullAppender
我用谷歌搜索了一下,但找不到任何相关信息Java 关于log4j.xml NullAppender,java,logging,log4j,Java,Logging,Log4j,我用谷歌搜索了一下,但找不到任何相关信息log4j支持一组日志Appender,网上到处都有关于ConsoleAppender和FileAppender的文档,但是关于Appender的信息很少或根本没有,例如NullAppender,jdbappender等。我对NullAppender特别感兴趣 <appender name="???" class="org.apache.log4j.varia.NullAppender"> <appender name="???" cla
log4j
支持一组日志Appender
,网上到处都有关于ConsoleAppender
和FileAppender
的文档,但是关于Appender的信息很少或根本没有,例如NullAppender
,jdbappender
等。我对NullAppender
特别感兴趣
<appender name="???" class="org.apache.log4j.varia.NullAppender">
<appender name="???" class="org.apache.log4j.jdbc.JDBCAppender">
这门课的一个简单的谷歌搜索就能帮你找到答案
因此,基本上,如果您使用NullAppender,您的日志消息将不会被写入任何地方。对于NullAppender
,没有太多文档,主要是因为没有什么可配置的:您可以使用定义一个
XML配置中的param
标记对应于Java类中的setter,但请注意Javadoc顶部的红色大警告:
警告:此版本的JDBCAppender很可能在将来被完全替换。此外,它不会记录异常
因此,考虑到log4jv2.0目前处于beta版,粗略地看一下似乎表明它在v2中不存在,可能不是最好的依赖类。NullAppender基本上什么都不做,就像其他人已经指出的那样。我只是想安排一些细节
AppenderSkeleton implements Appender {
...
@Override
public synchronized void doAppend(LoggingEvent event) {
...
}
...
abstract protected void append(LoggingEvent event);
}
public class NullAppender extends AppenderSkeleton {
public static String s;
public String t;
...
@Override
public void doAppend(LoggingEvent event) {
if(layout != null) {
t = layout.format(event);
s = t;
}
}
@Override
public void append(LoggingEvent event) {
}
AppenderSkeleton实现Appender{
...
@凌驾
公共同步的void doAppend(LoggingEvent事件){
...
}
...
抽象保护无效附加(LoggingEvent事件);
}
公共类NullAppender扩展了AppenderSkleton{
公共静态字符串s;
公共字符串t;
...
@凌驾
公共无效doAppend(记录事件){
if(布局!=null){
t=布局。格式(事件);
s=t;
}
}
@凌驾
公共作废附加(记录事件){
}
另见:
每次log.trace/debug/…调用都会发生什么
-> org.apache.log4j.Category.forcedLog(String fqcn, Priority level, Object message, Throwable t)
-> org.apache.log4j.Category.callAppenders(LoggingEvent event)
-> org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(LoggingEvent event) is called on each Appender within that Logger
-> org.apache.log4j.Appender.doAppend(LoggingEvent event)
which is NullPointers implementation of doAppend in this case.
->org.apache.log4j.Category.forcedLog(字符串fqcn、优先级、对象消息、Throwable t)
->org.apache.log4j.Category.callAppenders(LoggingEvent事件)
->对该记录器中的每个Appender调用org.apache.log4j.helpers.appenderatachableimpl.appenderlooponappenders(LoggingEvent事件)
->org.apache.log4j.Appender.doAppend(LoggingEvent事件)
这是本例中doAppend的空指针实现。
正如您所看到的,NullAppender取消了同步,NullAppender.doAppend产生了一些开销,但在大多数情况下这一开销很小
至于JDBCAppender,不应该使用它
WARNING: This version of JDBCAppender
is very likely to be completely replaced in the future. Moreoever,
it does not log exceptions.
警告:此版本的JDBCAppender
很可能在未来被完全取代。而且,
它不记录异常。
见:第34-36行
另一种选择是,您可能想查看一下是否方便。如果我不想将日志消息附加到任何位置,为什么要使用此选项?任何特定示例?假设我有一个类别的层次结构树。我希望某个级别或更低级别的所有类别都不记录任何内容。我可以确定该级别并将阈值设置为“无”。这是doesn无法解决我的问题,因为我可以有几十个子类别声明覆盖NONE设置。要解决这个问题,我可以将pinpoint类别的appender设置为NullAppender,appender Additionity设置为false。当我稍后改变主意时,请反转更改。这两次我都可以将所有子类别声明单独保留。诚然,注释切换也可以达到同样的效果。嗯,我对此也不太乐观:)但无论如何还是要谢谢你。@Annjawn如果你真的需要登录到你的数据库,你最好的选择可能是,要么扩展现有的数据库,要么只是实现Appender接口。是的,我本来会这么做的,但现在我对c很满意onsole和文件追加器。