5条Java记录规则

日志记录是一个关键因素,在软件开发过程中应始终将其考虑在内。

当生产中发生不良情况时,日志文件通常是我们进行故障分析的起点。 而且,通常,它们是我们掌握的唯一信息,可以了解发生了什么以及问题的根本原因。

正确记录所需的信息非常重要。

以下五个日志记录规则是一种检查方法,可能会改善我们处理代码中日志记录的方式。

请注意,我们不会讨论如何配置日志记录引擎,也不会将它们相互比较。

规则1.日志适用于读者

日志消息对谁将读取日志文件有意义,而不仅对谁编写了(日志)代码有意义。

这似乎是很明显的规则,但经常被违反。

例如,让我们考虑类似以下ERROR: Save failure - SQLException .....的日志消息ERROR: Save failure - SQLException .....

保存什么? 该消息可能对开发人员来说意味着什么,但对于正在考虑生产问题的可怜人来说却完全没有用。

更好的消息是ERROR: Save failure- Entity=Person, Data=[id=123 surname="Mario"] - SQLException....

其中说明了您要保存的内容(这里是一个Person,一个JPA实体)以及Person实例的相关内容。 请注意“ relevant ”一词,而不是“ all all” :我们不应该使日志文件杂乱无章的信息,如所有实体字段的完整打印。 实体名称及其逻辑键通常足以识别表中的记录。

规则2.使日志记录级别与执行环境匹配

Java生态系统中可用的所有日志记录外观和引擎都具有日志记录级别(ERROR,INFO…)的概念,并且有可能过滤掉级别太低的消息。

例如, Java util日志记录使用以下级别:SEVERE,WARN,INFO,FINE,FINER,FINEST(+ CONFIG和OFF)。

相反,两个最受欢迎的日志记录外观Apache Commons Logging和SLFJ首选以下级别:FATAL,ERROR,WARN,INFO,DEBUG,TRACE。

日志记录级别过滤应取决于代码的开发阶段:生产中的日志记录级别不应与测试/集成环境中的日志记录级别相同。

此外,日志记录级别还应该取决于代码所有者 。 通常,与我们使用的任何第三方库相比,我们自己的应用程序代码应具有更详细的日志记录。 例如,在我们的日志文件中查看Apache Commons调试消息没有太大的意义。

我通常将日志记录配置如下:

  • 生产 :我的代码为INFO级别,第三方库为WARN。
  • 测试/集成 :我的代码的调试级别,以及第三方库的警告(或信息,如果需要)。
  • 发展 :任何有意义的

注意:我个人不鼓励使用TRACE / FINEST级别(而且我并不孤单,例如,请参见此处 )。 我看不出DEBUG和TRACE之间有什么大的区别,对于年轻的团队成员来说,通常很难决定要使用DEBUG还是TRACE。 遵循Kiss原则 ,我建议仅使用ERROR,WARN,INFO和DEBUG级别。

规则3.提交前删除编码帮助日志。

在编码时,我们通常使用loggerSystem.out在我们的代码中添加日志消息,以更好地了解执行/调试会话期间应用程序中正在发生的事情。

就像是:

