程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态。好的日志记录方式可以提供我们足够多定位问题的依据。
这周看过很多代码,对里面的日志记录方式有些想法,今天是周末,也想总结下我对这个问题的看法。日志记录大家都会认为简单,但如何通过日志可以高效定位问题可不是简单的事情。这里我会写下面三个方面的内容,主要是举例为主,提醒我以后得注意这些方面
- 怎样记日志可以方便Troubleshooting
- 程序运行状态可以记哪些
- 应该避免怎样的日志方式
方便Troubleshooting的日志:
对外部的调用封装:
程序中对外部系统与模块的依赖调用前后都记下日志,方便接口调试。出问题时也可以很快理清是哪块的问题
LOG.debug("Calling external system:" + parameters);
Object result = null;
try {
result = callRemoteSystem(params);
LOG.debug("Called successfully. result is " + result);
} catch (Exception e) {
LOG.warn("Failed at calling xxx system . exception : " + e);
}
状态变化:
程序中重要的状态信息的变化应该记录下来,方便查问题时还原现场,推断程序运行过程
boolean isRunning;
isRunning = true;
LOG.info("System is running");
//...
isRunning = false;
LOG.info("System was interrupted by " + Thread.currentThread().getName());
系统入口与出口:
这个粒度可以是重要方法级或模块级。记录它的输入与输出,方便定位
void execute(Object input) {
LOG.debug("Invoke parames : " + input);
Object result = null;
//business logical
LOG.debug("Method result : " + result);
}
业务异常:
任何业务异常都应该记下来
try {
//business logical
} catch (IOException e) {
LOG.warn("Description xxx" , e);
} catch (BusinessException e) {
LOG.warn("Let me know anything");
} catch (Exception e) {
LOG.error("Description xxx", e);
}
void invoke(Object primaryParam) {
if (primaryParam == null) {
LOG.warn("Why this primary param is null?");
return;
}
}
非预期执行:
为程序在“有可能”执行到的地方打印日志。如果我想删除一个文件,结果返回成功。但事实上,那个文件在你想删除之前就不存在了。最终结果是一致的,但程序得让我们知道这种情况,要查清为什么文件在删除之前就已经不存在呢
int myValue = xxxx;
int absResult = Math.abs(myValue);
if (absResult < 0) {
LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
}
很少出现的else情况:
else可能吞掉你的请求,或是赋予难以理解的最终结果
Object result = null;
if (running) {
result = xxx;
} else {
result = yyy;
LOG.debug("System does not running, we change the final result");
}
程序运行状态
程序在运行时就像一个机器人,我们可以从它的日志看出它正在做什么,是不是按预期的设计在做,所以这些正常的运行状态是要有的。
程序运行时间:
long startTime = System.currentTime();
// business logical
LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms");
大批量数据的执行进度:
LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");
关键变量及正在做哪些重要的事情:
执行关键的逻辑,做IO操作等等
String getJVMPid() {
String pid = "";
// Obtains JVM process ID
LOG.info("JVM pid is " + pid);
return pid;
}
void invokeRemoteMethod(Object params) {
LOG.info("Calling remote method : " + params);
//Calling remote server
}
避免的日志方式
无意义的Log:
日志不包含有意义的信息: 你肯定想知道的是哪个文件不存在吧
File file = new File("xxx");
if (!file.isExist()) {
LOG.warn("File does not exist"); //Useless message
}
混淆信息的Log:
日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?
Connection connection = ConnectionFactory.getConnection();
if (connection == null) {
LOG.warn("System initialized unsuccessfully");
}
分享到:
相关推荐
【程序设计方法学】是软件开发中的核心概念,它涵盖了如何高效、有序地构建和维护软件系统的一系列原则和技巧。在早期的计算机时代,由于硬件资源有限,程序员需要极其注重程序的运行效率,常常采用各种技巧来节省...
面试中的闲谈技巧,好的闲谈是敲门砖
### 闲谈嵌入式编程的复杂性 #### 嵌入式编程的入门与挑战 嵌入式编程是一项技术密集型的工作,它涉及到软件与硬件的紧密结合。文章提到,很多从事嵌入式编程的工程师往往是从自动化或电子等相关专业转型而来,这...
"JS调用XML的结合的闲谈"这个主题涵盖了JavaScript与XML的集成,以及它们在实际项目中的应用。这篇总结将深入探讨如何通过JavaScript操作XML文档,提取、修改和展示数据。 首先,XML(eXtensible Markup Language)...
5. 驱动程序设计:嵌入式编程中,驱动程序设计需要开发人员具备深入的编程知识和实践经验。驱动程序设计需要考虑代码与内核的结合,避免了频繁关闭中断造成的中断代码执行不及时,产生的信息丢失。 6. 嵌入式系统...
《春末闲谈》是鲁迅先生的一篇散文,收录在苏教版高中语文选修教材《现代散文选读》中。这篇文章通过闲谈的形式,深入浅出地探讨了统治者与被统治者之间的矛盾,以及封建统治者所采用的麻痹民众的手段。以下是该文的...
在这个标题为“闲谈工厂模式”的讨论中,博主可能分享了关于工厂模式的一些深入见解、实际应用以及与其他设计模式的对比。 工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的具体类决定实例化哪个类...
在Java中,实现原型模式通常涉及`java.lang.Cloneable`接口以及重写`Object`类中的`clone()`方法。`Cloneable`接口是一个标记接口,表明一个类可以被克隆。而`clone()`方法则负责执行实际的克隆操作。值得注意的是,...
SEM优化:品牌词管理闲谈(下).doc
本文将基于“开发经验,PCB布板闲谈”的主题,详细介绍PCB设计中的关键知识点和技术细节。 #### 二、PCB设计基础 PCB设计是电子产品设计的重要组成部分,涉及到信号完整性、电源完整性、电磁兼容性(EMI)等多个方面...
这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...
Photoshop调色教程:闲谈LAB模式计算调色详解 Photoshop调色教程:闲谈LAB模式计算调色详解是一篇详细的Photoshop调色教程,旨在帮助读者深入了解LAB模式计算调色的原理和应用。 LAB 模式的概念 LAB 模式是一种...
在互联网世界中,Web图片服务器扮演着至关重要的角色。它们负责存储、管理和分发网站所需的图像资源,确保用户能够快速、高效地加载和查看图片。本文将深入探讨Web图片服务器的相关知识点,帮助你理解其工作原理、...
演讲稿:静坐常思己过,闲谈莫论人非_演讲稿.pdf
它是国民经济核算体系中最核心的指标之一。GDP的计算通常有三种方法:生产法、收入法和支出法。 生产法计算GDP主要是加总所有最终产品和服务的市场价值,包括三个部分:消费(C)、投资(I)和政府支出(G)。投资...
现代社会中,面子仍然是人们生活的重要组成部分,比如酒桌文化中的面子较量,有时会带来不必要的麻烦。如李启明酒驾事件,他因维护父亲的面子而触犯法律,最终得不偿失。 然而,适时丢弃面子有时也是一种智慧。越王...
在酒店管理合同的谈判过程中,业主需要采取一系列策略和战术以确保自身利益的最大化。谈判并非单纯的讨价还价,而是基于信息收集、心态调整、目标设定和时间管理等多个层面的综合较量。以下将详细阐述这些关键点。 ...
压缩包包含:PC端工具(如需源码闲谈)、IAP例程(不用改)、APP例程(STM32应用部分的程序,根据自己的工程自行修改)、CAN模块USB驱动。 这套程序可以对并联到总线上指定ID的单片机实现IAP升级。 这套工具经本人开发,...
闲谈 我奇妙的Nuxt.js项目 构建设置 # install dependencies $ npm run install # serve with hot reload at localhost:3000 $ npm run dev # build for production and launch server $ npm run build $ npm run ...
Photoshop调色教程中提到的“LAB模式”是一种与设备无关的颜色模型,它模拟了人眼对颜色的感知,包含了所有人类能看见的颜色。在LAB模式下,图像由一个明度通道和两个颜色通道(a通道和b通道)组成。明度通道负责...