打印日志,要注意下面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. 八皇后问题——列出所有的解,可推至N皇后

    <数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...

  2. poj 3061 题解(尺取法|二分

    题意 $ T $ 组数据,每组数据给一个长度 $ N $ 的序列,要求一段连续的子序列的和大于 $ S $,问子序列最小长度为多少. 输入样例 2 10 15 5 1 3 5 10 7 4 9 2 8 ...

  3. python 之 前端开发(盒子模型、页面布局、浮动、定位、z-index、overflow溢出)

    11.312 盒子模型 HTML文档中的每个元素都被比喻成矩形盒子, 盒子模型通过四个边界来描述:margin(外边距),border(边框),padding(内填充),content(内容区域),如 ...

  4. PAT(B) 1037 在霍格沃茨找零钱(Java)

    题目链接:1037 在霍格沃茨找零钱 (20 point(s)) 题目描述 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle) ...

  5. 【HC89S003F4开发板】 8c转义成汇编工程

    HC89S003F4开发板建立汇编工程 选择编译文件 @选用开发板闪灯例程,将例程删除多余的注释,后面生成的文件会更直观. #define ALLOCATE_EXTERN #include " ...

  6. 小游戏UFO Fled

    UFO Fled:https://play.google.com/store/apps/details?id=cn.crane.game.flappyufo UFO Fled -- 点击屏幕帮助UFO ...

  7. Shiro简介、入门案例、web容器的集成

    目的: shiro简介 Shiro入门案例 Shiro与web容器的集成 shiro简介(中文官网:https://www.w3cschool.cn/shiro/andc1if0.html) 1.什么 ...

  8. Mybatis动态sql及分页、特殊符号

    目的: mybatis动态sql(案例:万能查询) 查询返回结果集的处理 mybatis的分页运用 mybatis的特殊符号 mybatis动态sql(案例:万能查询) 根据id查询 模糊查询 (参数 ...

  9. Asp.netCore 的Startup 不继承接口

    有一个问题: Asp.netCore 的Startup 要实现 Config 和ConfigServie 方法, 为什么不接口约束呢. 进入源码: // // 摘要: // /// Specify t ...

  10. pdm文件打开方式

    转自:https://blog.csdn.net/qq_36855191/article/details/79299216 pdm打开网站:http://www.dmanywhere.cn/