Sonarqube “的含义;伐木工人应为私人静态“伐木工人”;

Sonarqube “的含义;伐木工人应为私人静态“伐木工人”;,sonarqube,Sonarqube,我最近读到(记录器应该是“private static[final | const]”,并且应该共享一个命名约定),我想知道这个规则是否会对我的应用程序产生影响 我们正在开发在每个用户会话中保存Springbean的web应用程序,这些应用程序使用commons日志w/log4j进行日志记录。 当我们将记录器定义为“静态”时,就没有机会使用每个会话的自定义日志工厂重新配置日志级别,因此所有用户都将共享相同的日志级别 由于有关于这条规则的讨论,我想问一下这个用例对您来说是否是一个新的用例,或者是否

我最近读到(记录器应该是“private static[final | const]”,并且应该共享一个命名约定),我想知道这个规则是否会对我的应用程序产生影响

我们正在开发在每个用户会话中保存Springbean的web应用程序,这些应用程序使用commons日志w/log4j进行日志记录。 当我们将记录器定义为“静态”时,就没有机会使用每个会话的自定义日志工厂重新配置日志级别,因此所有用户都将共享相同的日志级别


由于有关于这条规则的讨论,我想问一下这个用例对您来说是否是一个新的用例,或者是否有更好的方法在web应用程序中分离记录器。

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

如果它们不是静态的,我就不会意识到任何灾难性的影响(当然,前提是你考虑到潜在的负面影响)

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

private static final Logger logger = MyCustomLoggerFactory.createLogger(SomeClass.class);
然后,我将拦截对记录器的所有调用,并根据用户决定记录的内容(我假设用户信息以某种方式绑定到线程,因此您可以在拦截器/代理中轻松获得它)


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

谢谢您的回答,我的记录器总是被定义为瞬态的,所以序列化不是问题。我是否正确理解您的示例,工厂确实创建了记录器代理,而不是特定于框架的实现?我相信这就是commons日志记录的目的,以提供来自不同实现的抽象。但是commons日志并没有涵盖您的需求,这就是为什么我要在它上面添加另一个抽象。这只是遵循OOP原则,如封装和经验证的设计模式。