void aMethod(String aParam) {LOGGER.debug(“Enter in aMethod”);if (“no”.equals(aParam)) {LOGGER.debug(“User says no”);….

这些消息的主要目的是通过显示调用哪个方法以及转储内部变量和方法参数值来跟踪应用程序行为。 在非TDD爱好者中颇受欢迎。

不幸的是,一旦代码发布(测试然后生产),这些消息通常没有什么大的意义。

因此,该规则只是说:一旦完成开发,就在将代码提交给使用的SCM系统(git,svn ..)之前,删除所有临时和不必要的日志记录消息。

该规则不需要删除所有DEBUG消息,而仅删除那些在应用程序完成并释放后没有任何意义的消息。 换句话说,当我们合理确定应用程序正常运行时。

规则4:在记录DEBUG消息之前检查日志级别

根据规则2,在生产日志中,我们将仅显示ERROR,WARN,INFO消息,但是在我们的代码中,我们可以具有许多不影响生产执行的DEBUG消息。

每次您要记录DEBUG消息(规则3之后的所有消息)时,请在前面添加检查是否启用了DEBUG记录:

if ( LOGGER.isDebugEnabled() ) {LOGGER.debug (…….)}

这将防止您编写代码来构建日志消息并调用记录器。 这是为了提高生产中程序的执行效率。

规则5:了解您的记录器

我们如何使用记录器方法会产生巨大的成本:

  • 构建消息字符串
  • 收集要包含在消息字符串中的数据

我们应该查看所选日志外观/引擎的Javadoc ,并了解使用其记录器的最有效方法。

例如,我们可以创建如下消息:

LOGGER.info(“Person name is “ + person.getName());

这会创建不必要的字符串实例。

使用SLF4J,正确的用法是:

LOGGER.info(“Person name is {}“, person.getName());

其中格式字符串是常量,并且仅在启用日志记录后才生成最终消息。 有关更多详细信息,请参见此处 。

翻译自: https://www.javacodegeeks.com/2015/12/5-java-logging-rules.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 离线安装中文字库,centos7 离线安装字体fontconfig

起因:最近做了个flowable然而linux下乱码,发现需要安装字体包在线:直接 yum -y install fontconfig;yum -y install ttmkfdir;配置下即可。拓展:离线所需rpm包如何获取?百度不好找,找…

锁定机制和数据并发管理(笔记)

共享锁和排它锁 排它锁:当某一个会话正在更新某一行,为了防止其他会话修改这一行,这行会被锁定这种锁称为排他锁。被排他锁锁定的行仍然可以被其他会话读取。 共享锁:在一个表上放置共享锁的目的是为了防止其他会话获得这个表上的…

linux防火墙配置说明,Linux防火墙配置命令参数说明

规则操作参数说明:-A:在所选择的链末添加一条或更多规则;-D:从所选链中删除一条或更多规则。有两种方法:把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则;-R:从…

【react.js + hooks】useGuide 创建用户引导视图

有的时候用户可能对网站上的一些操作流程感到困惑,这时候我们需要为用户创建引导视图。为了插入指引而专门去更改组件的渲染函数,显然是不合逻辑的,创建指引视图应该是一种对源代码低侵入的行为,我们可以遵循某一套约定&#xff0…

使用递归算法结合数据库解析成java树形结构

使用递归算法结合数据库解析成java树形结构 1、准备表结构及对应的表数据a、表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b、表数据: insert into tb_tree (CID, CNAME, PID) values (1, 中国, 0);…

ug11 linux,UG11.0升级包MP02Win#Linux系统下载就上UG网

UG11.0软件又出升级包啦!抽空可以为NX升级啦,从11.0发布到现在,近三个月了,每一次版本的更新,都会带来较多功能的改善,以及对错误BUG的有效处理,下图为升级后的UG11.0软件;UG11.0升级…

akka 异常处理_使用Akka处理1000万条消息

akka 异常处理Akka演员承诺并发。 有什么更好的模拟方法,看看使用商品硬件和软件处理1000万条消息需要花费多少时间,而无需进行任何低级调整。我用Java编写了整个1000万条消息的处理过程,整个结果令我惊讶。 当我在具有i5 – 4核心&#xff0…

20155330 2016-2017-2 《Java程序设计》第五周学习总结

20155330 2016-2017-2 《Java程序设计》第五周学习总结 教材学习内容总结 学习目标 理解异常架构掌握try...catch...finally处理异常的方法会用throw,throws理解Collection和Map架构会用常见的数据结构和算法了解Lambada和泛型第八章 章节主要内容 小结 Throwwable定义了取错误…

yum安装odbc驱动linux,在CentOS上离线配置PostgreSQL ODBC数据源

一、问题提出内网的一台CentOS服务器,需配置PostgreSQL ODBC。如果可以连接Internet,此工作很容易,使用yum install自动安装相应依赖包后简单配置即可。但当置于内网环境时,事情就有些麻烦,需要事先手工下载各个依赖包…

树形dp小胖守皇宫(vijosP1144)

题目链接:https://vijos.org/p/1144 题解:这道题的动归稍稍有一点的复杂,因为一个节点有可能被它的子节点观察,也有可能被父节点观察; 所以我们这样表示: f[i][0](表示当前i节点放了一个看守&am…

微服务和Java EE

基于微服务的架构如今无处不在。 我们对Netflix和Amazon等当今的创新者如何利用它们在成功产生更多业务方面取得更大的成功了解到很多。 但是,我们所有人都在使用Java EE应用程序服务器并编写经典系统吗? 我们都做错了吗? 我们如何使我们的技…

pcie组raid linux,PCIe 4.0有多强大?组RAID 0阵列之后惊呆了

技嘉在6月16日21:00正式上市了全系列B550系列主板,B550系列主板属于AMD中端系列芯片组,能原生支持PCIe 4.0技术,而这次技嘉B550 AORUS MASTER主板更是不得了,提供了3个支持PCIe 4.0技术的M.2接口,你还可以组RAID 0阵列…

oracle中 trunc(),round(),ceil(),floor的使用

原文: http://www.2cto.com/database/201310/248336.html 1.round函数(四舍五入) 描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果参数: number : 欲处理之数值 decimal_places : 四舍五入 , 小数取几位 ( 预设为 0…

Java中的指针

Java中是否有指针? 简短的答案是“不,没有”,这对于许多开发人员来说似乎是显而易见的。 但是,为什么对其他人却不那么明显呢? http://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-java http://…

Android实践 -- 监听应用程序的安装、卸载

监听应用程序的安装、卸载 在AndroidManifest.xml中注册一个静态广播,监听安装的广播android.intent.action.PACKAGE_ADDED 监听程序卸载的广播android.intent.action.PACKAGE_REMOVED ,在广播中一定要加上 <data android:scheme"package" /> 不然就监听不到 &…

符合c语言常量12abc,《C语言》试题abc合2006上.doc

《C语言》试题abc合2006上《c语言》试题(A)一、单项选择题(每小题2分&#xff0c;共20分)以下选项中正确的整型常量是 BA)12. B) -20 C) 1,000 D) 4 5 62.以下选项中不合法的用户标识符是 AA)abc.c B)file C)Main D)PRINT3&#xff0e;可在C 程序中用作用户标识符的标识符是 BA…

redis学习之——redis.conf配置(基本)文件学习

# Redis configuration file example# Note on units: when memory size is needed, it is possible to specify //1 配置大小单位,开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit …

如何把c语言程序的数据导出到文档,急求如何将下列C语言程序数据存储到文件中?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

weblogic最大线程_处理Weblogic卡住的线程

weblogic最大线程定义或什么是缠线&#xff1f; 如果线程 在设定 的时间 内连续工作&#xff08;非空闲&#xff09;&#xff0c;则WebLogic Server会将其诊断为阻塞 。 您可以通过更改在诊断出线程被阻塞之前的时间长度&#xff08; Stuck Thread Max Time &#xff09;&#…

步进电机的正反向旋转c语言编程,实现步进电机自动正反转程序怎么写

本文收集整理关于实现步进电机自动正反转程序怎么写的相关议题&#xff0c;使用内容导航快速到达。内容导航&#xff1a;Q1&#xff1a;用c语言程序实现步进电机的正反转加减速的编程内容&#xff1a;1、本程序用于测试4相步进电机常规驱动2、需要用跳帽或者杜邦线把信号输出端…