打印日志,要注意下面4点。

一、预先判断日志级别

对DEBUG、INFO级别的日志,必须使用条件输出或者使用占位符的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。

先来看一个反例:

log.debug("输入参数信息id=" + id + ",obj=" + obj);

如果在某个配置了打印级别为WARN的应用中,按照上面代码打印DEBUG级别的日志,那么该日志不会被打印,但是会执行字符串拼接操作;如果obj是一个对象,还会执行toString()方法,白白浪费系统资源。

代码正确示例如下:

//使用条件判断形式
if (log.isDebugEnabled()) {
log.debug("输入参数信息id={}", id);
}
//使用占位符形式
log.debug("输入参数信息id={},obj={}", id, obj);

二、避免无效日志打印

生产环境禁止输出DEBUG日志且有选择的输出INFO日志。
使用INFO、WARN级别来记录业务日志行为信息时,一定要控制输出量,以免磁盘空间不足,同时要为日志文件设置合理的生命周期,及时清理过期的日志。

避免重复打印,务必在日志配置文件中设置additivity=false,示例如下:

<logger name="com.test" additivity="false">
<level value="INFO" />
<appender-ref ref="logfile" />
</logger>

additivity属性简介:

它是子Logger是否继承父Logger的输出源(appender)的标志位,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。把additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。

三、区别对待错误日志

WARN、ERROR都是与错误有关的日志级别,但不要一发生错误就打印ERROR日志,比如一些业务异常是可以通过引导重试就能恢复的,例如用户输入参数错误,在这种情况下,记录日志是为了在用户咨询时可以还原现场如果输出为ERROR级别就表示一旦出现就需要人为介入,这显然不合理。所以,ERROR级别只记录系统逻辑错误、异常或者违反重要的业务规则,其他错误都可以归为WARN级别。

四、保证记录完整内容

日志记录的内容需要包括现场上下文信息和异常堆栈信息,所以打印时候需要注意下面两点:

1.记录异常时一定要输出异常堆栈,例如:

log.error("xxx" + e.getMessage(), e);

2.日志中如果输出对象实例,要确保实例类重写了toString方法,否则只会打印对象的hashCode值,没有实际意义。

java中日志打印的更多相关文章

  1. Java中PrintStream(打印输出流)

    Java中PrintStream(打印输出流)   PrintStream 是打印输出流,它继承于FilterOutputStream. PrintStream 是用来装饰其它输出流.它能为其他输出流 ...

  2. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  3. JAVA 中日志的记录于使用

    java中常用的日志框架 日志接口 Commons Logging Apache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型.它通过其他一 ...

  4. java aop 日志打印 正则设置

    package tz.lion.Utils.aop; import com.alibaba.fastjson.JSON;import org.springframework.web.multipart ...

  5. Android 各层中日志打印功能的应用

    1. HAL层 头文件:#include <utils/Log.h> 对应的级别 打印方法 VERBOSE LOGV()DEBUG LOGD()INFO LOGI()WARN LOGW() ...

  6. java 中的打印流

    package cn.zhou; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.F ...

  7. Java 中怎么打印数组?

    你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组.由 于数组没有实现 toString() 方法,所以如果将数组传递给 System.ou ...

  8. java中如何打印规定图案? 举例说明

    9.4 print out the following pattern(打印图案). * *** ***** ******* ***** *** * 提示: 1)本题上面的图案和下面的图案是一样的.所 ...

  9. 理解Java中对象基础Object类

    一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...

随机推荐

  1. Mybatis应用入门

    mybatis简介 Mybatis是在jdbc的基础之上封装而成的持久层框架. Mybatis是一个ORM框架.ORM(object relational mapping):对象关系型映射 搭建myb ...

  2. Python 实例代码二

    1.实现isNum()函数,参数为一个字符串,如果这个字符串属于整数.浮点数或复数的表示,则返回True,否则返回False def isNum(word): try: word=type(eval( ...

  3. WUSTOJ 1347: GCD(Java)互质

    题目链接:1347: GCD Description 已知gcd(a,b)表示a,b的最大公约数. 现在给你一个整数n,你的任务是在区间[1,n)里面找到一个最大的x,使得gcd(x,n)等于1. I ...

  4. stm32f103的HSI设置

    HSI基本知识 HSI是8MRC震荡电路,精度1%. PLL的设置必须在其被激活前完成,输出必须被设置温48M或者72M LSE:通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭. ...

  5. Eclipse RCP难点:给Command传递参数(Object)

    这个问题网络上没有答案,国外网站上也没有,本人研究了一天,终于搞明白如何实现,实际上是Eclipse RCP的ICommandService本身就已经提供的方法,只是网络上教的都是使用IHandler ...

  6. python 内置函数和匿名函数

    内置函数 截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.     Built-in Functions     abs() dict() help() min() ...

  7. 【转载】 C#中使用Sum方法对List集合进行求和操作

    在C#的List操作中,有时候我们需要对List集合对象的某个属性进行求和操作,此时可以使用Lambda表达式中的Sum方法来快速实现此求和操作,使用Sum方法可使代码简洁易读,并且省去写for循环或 ...

  8. js入门之内置对象Math

    一. 复习数据类型 简单数据类型, 基本数据类型/值类型 Number String Boolean Null Undefined 复杂数据类型 引用类型 Object 数组 数据在内存中是如何存储的 ...

  9. js时间格式化和相互转换

    1. Thu Mar 07 2019 12:00:00 GMT+0800 (中国标准时间) 转换为 2019-03-07 12:00:00 const d = new Date(Thu Mar 07 ...

  10. stm32 内部flash

    嵌入式闪存 闪存存储器有主存储块和信息块组成 大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页 编程和擦除闪存 闪存编程一次可以写入16位(半字) 闪存擦除操作可以按页面擦 ...