(转)http://www.infoq.com/cn/articles/why-and-how-log
程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态。好的日志记录方式可以提供我们足够多定位问题的依据。日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情。这里列举下面三个方面的内容,辅以代码示例,总结如何写好日志,希望对他人有所启发和帮助:
- 怎样记日志可以方便Troubleshooting
- 程序运行状态可以记哪些
- 应该避免怎样的日志方式
怎样记日志可以方便Troubleshooting?
1. 对外部的调用封装
程序中对外部系统与模块的依赖调用前后都记下日志,方便接口调试。出问题时也可以很快理清是哪块的问题
1. LOG.debug("Calling external system:" + parameters);
2. Object result = null;
3. try {
4. result = callRemoteSystem(params);
5. LOG.debug("Called successfully. result is " + result);
6. } catch (Exception e) {
7. LOG.warn("Failed at calling xxx system . exception : " + e);
8. }
2.状态变化
程序中重要的状态信息的变化应该记录下来,方便查问题时还原现场,推断程序运行过程
1. boolean isRunning;
2.
3. isRunning = true;
4. LOG.info("System is running");
5.
6. //...
7.
8. isRunning = false;
9. LOG.info("System was interrupted by " + Thread.currentThread().getName());
3.系统入口与出口:
这个粒度可以是重要方法级或模块级。记录它的输入与输出,方便定位
1. void execute(Object input) {
2. LOG.debug("Invoke parames : " + input);
3. Object result = null;
4.
5. //business logic
6.
7. LOG.debug("Method result : " + result);
8. }
4.业务异常:
任何业务异常都应该记下来:
1. try {
2. //business logical
3. } catch (IOException e) {
4. LOG.warn("Description xxx" , e);
5. } catch (BusinessException e) {
6. LOG.warn("Let me know anything");
7. } catch (Exception e) {
8. LOG.error("Description xxx", e);
9. }
10.
5.非预期执行:
为程序在“有可能”执行到的地方打印日志。如果我想删除一个文件,结果返回成功。但事实上,那个文件在你想删除之前就不存在了。最终结果是一致的,但程序得让我们知道这种情况,要查清为什么文件在删除之前就已经不存在
1. int myValue = xxxx;
2. int absResult = Math.abs(myValue);
3. if (absResult < 0) {
4. LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
5. }
6.很少出现的else情况:
else可能吞掉你的请求,或是赋予难以理解的最终结果
1. Object result = null;
2. if (running) {
3. result = xxx;
4. } else {
5. result = yyy;
6. LOG.debug("System does not running, we change the final result");
7. }
程序运行状态可以记哪些?
程序在运行时就像一个机器人,我们可以从它的日志看出它正在做什么,是不是按预期的设计在做,所以这些正常的运行状态是要有的。
1. 程序运行时间:
1. long startTime = System.currentTime();
2.
3. // business logical
4.
5. LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms");
2. 大批量数据的执行进度:
1. LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");
3.关键变量及正在做哪些重要的事情:
执行关键的逻辑,做IO操作等等
1. String getJVMPid() {
2. String pid = "";
3. // Obtains JVM process ID
4. LOG.info("JVM pid is " + pid);
5. return pid;
6. }
7.
8. void invokeRemoteMethod(Object params) {
9. LOG.info("Calling remote method : " + params);
10. //Calling remote server
11. }
应该避免怎样的日志方式?
1. 混淆信息的Log
日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?
1. Connection connection = ConnectionFactory.getConnection();
2. if (connection == null) {
3. LOG.warn("System initialized unsuccessfully");
4. }
2. 记错位置
产品代码中,使用console记录日志,导致没有找到日志。
1. } catch (ConfigurationException e) {
2. e.printStackTrace();
3. }
3. 记错级别
记错级别常常发生,常见的如:混淆代码错误和用户错误,如登录系统中,如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。
1. LOG.warn("Failed to login by "+username+");
4. 遗漏信息
这里可能包含两种情况:(1)用户自己少写了信息,导致毫无参考价值;(2)用户调用log的方式导致丢失信息,如下例,没有stack trace.
1. } catch (Exception ex) {
2. log.error(ex);
3. }
总结:
日志记录在程序员日常编程实践中必须面对的事情,本文针对这个话题谈了下自己的体会,希望读者能有所收益。多有不足,请多包涵。
参考文献
http://www.infoq.com/cn/articles/10-java-questions-easy-to-ignore
分享到:
相关推荐
然而,传统的日志记录方法往往存在速度慢和在程序崩溃时容易丢失信息的问题。本文提出了一种利用内存映射文件API来优化日志记录效率的方法,旨在解决这两个问题。 #### 重要性 在Windows平台上进行程序开发时,确保...
在LabVIEW中,"logger"通常指的是日志记录功能,用于捕获和存储程序运行时的各种信息,如变量值、错误信息、事件触发等,这对于调试、优化和分析程序行为至关重要。 日志记录在LabVIEW中的实现可以通过自定义VI...
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款强大的图形化编程环境,被广泛应用于测试、测量和控制...通过学习和掌握日志记录技术,开发者能够提升问题解决效率,确保软件系统的稳定运行。
在VB(Visual Basic)编程中,日志记录是一项重要的任务,它可以帮助开发者追踪程序运行时的状态,便于调试和问题排查。本主题将详细介绍如何使用VB来编写简单的日志记录功能,特别是结合ListView控件实现这一功能。...
在Android平台上,GPS日志记录程序是一个非常实用的工具,它可以帮助用户收集和分析设备的地理位置数据。这个“Android Gps日志记录程序源码”提供了实现这一功能的完整代码,对于开发者来说,是一个很好的学习和...
4. 开启和关闭日志记录: 在实际操作中,你可能只希望在特定情况下开启日志记录。在会话选项中,可以设置日志记录的开关,例如在出现问题时开启,问题解决后关闭。这样可以避免不必要的日志数据积累,同时确保关键...
日志记录: 日志记录在程序设计开发过程中,是非常重要的,可以供调试和记录数据,虽然说有开源的强大日志管理系统,比如apache的Log4Net,功能可谓强悍,但是有时候,不需要这么大的日志,只需要显示和文件记录就...
在这个"LabVIEW日志记录实时更新模块.zip"中,我们有两个关键的VI(虚拟仪器):main.vi和updateInfo.vi,它们是实现日志记录功能的核心部分。 1. **main.vi**:这是整个系统的主程序,通常它会负责协调和控制其他...
描述中提到的"可以记录程序运行中的错误"进一步强调了日志框架在跟踪和诊断问题上的作用。错误不一定是异常,但它们可能导致程序行为不符合预期。例如,输入验证失败、资源获取失败等都可能产生错误日志。通过日志...
该类能够将日志信息同时输出到控制台和指定的日志文件中,并支持不同的日志级别,以便于调试和监控应用程序的运行状态。 特性 1.日志级别映射: 提供了从数字到实际日志级别的映射,包括调试 (DEBUG)、信息 (INFO)、...
在IT行业中,日志记录是软件开发和系统运维不可或缺的一部分。...总之,"应用程序日志记录log.zip"是理解和维护应用程序的关键资源,它记录了程序运行的足迹,是排查问题、优化性能、确保系统稳定的重要依据。
日志记录是软件开发中的一个关键实践,它允许开发者记录程序运行时的各种事件,如错误、警告、信息和调试消息。在Delphi中,实现日志记录通常涉及以下几个步骤: 1. **选择日志框架**:首先,你需要选择或创建一个...
在C++编程中,多线程日志记录是一种常见的需求,特别是在高并发和实时性要求高的系统中。本文将深入探讨如何使用C++实现多线程日志记录,包括涉及的关键概念、技术以及如何通过提供的文件`log.cpp`、`log.h`和`...
《MyLoger 自动提醒日志记录程序》是一款小巧实用的个人日志管理工具,专为需要定期记录工作或生活琐事的用户设计。这款软件的核心功能在于定时提醒用户记录日志,并能将记录的内容自动保存为易于查看的TXT文本格式...
本文将详细讲解如何使用 FireDAC 的 Delta 功能来记录操作日志以及如何将 Delta 转换为 SQL 语句,这对于数据库的版本控制、数据审计和错误恢复具有重要意义。 首先,让我们了解什么是 Delta。在 FireDAC 中,Delta...
日志记录通常包含时间戳、日志级别、线程信息、调用者信息、日志消息等内容。合理的格式化能让日志更易读,也方便后期分析。 4. **日志存储**: 日志可以存储在本地文件、数据库、云存储服务,甚至通过网络发送到...
在C++编程中,记录日志到文件是一个重要的任务,特别是在开发复杂系统或者进行调试时。日志系统可以帮助我们追踪程序运行过程中的错误、...然而,理解日志记录的基本原理对于调试和优化自己的日志系统仍然十分有价值。
在ASP.NET开发中,记录错误日志是一项至关...最后,结合实际需求选择合适的方法或库,并进行适当的定制和扩展,以满足项目特定的日志记录需求。通过有效的错误日志管理,可以极大地提高开发效率和应用程序的稳定性。
在VC++编程环境中,日志记录是至关重要的一个环节,它可以帮助开发者跟踪程序运行状态,定位和解决问题。本文将详细探讨“VC日志记录类”的实现及其特点,以`LogFile.cpp`和`LogFile.h`两个文件为核心,我们将深入...
本文将深入探讨“系统启动记录日志”这一主题,包括日志的作用、日志记录的层次、日志类型以及如何分析和利用日志来优化系统启动。 首先,日志记录的主要目的是为了监控系统的运行状态,尤其是在系统启动过程中,...