淄博服装网站建设十大互联网装修平台
web/
2025/9/28 10:43:37/
文章来源:
淄博服装网站建设,十大互联网装修平台,网站制作用什么语言,洛阳网站建设网站建设SLF4J是一个非常流行的日志记录外观#xff0c;但是#xff0c;就像我们使用的所有库一样#xff0c;我们有可能以错误的方式或至少以非最佳方式使用它。 在本教程中#xff0c;我们将列出常见的日志记录错误以及如何使用FindBugs检测到它们。 我们还将在相关时提及PMD和S… SLF4J是一个非常流行的日志记录外观但是就像我们使用的所有库一样我们有可能以错误的方式或至少以非最佳方式使用它。 在本教程中我们将列出常见的日志记录错误以及如何使用FindBugs检测到它们。 我们还将在相关时提及PMD和Sonar Squid检查。 我们将使用两个外部的FindBugs插件它们将日志检测器添加到FindBugs。 第一个是Kengo Toda的SLF4J only插件 其中仅包含SLF4J检测器。 第二个插件是流行的FB Contrib 它包含许多测井仪。 有关如何使用FindBugs插件的信息请参阅以下文章 [Maven] https://gualtierotesta.wordpress.com/2015/06/14/tutorial-using-findbugs-with-maven/ [NetBeans] https://gualtierotesta.wordpress.com/2015/06/07/findbugs-plugins/ 注意在所有示例中我们将假定以下导入 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;1.记录仪定义 错误的方法 W1a. Logger log LoggerFactory.getLogger(MyClass.class);
W1b. private Logger logger LoggerFactory.getLogger(MyClass.class);
W1c. static Logger LOGGER LoggerFactory.getLogger(AnotherClass.class); 正确方法 C1a. private static final Logger LOGGER LoggerFactory.getLogger(MyClass.class);
C1b. private final Logger logger LoggerFactory.getLogger(getClass()); 一般规则 记录器应该是最终的且私有的因为没有理由与其他类共享或重新分配它。 相反对于记录器是否应该是静态的没有普遍的协议。 SLF4J插件支持非静态版本C1b而PMD“ LoggerIsNotStaticFinal”规则和Sonar鱿鱼规则S1312更喜欢静态记录器C1a因此这两个选项均应视为有效。 附加信息 [SLF4J常见问题解答] http://slf4j.org/faq.html#declared_static [Apache Commons静态日志] http://wiki.apache.org/commons/Logging/StaticLog 。 请注意 在静态版本C1a中记录器名称通常使用大写字母作为所有常量字段。 否则PMD将报告“ VariableNamingConventions”违规行为。 在这两种情况下建议的名称都是“ logger / LOGGER”而不是“ log / LOG”因为某些命名约定会避免使用太短的名称少于四个字符。 而且log是动词更适合于方法名。 W1c是错误的因为我们指的是一个类AnotherClass它不是定义记录器的类。 在99的情况下这是由于从一类到另一类的复制粘贴所致。 相关的FindBugsSLF4J插件检查 SLF4J_LOGGER_SHOULD_BE_PRIVATE SLF4J_LOGGER_SHOULD_BE_NON_STATIC SLF4J_LOGGER_SHOULD_BE_FINAL SLF4J_ILLEGAL_PASSED_CLASS 2.格式字符串 错误的方法 W2a. LOGGER.info(Obj myObj);
W2b. LOGGER.info(String.format(“Obj%s”, myObj)); 正确方法 C2. LOGGER.info(Obj{},myObj); 一般规则 格式字符串第一个参数应为常量没有任何字符串串联。 动态内容示例中的myObj值应使用占位符{}添加。 动机很简单无论是否记录消息我们都应在记录器建立后延迟记录消息的创建具体取决于当前的记录级别。 如果我们使用字符串连接则无论采用哪种日志记录级别都会以任何方式构建消息这会浪费CPU和内存资源。 相关的FindBugsSLF4J插件检查 SLF4J_FORMAT_SHOULD_BE_CONST格式应为常数 SLF4J_SIGN_ONLY_FORMAT格式字符串不应仅包含占位符 相关的FindBugsFB Contrib插件检查 LO_APPENDED_STRING_IN_FORMAT_STRING方法将串联的字符串传递给SLF4J的格式字符串 3.占位符参数 错误的方法 W3a. LOGGER.info(Obj{},myObj.getSomeBigField());
W3b. LOGGER.info(Obj{},myObj.toString());
W3c. LOGGER.info(Obj{},myObj, anotherObj);
W3d. LOGGER.info(Obj{} another{},myObj); 正确方法 C3a. LOGGER.info(Obj{},myObj);
C3b. LOGGER.info(Obj{},myObj.log()); 一般规则 占位符应该是对象C3a而不是方法返回值W3a以便在记录级别分析后推迟对其求值请参见上一段。 在W3a示例中无论日志记录级别如何都会始终调用方法getSomeBigField。 出于相同的原因我们应该避免在语义上与C3a等效的W3b但是它总是在toString方法调用中产生。 解决方案W3c和W3d错误因为格式字符串中占位符的数量与占位符参数的数量不匹配。 解决方案C3b可能在某种程度上具有误导性因为它包括方法调用但只要myObj包含多个字段例如它是一个大型JPA实体但我们不想记录其所有内容时它就很有用。 例如让我们考虑以下类 public class Person {
private String id;
private String name;
private String fullName;
private Date birthDate;
private Object address;
private MapString, String attributes;
private List phoneNumbers; 它的toString方法很可能会包含所有字段。 使用解决方案C3a所有它们的值都将打印在日志文件中。 如果不需要所有这些数据则定义如下的帮助方法将很有用 public String log() {
return String.format(Person: id%s name%s, this.id, this.name);
} 仅打印相关信息。 此解决方案的CPU和内存也比toString轻。 有什么关系 它取决于应用程序和对象类型。 对于JPA实体我通常在log方法中包括ID字段如果需要所有列数据以便让我在数据库中找到记录并且可能是一两个重要字段。 毫无疑问应该记录密码字段和/或敏感信息电话号码…。 这是不使用toString登录的另一个原因。 相关的FindBugsSLF4J插件检查 SLF4J_PLACE_HOLDER_MISMATCH 4.调试消息 重要提示规则4请参阅5条规则文章 指导我们使用受保护的调试日志记录 if (LOGGER.isDebugEnabled()) {
LOGGER.debug(“Obj{}”, myObj);
} 使用SLF4J如果占位符参数是对象引用请参阅解决方案C3a / C3b则可以使用if来避免代码混乱。 因此使用以下内容是安全的 LOGGER.debug(“Obj{}”, myObj);5.例外 适当的异常日志记录是问题分析的重要支持但很容易忽略它的用处。 错误的方法 W5a. catch (SomeException ex) { LOGGER.error(ex);}..
W5b. catch (SomeException ex) { LOGGER.error(Error: ex.getMessage());}.. 正确方法 C5. catch (SomeException ex) { LOGGER.error(Read operation failed: id{}, idRecord, ex);}.. 一般规则 不要使用getMessage请参阅W5b而不是完整的异常来删除堆栈跟踪信息。 堆栈跟踪通常包括问题的真正原因很容易是底层代码引发的另一个异常。 仅记录消息将阻止我们发现问题的真正原因。 确实在日志消息中显示了重要的信息供将要分析日志文件的人员使用该信息显示了一个文本解释了在引发异常不是异常种类或诸如“错误”之类的消息时我们想要执行的操作我们已经知道有些不良情况发生了。 我们需要知道的是我们在做什么以及在哪些数据上。 C5示例告诉我们我们正在尝试读取具有特定ID的记录该ID的值已与消息一起写入日志。 请注意C5在格式字符串中使用一个占位符但是有两个附加参数。 这不是错误而是一种特殊的模式SLF4J将其识别为异常记录案例最后一个参数在C5示例中为ex被SLF4J视为Throwable异常因此不应将其包含在格式字符串中。 相关的FindBugsSLF4J插件检查 SLF4J_MANUALLY_PROVIDED_MESSAGE消息不应基于异常getMessage 翻译自: https://www.javacodegeeks.com/2016/02/tutorial-correct-slf4j-logging-usage-check.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83287.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!