在类中初始化记录器的最佳方法是什么?

时间:2015-11-08 19:31:32

标签: java logging log4j logback

我有两个选项可以在一个类中初始化Logger

第一种方法是提供Class<?>的实例:

logger = LoggerFactory.getLogger(SignUpController.class);

,第二个是传递String标识符(包和类名):

logger = LoggerFactory.getLogger("controller.SignUpController");

问题是:

为类初始化记录器的最佳方法是什么? 应该使用哪些修饰符? (访问修饰符,staticfinal

3 个答案:

答案 0 :(得分:6)

我用

public final Logger = LogFactory.getLogger(getClass());

对于其中一个,即使重构了类名,这也将确保始终正确的类名。每个实例化对象对每个类的一个记录器实例的开销是可忽略的。

当我需要以静态上下文记录某些内容然后使用您的第一种方法初始化时,我只使用静态记录器。

答案 1 :(得分:4)

使用第一个

private static final Logger logger = LoggerFactory.getLogger(SignUpController.class);

因为,api(接受类对象),该方法在内部调用完全限定类名,因此可以正确完成日志记录控制/配置。

我使用private static final因为私有:因为记录器实例不应该在课外使用静态:没有使用单独的实例对于类的每个对象, final ,以便在初始化后不更改引用。

答案 2 :(得分:1)

此解决方案:

$columns = array(
    'id' => 'ID',
    'name' => 'Name',
    'email' => 'Email',
    'count' => 'Number of posts'
);

$columns = array_merge(
    array_slice( $columns, 0, 3, true ),     // The first 3 items from the old array
    array( 'subscribed' => 'Subscribed' ),   // New value to add after the 3rd item
    array_slice( $columns, 3, null, true )   // Other items after the 3rd
);

print_r( $columns );

/*
Array ( 
    [id] => ID 
    [name] => Name 
    [email] => Email 
    [subscribed] => Subscribed 
    [count] => Number of posts 
)
*/

有一个小缺点,就是它被复制并粘贴到其他类中,并且很容易忘记调整类名。因此,我更喜欢这种可以“复制并粘贴”的解决方案:

private static final Logger logger = LoggerFactory.getLogger(SignUpController.class);