日志打印最佳实践

这篇具有很好参考价值的文章主要介绍了日志打印最佳实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

日志打印最佳实践

标题为什么要记录日志?

打印调试:用日志来记录变量或者某一段逻辑,记录程序运行的流程,即程序运行了哪些代码,方便排查逻辑问题。

问题定位:程序出异常或者出故障时快速的定位问题,方便后期解决问题。因为线上生产环境无法debug,在测试环境去模拟一套生产环境费时费力。所以依靠日志记录的信息定位问题,这点非常重要。

监控告警 & 用户行为审计:格式化后日志可以通过相关监控系统(AntMonitor)配置多维度的监控视图,让我们可以掌握系统运行情况或者记录用户的操作行为并对日志采集分析,用于建设业务大盘使用

什么时候记录日志?

代码初始化时或进入逻辑入口时 :系统或者服务的启动参数。核心模块或者组件初始化过程中往往依赖一些关键配置,根据参数不同会提供不一样的服务。务必在这里记录INFO日志,打印出参数以及启动完成态服务表述。

编程语言提示异常:这类捕获的异常是系统告知开发人员需要加以关注的,是质量非常高的报错。应当适当记录日志,根据实际结合业务的情况使用WARN或者ERROR级别。

业务流程预期不符:项目代码中结果与期望不符时也是日志场景之一,简单来说所有流程分支都可以加入考虑。取决于开发人员判断能否容忍情形发生。常见的合适场景包括外部参数不正确,数据处理问题导致返回码不在合理范围内等等。

系统/业务核心逻辑的关键动作:系统中核心角色触发的业务动作是需要多加关注的,是衡量系统正常运行的重要指标,建议记录INFO级别日志。

第三方服务远程调用:微服务架构体系中有一个重要的点就是第三方永远不可信,对于第三方服务远程调用建议打印请求和响应的参数,方便在和各个终端定位问题,不会因为第三方服务日志的缺失变得手足无措。

日志格式一般需包含以下几类关键信息:


调用时间
日志链路id(traceId、rpcId)
线程名
接口名
方法名
调用耗时
调用是否成功(Y/N)
错误码
系统上下文信息(调用系统名、调用系统ip、调用时间戳、是否压测(Y/N))

