日志记录的作用和方法 java

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

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

怎样记日志可以方便Troubleshooting?

1. 对外部的调用封装

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

[java] view plain copy

  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.状态变化

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

[java] view plain copy

  1. boolean isRunning;
  2. isRunning = true;
  3. LOG.info("System is running");
  4. //...
  5. isRunning = false;
  6. LOG.info("System was interrupted by " + Thread.currentThread().getName());

3.系统入口与出口:

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

[java] view plain copy

  1. void execute(Object input) {
  2. LOG.debug("Invoke parames : " + input);
  3. Object result = null;
  4. //business logic
  5. LOG.debug("Method result : " + result);
  6. }

4.业务异常:

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

[java] view plain copy

  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. }

5.非预期执行:

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

[java] view plain copy

  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可能吞掉你的请求,或是赋予难以理解的最终结果

[java] view plain copy

  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. 程序运行时间:

[java] view plain copy

  1. long startTime = System.currentTime();
  2. // business logical
  3. LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms"); 

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

[java] view plain copy

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

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

执行关键的逻辑,做IO操作等等

[java] view plain copy

  1. String getJVMPid() {
  2. String pid = "";
  3. // Obtains JVM process ID
  4. LOG.info("JVM pid is " + pid);
  5. return pid;
  6. }
  7. void invokeRemoteMethod(Object params) {
  8. LOG.info("Calling remote method : " + params);
  9. //Calling remote server
  10. }

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

1. 混淆信息的Log

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

[java] view plain copy

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

2. 记错位置

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

[java] view plain copy

  1. } catch (ConfigurationException e) {
  2. e.printStackTrace();
  3. }

3. 记错级别

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

[java] view plain copy

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

4. 遗漏信息

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

[java] view plain copy

    1. } catch (Exception ex) {
    2. log.error(ex);
    3. }
时间: 2024-10-29 05:17:23

日志记录的作用和方法 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的下载 要使

巧用CurrentThread.Name来统一标识日志记录(java-logback篇)

java版本支付中心,日志组件使用的是logback.logback.xml里日志pattern配置如下: <!--本地日志目录--> <property name="USER_HOME" value="${catalina.base}/logs/logback-srv" /> <property name="LOG_MSG" value="%X{sid}%d{yyyy-MM-dd HH:mm:ss.SSS

Spring Boot 之日志记录

Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, log4j2, logback, slf4j 日志格式 控制台输出 彩色打印 文件输出 日志级别 日志组 日志配置文件 Spring Boot 中的日志配置 源码 引申和引用 Spring Boot 内部日志全部使用 Commons Logging 记录,但保留底层日志实现.为 Java Util

Java学习-007-Log4J 日志记录配置文件详解及实例源代码

此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-1-30 13:54:02,请知悉. 所需的 jar 包下载链接为:http://yunpan.cn/cKE56sxqtQCfP  访问密码 63d8 有关 Log4J 日志文件中日志级别及文件配置的详细情况,在 Log4J 的配置文件(xml.properties)中有详细的介绍,敬请参阅!

Java日志记录的事儿

一.java日志组件 1.common-logging common-logging是apache提供的一个通用的日志接口.用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库.但由于它使用了ClassLoader寻找和载入底层的日 志库, 导致了象OSGI这样的框架无法正常工作,由于其不同的插件使用自己的ClassLoader. OSGI的这种机制保证了插件互相独立,

Java日志记录的5条规则

日志记录是在软件开发过程中常常需要考虑的关键因素. 当产品运行出错时,日志文件通常是我们进行错误分析的首要选择. 而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息. 可见,正确记录需要的信息是极其重要的. 以下5条日志规则,让我们可以检查和改进在代码中操作日志记录的方式. 同时也请注意,我们既不会讨论怎么配置一个日志引擎,也不会相互比较. 规则1.日志是面向读者的 日志消息不仅要对书写(日志)代码的人有意义,也应该对日志文件的读者有意义. 这似乎是一条很明显但却经常

JAVA实现通用日志记录

原文:http://blog.csdn.net/jinzhencs/article/details/51882751 前言: 之前想在filter层直接过滤httpServerletRequest请求进行日志处理,但是之后再getWriter()的 时候报 already been call异常.查了下,才发现原来流形式的只能读取一次..就好像食物,吃了就没了.. 所以在filter和inteceptor里面是没法通过获取request的流来进行日志记录的. 于是还是准备用通用的方法:contr

java动态代理详解,并用动态代理和注解实现日志记录功能

动态代理的概念 动态代理是程序在运行过程中自动创建一个代理对象来代替被代理的对象去执行相应的操作,例如, 我们有一个已经投入运行的项目中有一个用户DAO类UserDao用来对User对象进行数据库的增删改查操作,但是有一天,要求在对用户的增删改查操作时记录相应的日志,这是怎么办呢?难道我们去直接修改UserDao的源代码,然后在UserDao的每个方法中加入日志记录功能,这显然是不合理的,它违背了java的OCP原则,即对修改关闭对扩张开放.比如改现有的代码如下: 接口类 public inte