首先来看一下比较常用的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.分支流程如果必要再外层打印参数,可以知道具体走了哪个流程。

转载笔记

最新文章

  1. python入门-python解释器执行
  2. New line
  3. Java基础之在窗口中绘图——移动曲线的控制点(CurveApplet 3 moving the control points)
  4. python基础之基本算法和装饰器
  5. SU Demos-02Filtering-05Suk1k2filter
  6. TYVJ P1086 Elevator Label:dp
  7. 操作系统,windows编程,网络,socket
  8. python中zip函数
  9. iOS中属性Property的常用关键字的使用说明
  10. 【总结】IE和Firefox的Javascript兼容性总结(转)
  11. HDU 1043 八数码 Eight A*算法
  12. Javascript nextElementSibling和nextSibling
  13. 韦东山yy公开课笔记(1)--各种杂的问题
  14. 简单实用后台任务执行框架(Struts2+Spring+AJAX前端web界面可以获取进度)
  15. Qt版权符号显示问题
  16. 调用Kubernetes API操作Kubernetes
  17. 搭建 RabbitMQ Server 高可用集群
  18. 在windows+eclipse+git遇到的未修改文件被标记为已修改的问题
  19. ISAPI筛选器及对ASP源文件的保护
  20. Java_集合面试题

热门文章

  1. hdu 4063 Aircraft (Geometry + SP)
  2. H3C 路由器的特点
  3. [C#] 用ServiceStack读写redis的性能问题
  4. 创建JAVASCRIPT对象3种方法
  5. get和post的区别?
  6. Python--day23--类的命名空间
  7. springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)
  8. Codeforces Round #196 (Div. 1 + Div. 2)
  9. ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com
  10. C# 转换类型和字符串