`

日志记录的作用和方法

    博客分类:
  • java
 
阅读更多
程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态。好的日志记录方式可以提供我们足够多定位问题的依据。日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情。这里列举下面三个方面的内容,辅以代码示例,总结如何写好日志,希望对他人有所启发和帮助:
相关厂商内容

SpringOne首次空降中国·北京Spring&CloudFoundry,12月7~8日,限额免费报名中

QCon北京2013(4月25日~27日),18项精彩专题,现已启动,详情请点击

QCon北京2013(4月25日~27日),海外著名讲师确认,现已六折报名中

创业者之翼为创业新星免费提供甲级办公场所,详情请点击

天地行讲师龚书专访——基于AS3显示列表的2d游戏渲染优化
相关赞助商

SpringOne大会于12月7~8号首次落户北京,免费限额报名中,了解详情!

    怎样记日志可以方便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.  }

总结:

日志记录在程序员日常编程实践中必须面对的事情,本文针对这个话题谈了下自己的体会,希望读者能有所收益。多有不足,请多包涵。
分享到:
评论

相关推荐

    CRT 记录日志设置方法(1) - 副本.docx

    在CRT中设置日志记录的方法主要分为两个步骤:配置全局选项和配置会话选项。以下是详细的设置步骤: 1. 配置全局选项: 打开CRT软件,进入“选项”菜单,选择“全局选项”。在这个界面,你会看到一系列可以自定义...

    日志记录组件

    这个名为“日志记录组件”的项目,包含了一些核心文件,我们可以逐一解析它们的作用: 1. **reg.bat**:这是一个批处理文件,通常用于执行一系列命令行操作,比如注册动态链接库(DLL)到系统。在这个场景中,可能...

    网络游戏-无线网络控制器日志记录系统及其方法.zip

    《网络游戏-无线网络控制器日志记录系统及其方法》 在当今的网络游戏环境中,无线网络控制器起着至关重要的作用。它们负责管理和协调网络资源,确保玩家能够流畅地进行游戏。本资料详细介绍了无线网络控制器日志...

    非常简单实用的日志记录软件,按天存放为txt文本

    在IT行业中,日志记录是不可或缺的一个环节,它对于软件的调试、监控和问题排查具有重要作用。"非常简单实用的日志记录软件,按天存放为txt文本" 是一种常见的日志管理方式,它便于我们组织和查找日志信息。下面我们...

    安卓日志分析崩溃拦截相关-日志记录开源项目使用方法见说明.zip

    本资源"安卓日志分析崩溃拦截相关-日志记录开源项目使用方法见说明.zip"提供了一个开源的日志记录工具,旨在帮助开发者更有效地收集和分析日志,以及拦截应用崩溃情况。 1. **日志记录**: 在Android系统中,开发者...

    JAVA实现通用日志记录方法

    在软件开发领域,日志记录是不可或缺的一环,它对于程序的监控...随着技术的不断进步,日志记录的方法和工具也在不断地更新迭代,作为开发者,我们需要不断地学习和掌握这些新工具和新方法,以提高我们开发的软件质量。

    oracle数据库日志查看方法

    通过上述介绍,我们了解了Oracle数据库中几种主要日志文件的作用及其查看方法。这些日志对于维护数据库系统的稳定性和解决故障具有重要意义。实际操作中,根据具体需求灵活运用上述方法,可以有效提高问题解决效率。...

    Win7操作系统配置管理IIS日志记录的方法.docx

    Win7操作系统配置管理IIS日志记录的方法 IIS日志记录对于任何一个服务器来说都是至关重要的。在Windows7操作系统中,对于IIS日志记录来说有了很大的改进。不仅仅是日志的格式,还是其他的一些可选项上,操作系统...

    强大的日志框架,能记录程序中出现的异常

    此外,它们还支持多线程环境,确保在并发情况下日志记录的正确性和一致性。 日志框架通常具有以下几个关键特性: 1. **日志级别**:允许设置不同的日志级别,便于筛选需要关注的信息。 2. **日志定位**:通过类名、...

    一种基于linux内核的日志记录方法及系统.docx

    本发明提出了一种基于Linux内核的日志记录方法及系统,通过对日志记录流程的优化,实现了不同应用程序日志信息的有效分离,极大地提高了日志管理的便捷性和问题排查的效率。这对于大型服务器集群环境下的日志管理尤...

    Log4j使用手册 日志记录包

    Log4j是一个强大的日志记录框架,它为Java应用程序提供了灵活的日志记录机制。通过合理配置Logger、Appender和Layouts,开发者可以有效地管理和控制日志输出,从而提高程序的可维护性和调试效率。此外,通过对日志...

    SpringMVC 写操作日志

    在IT行业中,SpringMVC和AOP(面向切面编程)是两个非常重要的概念,尤其在企业级Web应用开发中广泛...在实际项目中,这样的日志记录方案能够帮助我们追踪和分析系统的运行状态,对问题排查和性能优化具有重要作用。

    设计模式—工厂方法模式

    3. `DatabaseLoggerFactory.cs`和`FileLoggerFactory.cs`:这两个类是`LoggerFactory`的具体实现,分别代表数据库日志记录器工厂和文件日志记录器工厂。它们继承自`LoggerFactory`,并实现了`CreateLogger()`方法,...

    常用的清除日志方法

    4. 修改系统配置:可以通过修改服务设置,暂时停止日志记录服务,然后删除日志文件,但这种方法可能会影响系统的正常运行。 5. 外部工具:有些第三方软件提供日志清理功能,可以安全地清除或压缩日志,同时不会影响...

    Delphi FireDac Delta 记录操作日志 与 Delta转SQL

    本文将详细讲解如何使用 FireDAC 的 Delta 功能来记录操作日志以及如何将 Delta 转换为 SQL 语句,这对于数据库的版本控制、数据审计和错误恢复具有重要意义。 首先,让我们了解什么是 Delta。在 FireDAC 中,Delta...

    windows下高效的c/c++日志记录

    在这篇文章中,我们将深入探讨如何在Windows环境下高效地使用C/C++进行日志记录,以及这两个库的作用和使用方法。 首先,`log.dll` 是一个动态链接库,它包含预编译的函数和代码,用于实现日志功能。当程序运行时,...

    施工日志和安全日志记录文稿填写规范方案.doc

    施工日志和安全日志是建筑工程施工管理中至关重要的文档,它们详实记录了工程的进度、质量和安全状况,对于工程的监督、检查和后期分析具有不可替代的作用。 首先,施工日志的填写规范要求明确,必须按照单位工程...

    记事本,用来给开发者记录日志、资料等

    首先,作为最基础的文本记录工具,记事本在记录开发日志、资料和代码方面发挥了重要作用。开发日志是软件开发过程中不可或缺的组成部分。它记录着开发者的工作进度、遇到的困难、解决问题的方法以及对程序改进的思考...

    日志规范和级别

    log4j 框架是实现日志规范和级别的不错的选择,它提供了灵活的日志记录机制,能够满足不同的日志记录需求。通过使用 log4j,我们可以轻松地实现日志的记录、分析和管理,提高程序的可靠性和稳定性。

    西门子SS7-1200 PLC数据日志功能的应用.pdf

    文章主要探讨了西门子S7-1200可编程逻辑控制器(PLC)在数据日志记录方面的作用及其应用优势。随着工业自动化与信息化的不断深入,PLC已成为控制系统的核心组件。PLC不仅能够采集工艺与仪表测量数据,还能进行数据...

Global site tag (gtag.js) - Google Analytics