"Loggers should be private static" 的含义

Implications of "Loggers should be private static"

我最近读了 http://jira.sonarsource.com/browse/RSPEC-1312(Loggers 应该是 "private static [final|const]" 并且应该共享一个命名约定),我想知道这个规则是否会对我的应用程序产生影响。

我们正在开发在每个用户会话中包含 Spring 个 Bean 的 Web 应用程序,这些应用程序使用带有 log4j 的 commons-logging 进行日志记录。 当我们定义我们的记录器时 "static" 将没有机会使用每个会话的自定义 LogFactory 重新配置日志级别,因此所有用户将共享相同的日志级别。

既然有人讨论这个规则,我想问一下这个用例对你来说是否是一个新的用例,或者是否有更好的方法来分离 Web 应用程序中的记录器。

如果记录器不是静态字段,那么它们就是实例字段(显然 :))。这意味着它们是用每个新实例创建的,与实例一起序列化(这是不可取的)等

如果它们不是静态的,我不知道会有什么灾难性的影响(当然,前提是你要注意潜在的缺点)。

但是,我宁愿采用不同的方法来解决您的要求。我仍然会在内部使用静态 Logger,但我不会直接使用 Logger 进行操作,而是使用一些代理来动态计算为用户记录的内容。例如:

private static final Logger logger = MyCustomLoggerFactory.createLogger(SomeClass.class);

然后我会拦截所有对记录器的调用并根据用户决定记录什么(我假设用户信息以某种方式绑定到线程,所以你可以很容易地在 interceptor/proxy).

除了是一个更简洁的解决方案之外,这还为您提供了更大的灵活性。例如,您可以在用户的​​会话初始化后更改用户的日志级别(如果某些条件发生变化,比如管理员为所有当前登录的用户打开调试日志记录),或者您可以对消息做一些额外的事情(为某些用户等将其复制到单独的文件中)。