日志记录的作用和方法

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

  • 怎样记日志可以方便Troubleshooting
  • 程序运行状态可以记哪些
  • 应该避免怎样的日志方式

怎样记日志可以方便Troubleshooting?

1. 对外部的调用封装

程序中对外部系统与模块的依赖调用前后都记下日志,方便接口调试。出问题时也可以很快理清是哪块的问题

 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);
 }  

2.状态变化

程序中重要的状态信息的变化应该记录下来,方便查问题时还原现场,推断程序运行过程

 boolean isRunning;  

 isRunning = true;
  LOG.info("System is running");  

  //...  

 isRunning = false;
  LOG.info("System was interrupted by " + Thread.currentThread().getName()); 

3.系统入口与出口:

这个粒度可以是重要方法级或模块级。记录它的输入与输出,方便定位

  void execute(Object input) {
      LOG.debug("Invoke parames : " + input);
      Object result = null;  

      //business logic

      LOG.debug("Method result : " + result);
  }  

4.业务异常:

任何业务异常都应该记下来:

 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);
  } 

5.非预期执行:

为程序在“有可能”执行到的地方打印日志。如果我想删除一个文件,结果返回成功。但事实上,那个文件在你想删除之前就不存在了。最终结果是一致的,但程序得让我们知道这种情况,要查清为什么文件在删除之前就已经不存在

  int myValue = xxxx;
  int absResult = Math.abs(myValue);
  if (absResult < 0) {
      LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
  }  

6.很少出现的else情况:

else可能吞掉你的请求,或是赋予难以理解的最终结果

  Object result = null;
  if (running) {
     result = xxx;
  } else {
     result = yyy;
     LOG.debug("System does not running, we change the final result");
  }  

程序运行状态可以记哪些?

程序在运行时就像一个机器人,我们可以从它的日志看出它正在做什么,是不是按预期的设计在做,所以这些正常的运行状态是要有的。

1. 程序运行时间:

 long startTime = System.currentTime();  

  // business logical  

  LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms"); 

2. 大批量数据的执行进度:

LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%"); 

3.关键变量及正在做哪些重要的事情:

执行关键的逻辑,做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
 }  

应该避免怎样的日志方式?

1. 混淆信息的Log

日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?

Connection connection = ConnectionFactory.getConnection();
 if (connection == null) {
     LOG.warn("System initialized unsuccessfully");
  }  

2. 记错位置

产品代码中,使用console记录日志,导致没有找到日志。

   } catch (ConfigurationException e) {
         e.printStackTrace();
    }

3. 记错级别

记错级别常常发生,常见的如:混淆代码错误和用户错误,如登录系统中,如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。

LOG.warn("Failed to login by "+username+");

4. 遗漏信息

这里可能包含两种情况:(1)用户自己少写了信息,导致毫无参考价值;(2)用户调用log的方式导致丢失信息,如下例,没有stack trace.

    } catch (Exception ex) {
       log.error(ex);
    }

总结:

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

时间: 2024-11-08 04:35:11

日志记录的作用和方法的相关文章

日志记录的作用和方法 java

程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态.好的日志记录方式可以提供我们足够多定位问题的依据.日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情.这里列举下面三个方面的内容,辅以代码示例,总结如何写好日志,希望对他人有所启发和帮助: 怎样记日志可以方便Troubleshooting 程序运行状态可以记哪些 应该避免怎样的日志方式 怎样记日志可以方便Troubleshooting? 1. 对外部的调用封装 程序中对外部系统与模块的依赖调用前

【学习笔记】开源日志记录工具log4j使用方法

一.在MyEclipse中使用log4j的步骤比较简单,主要分为以下四个步骤: 1.在项目中加入log4j所使用的jar文件. 2.创建log4j.properties文件. 3.编写log4j.properties文件,配置日志文件. 4.在程序中使用log4j记录日志信息. 二.日志根据记录内容的不同,主要分成以下三类: 1.SQL日志:记录系统执行的SQL语句. 2.异常日志:记录系统运行中发生的异常事件. 3.业务日志:记录系统运行过程,如用户登录.操作记录. 三.log4j的下载 要使

Apache日志不记录图片文件设置方法和来源日志的配置

Apache日志不记录图片文件设置方法 <FilesMatch "\.(ico|gif|jpg|swf)">SetEnv IMAG 1</FilesMatch>CustomLog logs/access_log combined env=!IMAG Apache日志,如果记录所有访问请求,文件会很大:如果使用日志分析软件,分析结果不一定准确.而且如果不安装cronolog工具来截断日志,会在一个整文件中,这样访问量一高,日志文件所占空间是可观的. 通过在http

转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常保存到数据库中,所以就到网上搜了下专门的日志记录工具,一搜果然很多,比如:log4net,NLog,EntLib Logging等等,但是还是log4net名气最大,所以就下载下来试用了一番,果然很方便,其涵盖了所有常用的日志记录方式具体的可以看下表: AdoNetAppender 将日志记录到数据

关于日志记录的总结

前段时间,公司的一个项目,需要做很多的数据接口和同步程序,于是就遇到了日志记录的问题,何时记录,如何记录,哪些要记哪些不用记等问题.针对日志记录的问题,经过一系列讨论,终于达成了统一的处理办法.解决了各个模块系统,不同的开发人员,日志记录不统一,随意的问题.今天终于抽出时间把这个问题总结并结合网络上的资料,进行整理. 为什么要记录日志 记录日志是调试程序,监视程序运行的一种重要的方式,主要有两个目的:bug的及时发现和定位,显示程序运行状态.正确详细的日志记录能够快速的定位问题.同样,通过查看日

介绍一个日志记录函数

框架的好处之一是有完整的日志记录系统,但都只是针对框架本身的,比如记录数据库调用信息,记录表单值和框架方法之间的参数和返回值等.但是如果项目之间涉及到跨平台,这个日志系统就显得微乎其微了.比如我之前参加的一个项目,主要是使用PHP来编写前段,包含几乎全部的业务逻辑,但是不需要操作数据库,因为操作数据库的所有事情都交给Java语言去实现了.而我们PHP组编写代码的其实只有6个人,但是给我们提供数据库操作的Java组就有30 多个人,按道理应该很容易将这个项目做出来.也只有经历过才觉得这之间的痛苦,

C#Log4net日志记录组件的使用

一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO . DEBUG.ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个可以看到和我们平常在调试应用程序的出错有点类似,在编译器中也会留下如错误.警告之类的提示信息,它们的错误级别不断的降低. 我们接着看Log4net的核心组成部分,Log4net主要由五个部分组成,分

Elmah 日志记录组件

[http://www.cnblogs.com/chenkai/archive/2013/01/26/2877855.html] 常在服务器端处理用户请求时.特别是针对Web应用程序.当出现异常是可以根据日志操作记录还原异常出现时操作步骤.而记录异常堆栈信息判断问题出现问题位置. 为了跟踪和记录服务器行为.特别是针对出现异常时构建简单.统一的异常处理模式就显得尤为重要. 如果有一个基础的架构用来记录服务器端中日志和事件.那么对于调试和在问题的解决就变得更加简单直接.针对日志记录.可能针对大部分开

Servlet过滤器-日志记录

一,什么是servlet过滤器? 过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或者 Servlet 容器. Servlet过滤器可以应用在客户机和 servlet 之间.servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间. 二,sevlet过滤器的作用 servlet过滤器用于根性进入servlet的请求和走出servlet的相应中的有效负载和头信息.过滤器不产生响应,他们只修改或适配请求和响应.servlet过滤器即filter可以认为是s