2022-12-12 06:05:05,129 [0b26053315407142451016402xxxxx 0.3 - /// - ] INFO [SofaBizProcessor-4-thread-333] - [(interfaceName,methodName,1ms,Y,SUCCESS)(appName,ip地址,时间戳,Y)


详细日志

详细日志是用于补充摘要日志中的一些业务参数的日志文件,用于问题排查。详细日志一般包含以下几类信息:

调用时间
日志链路id(traceId、rpcId)
线程名
接口名
方法名
调用耗时
调用是否成功(Y/N)
系统上下文信息(调用系统名、调用系统ip、调用时间戳、是否压测(Y/N))
请求入参
请求出参

2022-12-12 06:05:05,129 [0b26053315407142451016402xxxxx 0.3 - /// - ] INFO [SofaBizProcessor-4-thread-333] - [(interfaceName,methodName,1ms,Y,SUCCESS)(appName,ip地址,时间戳,Y)(参数1,参数2)(xxxx)

日志记录原则

隔离性:日志输出不能影响系统正常运行;

安全性:日志打印本身不能存在逻辑异常或漏洞,导致产生安全问题;

数据安全:不允许输出机密、敏感信息,如用户联系方式、身份证号码、token等;

可监控分析:日志可以提供给监控进行监控,分析系统进行分析;

可定位排查:日志信息输出需有意义,需具有可读性,可供日常开发同学排查线上问题。

打印日志要点

1.防止NPE

2.禁止使用 System.out.println()输出日志
原因: 此打印日志为控制台日志 , 并且是同步方法,高并发情况会影响性能 , 而且无法对日志统一收集

3.应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架 (SLF4J、JCL–Jakarta Commons Logging)中的API。
原因: 日志系统需要与代码解耦

4.声明日志工具对象Logger应声明为private static final
原因: private 防止日志对象被其它类非法使用
static 防止重复new日志对象,防止被序列化 , 减少安全风险
final 在类的生命周期无需变更logger,避免程序运行期对logger进行修改。

5.捕获异常后不要使用e.printStackTrace()打印日志
原因: e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多,字符串常量池所在的内存块没有空间了,即内存满了,系统请求将被阻塞。

6.不要打印无意义(无业务上下文、无关联日志链路id)的日志

7.日志打印禁止使用JSON打印对象 , 应使用 toString() 方法或者apache的ToStringBulider

8.禁止打印敏感信息

9.日志打印尽量使用英文
原因: 尽量在打印日志时输出英文,防止中文编码与终端不一致导致打印出现乱码的情况,对故障定位和排查存在一定的干扰。

10.调用第三方接口一定需要打印出入参文章来源地址https://www.toymoban.com/news/detail-435424.html

到了这里,关于日志打印最佳实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023年19款最佳3D打印软件

    推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 虽然我们包括一系列非常不同的3D打印软件,旨在满足非常不同的需求,但有一些关键方面可以决定3D打印机软件的成败。 广泛的 工具:我们选择了具有多功能工具集的3D打印软件。 团队友好 :理想情况下,最好的工具可以让您

    2024年02月09日
    浏览(39)
  • 43 最佳实践-性能最佳实践-IOThread配置

    43.1 概述 KVM平台上,对虚拟磁盘的读写在后端默认由QEMU主线程负责处理。这样会造成如下问题: 虚拟机的I/O请求都由一个QEMU主线程进行处理,因此单线程的CPU利用率成为虚拟机I/O性能的瓶颈。 虚拟机I/O在QEMU主线程处理时会持有QEMU全局锁(qemu_global_mutex),一旦I/O处理耗时较长

    2024年02月08日
    浏览(38)
  • 50 最佳实践-安全最佳实践-Libvirt鉴权

    50 最佳实践-安全最佳实践-Libvirt鉴权 50.1 简介 用户使用libvirt远程调用功能时,如果不进行任何鉴权校验,所有连接到主机所在网络的第三方程序都可以通过libvirt的远程调用操作虚拟机,存在安全隐患。为了提升系统安全性,openEuler提供了libvirt鉴权功能,即用户通过libvirt远

    2024年02月09日
    浏览(24)
  • Springboot切面打印日志

    切面打印完整日志,以下代码用于扫描@RestController 注解修饰的接口,并打印相关日志

    2024年02月14日
    浏览(22)
  • mybatis打印sql日志

    我们日常操作数据库的过程一般都是使用mybatis中执行sql操作,有时候为了确认mybatis拼接的sql是否正确,就需要在日志中打印出具体的sql语句,对应的入参以及数据库的返回值 一.sql日志输出到控制台,修改mybatis-config文件,指定如下配置: 二.sql日志输出到文件,修改mybatis

    2024年02月15日
    浏览(30)
  • springboot打印sql日志

    相信大家在项目调试的时候都遇到过最后数据库查询、或者插入的数据与自己所想的不符,但是又不知道具体哪里出问题了。 下面就教大家如何打印mybatis最终生成并执行的sql。 我们直接搜索org.apache.ibatis.logging.jdbc包下的ConnectionLogger、PreparedStatementLogger、ResultSetLogger等类。

    2023年04月11日
    浏览(24)
  • python中打印日志

    一、日志介绍 1、日志级别:日志的优先级、重要性或者严重程度 2、日志的作用:调试程序,跟踪定位bug,分析用户行为与数据统计 3、常见的日志级别(从小级别到大级别排序):         debug:调试级别,打印非常详细的日志信息,通常用于代码调试         inf

    2024年02月09日
    浏览(43)
  • springboot JPA日志打印

    1、在springboot整合jpa后再配置文件applcation.yml的时候show-sql要设置为true 这时去执行请求,后台就会打印sql,但是不会现实参数,如果需要现在参数需要再在application.yml中添加下面的配置 这时去执行请求,后台就会将参数和sql都打印出来,但是sql和参数是分开的。 下面我们让

    2024年02月15日
    浏览(33)
  • 53 最佳实践-安全最佳实践-虚拟机可信启动

    53 最佳实践-安全最佳实践-虚拟机可信启动 53.1 概述 可信启动包含度量启动和远程证明。其中虚拟化组件主要提供度量启动功能,远程证明由用户自己在虚拟机中安装相关软件(RA client)及搭建远程证明服务器(RA server)进行使能。 度量启动的两个基本要素是信任根和信任链

    2024年02月10日
    浏览(27)
  • Hive终端命令行打印很多日志时,如何设置日志级别

    示例:use test; 切换到test数据库时,输出很多日志信息不方便看结果,如下图。   解决方法: 退出hive命令行界面(ctrl+C) 执行“vi /usr/local/apache-hive-3.1.2-bin/conf/log4j.properties”命令,创建并编辑log4j.properties文件,添加以下内容。(完成后保存退出)   再次通过“hive”指令进

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包