Java项目中使用log记录日志的一些总结
本文介绍了一下自己在Java项目中使用log的一些总结,从日志的作用、日志的选用、日志级别介绍、日志记录的一些最佳实践几个方面阐述。
日志的作用
主要作用包括:
1、出问题后定位当时问题
2、显示程序当前运行状态
日志的选用
Java里存在众多的开源日志框架: slf4j, logback, log4j, JCL(Apache Common Logging), JUL(JDK自带的java.util.logging)等。这其中slf4j属于一套简洁的日志API,其并不包含日志的实现(它并不负责日志输出等,JCL也包含API)。
slf4j提供了众多的适配器可以适配其他所有开源日志框架,这样让我们在代码中只需面对slf4j的API,然后可以任意切换日志的实现。你可能会讲我们并不需要切换日志框架这种功能,但是我们项目中需要使用大量的第三方库,而这些第三方库使用的日志框架各不相同,不同的日志框架需要不同的配置,不同的配置会导致日志输出到不同的位置。
一个应用肯定需要将日志level,日志输出等收纳起来统一管理。对于这种情况,我们可以使用slf4j的适配器将第三方库中各种日志的实现接管,接管之后就可以统一配置这些第三方库中使用的日志了。
在这些日志实现框架中又数logback性能最优,所以在选择日志实现的时候推荐使用logback。
日志级别介绍
level 定义简直就是一门艺术, 好的定义应该遵循以下原则:
debug:完整详细的记录流程的关键路径. 应该用于开发人员比较感兴趣的跟踪和调试信息, 生产环境中正常都不会打开debug状态
info:应该简洁明确让管理员确认状态。记录相当重要的,对于最终用户和系统管理员有意义的消息。关键系统参数的回显、后台服务的初始化状态、需要系统管理员知会确认的关键信息都需要使用INFO级别
warn:能清楚的告知所有人发生了什么情况.能引起人的重视,指示潜在问题,但不一定需要处理。
error:系统出现了异常或不期望出现的问题,希望及时得到关注的处理。需要注意的一个点,不是所有的异常都需要记录成error。
日志记录的一些最佳实践
以下可以根据项目实际情况当做规范使用:
1、tomcat配置access日志,记录每次http请求相关信息
2、dubbo配置access日志,记录dubbo consumer和provider的每次请求调用和处理
3、在系统里调用外部的地方,记录请求的接口、参数、返回结果、花费时间、遇到的异常等
4、在系统里出现异常的地方,记录异常的堆栈,如果可以,尽量通过异常的日志能还原当时的情景,比如当时受影响的是哪个用户、传入的变量是什么、处理哪些核心数据引发的异常等等
5、有些代码在编写时就知道很难被执行到或者不希望被执行到、以及一些基本不会走到的else块,这些地方需要记录下核心日志
6、禁止使用 System.out 或 System.error
7、禁止使用 Apache Commons Logging , Java Util Logging,推荐使用slf4j,推荐使用Logback,代码中使用Slf4j记录日志
8、业务日志使用独立的日志配置,不能采用className。举个例子,我之前在qunar做项目时,涉及打通许多第三方管理系统,和每一个第三方的交互的日志都会单独存储到一个日志文件中
9、INFO及以上的系统日志统一输出到Console。在生产环境中如果将系统log切分成多个文件, 是非常不利于问题排查的. 不仅要同时追找多个文件, 还要匹配问题发生的时间点. 最要命的是, 有些异常是被print到 console里的。
10、日志配置Rolling,可以根据实际情况配置按天、按小时进行轮转,生成新的日志文件
11、记录程序状态需要包含发生时间(一般框架里就会带上)、大数据量更新的进度、关键变量及正在做哪些重要事情。
12、不同的日志文件尽量使用同样的格式输出(logback配置同样的pattern), 这样方便脚本通用及第三方解析
结尾
如何在项目里记录好日志是一门学问,也是一门艺术。这里把自己目前想到的总结一下,欢迎指正,也欢迎有更多的最佳实践能分享出来。
Java项目中使用log记录日志的一些总结的更多相关文章
- 在Java项目中整合Scala
Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...
- JAVA项目中常用的异常处理情况总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- JAVA项目中引用Logback的方法
一.简介 本文主要讲JAVA项目中引入Logback的方法. 二.解决 1.引入依赖. <!--Begin LogBack Log--> <!-- https://mvnreposi ...
- Ant在Java项目中的使用(一眼就看会)
参考:http://www.cnblogs.com/zhengqiang/p/5557155.html Ant是跨平台的构建工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将A ...
- JAVA项目中常用的异常知识点总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN
eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...
- java项目中build path的设置
右键点击项目新建文件libs 添加jtds jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换 Java项目中build path的设置总结,包括JRE的添加和更 ...
- Andoid java文件中的Log检查工具
AndroidLogChecker 由于发布软件版本的时候我们需要把Log注释掉,此工具可以检查java类中的Log所在行以及是否已经注释. Github: https://github.com/cu ...
- XML在JAVA项目中的作用
java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...
随机推荐
- dubbo控制器xml文件报错
在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...
- iTextSharpH
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 悬线法 || BZOJ3039: 玉蟾宫 || Luogu P4147 玉蟾宫
题面: P4147 玉蟾宫 题解:过于板子举报了 #include<cstdio> #include<cstring> #include<iostream> #de ...
- Eclipse 00: 安装教程 + 汉化 + 简单创建java项目
Java 安装教程(Eclipse) 目录: 要安装Java 要分两个步骤: 1.JDK的安装 2.Eclipse的安装 3.Eclipse汉化 4.Eclipse创建简单java项目 1和2的顺序不 ...
- CS1704问题汇总
“/”应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS1704: 已经导入了具有相同的 ...
- python框架之Django(5)-O/RM
字段&参数 字段与db类型的对应关系 字段 DB Type AutoField integer AUTO_INCREMENT BigAutoField bigint AUTO_INCREMEN ...
- pandas的Panel类型dtype
panel = pd.Panel(dataframe_dict) 把一个多列类型不相同(里面有int,float)的dataframe字典直接赋值给Panel,从Panel中解析出来的datafram ...
- 第四章 jQuery节点操作
1.DOM操作分为三类:(1)DOM Core:任何一种支持DOM的编程语言都可以使用用它如:getElementById()(2)HTML-DOM:用于处理HTML文档,如document,form ...
- day07 Python文件操作
一,文件操作基本流程 #1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 d ...
- CSS注意点
案例: 实际开发中,这样写: