我最近阅读http://jira.sonarsource.com/browse/RSPEC-1312(Loggers应该是“private static [final | const]”并且应该共享一个命名约定)我想知道这个规则是否会对我的应用程序产生影响。
我们正在开发在每个用户会话中持有Spring Beans的Web应用程序,这些应用程序使用commons-logging w / log4j进行日志记录。 当我们将记录器定义为“静态”时,将无法使用每个会话的自定义LogFactory重新配置日志级别,因此所有用户将共享相同的日志级别。
由于有关于此规则的讨论,我想问一下这个用例是否适合您,或者是否有更好的方法在Web应用程序中进行记录器分离。
答案 0 :(得分:1)
如果Loggers不是静态字段,那么它们就是实例字段(显然是:))。这意味着它们是用每个新实例创建的,与实例一起序列化(这是不可取的)等等。
如果它们不是静态的,我不知道任何灾难性的影响(当然,只要你处理潜在的缺点)。
但是,我宁愿采取不同的方法来解决您的要求。我仍然会在内部使用静态Logger,但我不会直接使用Logger,而是使用一些代理来动态计算用户记录的内容。例如:
private static final Logger logger = MyCustomLoggerFactory.createLogger(SomeClass.class);
然后我会拦截对记录器的所有调用,并根据用户决定记录的内容(用户信息以某种方式绑定到线程,所以你可以很容易地在拦截器/代理中获取它。) / p>
除了作为更清洁的解决方案,这还为您提供了更大的灵活性。例如,您可以在初始化会话后更改用户的日志级别(如果某些条件发生更改,例如管理员打开所有当前登录用户的调试日志记录),或者您可以对该消息执行其他操作(将其复制到某些用户的单独文件中等)。