当前位置: 首页 > 图灵资讯 > 技术篇> java 默认日志颜色 java 日志规范

java 默认日志颜色 java 日志规范

来源:图灵教育
时间:2023-05-17 11:34:55

文章目录

  • Java日志总结系列1-日志标准
  • 日志级别
  • 日志内容
  • 日志注意事项
Java日志总结系列1-日志标准

日志是系统的重要组成部分,用于记录执行记录、审计、调查问题、数据收集等。日志需要持久性,通常日志只需要持久性到磁盘或存储到ES,一些场景也需要将日志存储在MySQL中,如重要的请求日志、用户彩票执行记录、现金提取操作等。 本系列主要讲述java系统中存储在文件和ES中的日志。

日志级别

从高到低可以分为erroror、warn、info、debug。

error:这意味着如果系统出现错误,应立即干预,影响系统的正常运行。在这种情况下,最好配置报警。例如

  1. 读写文件错误
  2. 网络中断
  3. 与第三方对接的异常
  4. 其他影响功能使用的异常(NPE/DB异常等)

warn:需要注意但不需要立即处理的问题。例如

  1. 有容错机制的异常
  2. 性能接近临界值
  3. 找不到配置文件,但有默认值(参考第一条,很多框架都是这样做的)
  4. 业务异常
  5. 其他

info:记录用户/系统行为

  1. 外部界面入口:打印界面的唯一标志和简短描述,打印调用器传输的参数,以便当系统出现问题时,很容易判断调用器是否有问题
  2. 系统操作:读写文件,定期任务
  3. 不符合业务逻辑预期:打印关键参数,从这些参数中可以清楚地看出谁的操作与预期不一致,为什么与预期不一致。
  4. 调用其他接口前后:打印调用接口的系统名称/接口名称、传输参数/响应参数,便于定义问题。通过这两个日志,您可以清楚地看到调用系统是否有问题
  5. 系统模块的入口和出口:重要的方法级或模块级,记录其输入和输出,便于定位
  6. 非预期执行:在“可能”执行程序的地方打印日志
  • switch defaulttt在case句块中
  • if…else ifelse中很少出现else情况
  • try catch分支在catch语句块中。
  1. 服务状态变化(尽可能记录线索):应记录程序中重要状态信息的变化,以便在检查问题时恢复现场,并推断程序运行过程
  2. 一些可能耗时的业务处理:批处理、IO操作

debug:方便查询问题信息,一般不允许在线存储此级别的日志

  1. 开发和测试人员都能理解
  2. 问题可以直接定位,无需重现。
日志内容

必要前缀

  1. 时间:时间区,毫秒
  2. 进程ID
  3. 在多线程中,线程ID非常重要
  4. 日志级别
  5. 模块,哪个类别;如果是微服务,指示哪个服务ID或名称
  6. host,机器ip/name

自定义标签

  1. traceId
  2. 重要标签信息等

日志消息体

  1. 日志表达的内容
  2. filter:搜索方便,自定义。(比如可以给重要的日志编号,搜索日志会很方便,但是要注意编码要尽量不要和其他数据冲突,比如123是不好的编号)
  3. 会话信息(用户,登录账号,session),其他信息,如状态信息(开始、中断、结束)、版本号
  4. 犯罪现场上下文信息和异常堆栈信息
日志注意事项
  1. 不要打印敏感信息,如密码、身份证号码、银行卡号码等,以免泄露敏感信息
  2. 不要使用Systememm.err 打印日志,这是同步的。在线高qps下容易造成堵塞,导致性能问题
  3. 不要打印大量的日志。一般来说,一小时500M的服务比较多。
  4. 使用loger.xxx()使用参数化日志特性,不要拼接字符串。这可以提高系统在关闭某一级别日志时的性能。因为如果使用字符串拼接,无论对象的tostring()方法如何都会执行;如果使用参数打印,一定级别的日志不打印,tostring()方法不会执行。
public void info(String format, Object arg) {        if (logger.isLoggable(Level.INFO)) { //如果不打印info,直接跳过            FormattingTuple ft = MessageFormatter.format(format, arg);            log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());        }    }
  1. 打印异常时的做法logger.error("filter. message. params = {}.",params.e)。不要只打印e.getMessage(),不要使用e.printStackTrace()打印到System.err中的
  2. 打印日志时不要出现异常。例如logger.info("msg. id = {}".dto.getId()).null时,dto会抛NPEE
  3. 使用日志门面框架,如SLF4J,不要直接使用特定的日志类
  4. 一个项目的底层只依赖于一个实现,所有其他日志都需要排除。