首先来看一下比较常用的Logger日志级别(部分未列出):

  1. error - 运行期错误日志记录,应该有专门的error日志文件。;
  2. warn - 警告信息,如程序调用了一个即将作废的接口,接口的不当使用,运行状态不是期望的但仍可继续处理等;
  3. info - 有必要的事件信息记录。
  4. debug - 调试信息,业务处理进行状态,当前的变量值等;
  5. trace - 一些更详细的跟踪信息;

鉴于我们是一个金融系统,流量还是不算很大,我个人认为debug级别和info级别可以统一归为info级别下打印,这是考虑到现在系统稳定性不够,处于一个快速迭代开发的过程中,线上问题可能随时都有,所以将业务流转与部分变量值打印出来还是很有必要的。error记录错误日志,但如果错误是预期会发生的,并且已经有了其他的处理流程,则建议使用warn级别。例如在try-catch中catch块里处理后继续流程的日志记录。

1.Logger对象的定义:

<strong>private static final Logger logger = LoggerFactory.getLogger(Test.class);</strong>

2.日志中不出现计算或方法调用,防止在打印日志的时候报错。

之前在上家公司的时候就确实出现过因打印日志而系统RunTimeException的,不应该出现。

3.try-catch如果往外抛出,则不应该打印异常信息。

 
  1.  
    try {
  2.  
        throw new Exception();
  3.  
    } catch (Exception e) {
  4.  
        logger.error("xxxxxx", e);
  5.  
        throw e;
  6.  
    }

这样的处理解释不合适的,因为抛出去的异常,一般情况下你肯定会记录。(当然如果你不记录,那么我就搞不懂为什么你要抛出去了)。

4.如何打印error Log

log.error("xxxxxxxxxxxx", e); 

这种比较推荐,当然在实际过程中我也看到有同事用了其他的方式,形如:

logger.error("xxxxxx", e.getStackTrace());

可以是可以,这种打印出来的stackTrace比较丑。。。用一下你就知道。

Log4j、Log4j2的源码中对于异常Exception的处理时这样的。

所以【占位符小于实际的参数数量时会把最后一个设置为Throwable】,即可以正常打印error。

  1.  
    log.error("xxxxxxxxxxxx{}","第一个参数" e); //可以正常打印
  2.  
    log.error("xxxxxxxxxxxx{},{}","第一个参数" e); //不能正常打印,因为占位符和参数数量一样
  1.  
    private void initThrowable(final Object[] params, final int argCount, final int usedParams) {
  2.  
            if (usedParams < argCount && params[argCount - 1] instanceof Throwable) {
  3.  
                this.throwable = (Throwable) params[argCount - 1];
  4.  
            } else {
  5.  
                this.throwable = null;
  6.  
            }
  7.  
        }

5.日志记录建议用英文(这点没有依据)。

用中文除了占用大点好像没什么不好,但是还是建议用字母。

6.http请求时应该打印 url ,param, get/post,statusCode,ret,timeUsed等关键字段。

反正我吃过没打印这些的亏,还不是我写的代码。说出来都是泪。

7.相对6,别人调用接口的时候应打印 入参,请求用时,返回值,来源等关键字段。

8.分支流程如果必要再外层打印参数,可以知道具体走了哪个流程。

转载笔记

Logger日志打印规范的更多相关文章

  1. Logger日志打印普通方法

    using System; using System.IO; using System.Text; namespace Core { public class LogHelper { private ...

  2. 深入理解Logger日志——框架绑定原理

    深入理解Logger日志--框架绑定原理 说到Logger日志的动态绑定,主要归功与Slf4j,在之前的文章也说过,Slf4j是类似于Apache Common-Logging,英文为Simple L ...

  3. 打印 Logger 日志时,需不需要再封装一下工具类?

    在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查.应用监控等.现在打印日志一般都是使用 slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,也非常方便.在 < ...

  4. Python 日志打印之自定义logger handler

    日志打印之自定义logger handler By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #实践代码 handler.py #!/usr/bin/env ...

  5. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...

  6. SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印

    一.Log4j2日志简介 日志打印是了解Web项目运行的最直接方式,所以在项目开发中是需要首先搭建好的环境. 1.Log4j2特点 1)核心特点 相比与其他的日志系统,log4j2丢数据这种情况少:d ...

  7. 二:SpringBoot-配置Log4j2,实现不同环境日志打印

    SpringBoot-配置Log4j2,实现不同环境日志打印 日志打印之外观模式 1.日志配置 2.Log4j2的配置文件 3.简单的测试程序 日志打印之外观模式 每一种日志框架都有自己单独的API, ...

  8. Android Studio中JNI程序的单步调试和日志打印

    近日有个算法(检测碰撞)需要用C++实现,目的是IOS和ANDROID中共享同一段程序. 下面说说android调用这段程序过程中遇到的一些事情.(过程中网上搜索了一些相关文章,大部分说的是eclip ...

  9. Logger日志级别说明及设置方法、说明 (zhuan)

    http://blog.csdn.net/rogger_chen/article/details/50587920 ****************************************** ...

随机推荐

  1. spark sql thrift server

    ### create data ## cat ## echo "$(date ;echo ## cat }'";exit}' ..} do passwd) echo "$ ...

  2. Python 的经典入门书籍

    实python非常适合初学者入门,上手很容易.我就是完全通过网上资源学了python的.最大的是3点经验:1.找一本浅显易懂,例程比较好的教程,从头到尾看下去.不要看很多本,专注于一本.把里面的例程都 ...

  3. Python学习--not语句

    布尔型True和False,not True为False,not False为True,以下是几个常用的not的用法: (1) not与逻辑判断句if连用,代表not后面的表达式为False的时候,执 ...

  4. PHP redis安装扩展

    命令: 查看php版本:PHP -v 查看php安装的扩展:PHP -m php扩展开发包(包括phpize,php -config):yum install php-devel which phpi ...

  5. Python--day27--设计模式

    设计模式:单例模式

  6. java接口(interface)

    引入:抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特殊的“抽象类”→ 接口; 例子: 生活中听说过的USB接口其实并不是我们所看到的那些插槽,而是那些插槽所遵循的一种规范 ...

  7. [转]爬虫 selenium + phantomjs / chrome

    目录 selenium 模块 安装 phantomjs 浏览器 安装 chromedriver 接口 安装 对比两个接口 整合使用 基本实例 常用属性方法 定位节点 节点操作 其他操作 实例解析 - ...

  8. HDU 3397"Sequence operation"(线段树区间和并)

    传送门 •题意 给你一个仅包含 0 和 1 的序列: 在这个序列上有如下操作: (1)0 a b : 将 [a,b] 区间的数置 0: (2)1 a b : 将 [a,b] 区间的数置 1: (3)2 ...

  9. Vue 项目构建完成 ----发布项目

    发布项目 cmd  命令行 npm run build      执行打包文件 完成后就会有  3 个文件夹    分别是: 文件夹 :build     config      dist    in ...

  10. 【js】 vue 2.5.1 源码学习(五) props directives规范化 props 合并策略

    大体思路 (四) 上节回顾: A: 对于生命周期函数将父子组件的函数放到一个数组里面,特定时间点调用,保证父子组件函数都调用到. B: 对于directive,filters,components 等 ...