2011-10-17 38 views
1

我想在我的程序中将日志记录添加到很少的类。我是否需要添加命令行来定义一个记录器每个需要一个记录器类(我想避免将记录对象在我的计划。将Log4j记录器放入多个类

public class SomeClass { 
    static Logger logger = Logger.getLogger(SomeClass.class); 
    ....... 

如果我这样做,我能得到这个呼叫“知道”它的类(类似this.class 还是有替代这样做

+1

使用Eclipse代码模板:http://stackoverflow.com/questions/1028858/useful-eclipse-java-code-templates/1029304#1029304 – palacsint

回答

1

是需要行添加到每个班。 如果你的记录是静态的方式(如你的例子),你需要每次都喜欢到指定类你做了(SomeClass.class)。如果你让你的记录器不是静态的,那么你可以使用this.getClass(),这会更贴切友好:

public class SomeClass { 
    private Logger logger = Logger.getLogger(this.getClass()); 
    ....... 
+0

注意这如果某人创建了一个'公共类SubClass extends SomeClass',那么'SubClass'从'SomeClass'继承的每一个方法都会得到'SubClass'的记录器 - 这可能是也可能不是期望的结果。 –

+0

你不得不将它添加到每个类中。事实上,有这么多upvotes似乎表明,这不是常识。 –

1

不,你不需要需要这样做,但这是一个习惯做法,并且是一个好习惯。 Log4j是围绕这个假设而构建的,人们会以这种方式使用它。它可以免费提供日志事件发布地点的位置,以及整个日志记录器日志级别的简单管理。

从理论上讲,您可以在多个类中共享一个记录器,或者甚至只有一个全局; Logger是线程安全的,它需要在追加对象时进行同步,所以你的性能不会受到影响。你也可以将它命名为任何你想要的,不需要使用类名。不过,并不建议,因为我上面提到的原因。

此外,由于log4j认为只能创建一个具有给定名称的记录器,因此不需要编写参考static,因为它不会因存储在实例变量中而浪费内存。

2

一个选择,我觉得方便的是使为您创建记录器的抽象类:

public abstract class AbstractLoggingThing { 
    private final Logger log = LoggerFactory.getLogger(this.getClass()); 

    protected Logger getLog() { 
     return log; 
    } 
} 
按照惯例

然后,每一个从它继承有一个正确配置的Logger类,而你不知道不得不在整个地方都有相同的,愚蠢的代码。项目中的大多数类都可以很容易地将其包含在其继承层次中,对于那些不能,无论出于何种原因,您仍然可以回到旧式。您还可以添加漂亮的便捷方法,如:

protected void info(String message, Object... args) { 
     // What goes here depends on your logging library 
    } 
+0

我不会那样做。它可能在多语言继承的语言中表现良好,但在Java中,它导致创建上帝对象和与基类紧密耦合的代码。作为一个包中的便捷方法可能没问题,但肯定不适用于整个应用程序。 – MaDa

+0

@MaDa:完全没有。如果它适合一个包装,为什么不在更广的范围内?把它看作是一个穷人的混蛋。如果我使用的是AspectJ,我可能会编写这些代码而不是继承它。此外,我成功地将这种方法用于大型项目,并且没有任何有害的副作用。它被视为比对象更多的替代物。这非常有用,并且具有所有(大多数)记录集中管理的额外好处。对于那些仍然使用commons logging或log4j的人来说,它也可以不需要那些疯狂的'if(log.isXxxEnabled()'调用... –

+0

我们也在一个Java项目中使用了这种模式,该模式对使用外部库有极大的限制 - 它工作得很好,但多年来,为这个超级基础类添加另一个方法的诱惑是不可抗拒的,并且它变得非常庞大,我肯定会反对这种模式的不受欢迎的使用方式。相当先进。 – MaDa