【杂谈】后台日志该怎么打印

news/2024/12/14 16:53:45/文章来源:https://www.cnblogs.com/longfurcat/p/18606762

为什么要打印日志?

1. 监控系统运行情况

定期查看系统日志是了解服务是否正常运行的重要手段。日志为运维人员提供了实时监控系统状态、发现潜在问题的关键信息。

2. 排查问题(例如异常栈)

日志记录了详细的错误信息,特别是异常栈,有助于快速定位问题的根源。对于一些偶发的 Bug,日志是排查的唯一途径,尤其在生产环境中,日志显得尤为重要。

对于try-catch必须注意,无特殊情况,不能吃掉异常。

3. 性能监控

通过记录特定操作的耗时,可以实时监控系统性能,帮助我们及时发现性能瓶颈,并对耗时较长的操作进行优化。

Java 可使用StopWatch工具。

4. 网络攻击监控

日志中的安全信息对及时发现网络攻击至关重要。防火墙或其他安全组件会记录攻击行为,这有助于我们迅速应对,采取措施如增强保护机制或切换服务节点。


什么操作需要打印日志?

1. 用户操作

特别是 后台管理人员 的操作日志,需要详细记录。这不仅有助于了解系统的使用情况,还能为出现问题时提供追责依据。

例如,用户可能不承认自己执行了某些操作,而通过日志记录的操作时间、IP 地址、执行的具体任务等信息,可以作为有力证据。

2. 定时任务

记录定时任务的执行日志非常重要,它帮助我们确认任务是否按时运行、是否执行成功以及是否存在异常。

3. 外部请求

当系统与外部接口进行交互时,记录 请求参数响应内容 是至关重要的。

通过这些日志,我们不仅能验证外部系统是否返回了正确的数据,还能确保我们的系统按照预期工作。


打印什么内容?

1. 必要的 ID 信息

日志中应包含 必要的标识符(如用户 ID、事务 ID 等),这些信息对于问题的快速定位至关重要。通过记录标识符,能够帮助我们追溯相关操作、识别操作的发起者,并在出现问题时迅速查找出问题源头。

2. 信息的可读性

仅仅记录 ID 信息可能缺乏直观性,给后续分析带来困难。因此,最好 同时记录相关的可读信息,如 username(用户名)和 user_id

例如,单独记录用户的 ID(如 user_id=12345)可能无法直接帮助我们理解哪个用户发生了问题,而通过同时记录 username(如 username=张三)则能使问题定位更加直观且易于处理。


主要注意什么?

1. 打印频率

日志打印频率过高会导致日志文件快速增长,占用大量磁盘空间,甚至影响系统性能。因此,应合理控制日志记录的频率,避免记录不必要的信息。

2. 敏感信息

日志中可能包含敏感信息(如用户密码、支付信息等)。虽然大部分技术人员不会主动访问这些信息,但日志泄露可能对公司声誉造成严重影响。为了防止敏感信息泄露,应避免记录此类数据。可以通过根据关键词匹配对象的 key,将敏感信息的 value 替换为 **** 来规避这一风险。


如何查看和使用日志?

1. 执行链路追踪

通过在日志中添加 TAG(标签),可以轻松地过滤和追踪某个操作的执行过程。

例如,可以为每个用户请求或业务操作分配唯一的 request IDtransaction ID,并将其作为 TAG 记录在日志中,这样就能在不同的系统和模块中追踪同一请求的执行轨迹。

2. 关键字搜索

日志文件通常包含大量信息,尤其是高并发环境下,日志量可能非常庞大。为了快速定位和排查问题,我们可以利用 关键字搜索 功能。

例如,如果系统报错时出现了异常信息 NullPointerException,我们可以在日志中搜索该关键字,快速定位到报错的具体位置,进而缩小排查范围,快速解决问题。

或者在人工扫描的时候,可以搜索Exception或error,快速过滤异常信息,查看是否存在不符合预期的异常。


文件日志还是数据库日志?

  • 运行日志:一般情况下,运行日志直接写入文件。文件日志记录了系统的整体运行状态,便于进行监控和性能调优。

  • 操作日志:对于用户操作、业务处理等较高层次的日志,建议写入数据库。这样不仅方便检索和分析,还可以生成报告,并有助于长期保存和审计。


日志文件为什么要分片?如何分片?

日志文件不能无限增长,否则会影响查看和管理。例如,查看特定日期的日志时,如果所有日志都集中在一个文件中,文件会变得庞大,难以阅读,打开文件还可能出现卡顿。

此外,删除旧日志时也会变得困难,因为文件锁定会影响新日志的写入。

日志分片,也称为日志轮转,通常基于时间(如按天、按月)或文件大小来分片。最常见的方式是结合日期和序号进行分片:当文件达到一定大小时,创建一个新的日志文件并按序号命名。


海量日志如何监控?

对于单个简单应用,日志量相对较少,可以直接下载并通过人工检查。但对于微服务架构的复杂系统,日志量巨大且分散,人工扫描显然不现实。

  • 集中日志管理:可以使用日志收集工具(如 ELK Stack)将日志集中存储和管理。这样,所有微服务的日志都会被统一收集,便于分析和监控。

  • 日志收集的必要性:为什么不在一开始就直接将日志写入中央存储?因为这可能导致单点故障,并可能增加网络延迟。更好的做法是,服务先将日志写入本地文件,然后通过专门的收集器(如 Filebeat、Logstash)进行处理和传输。

  • 使用 Kafka 监控日志:对于高频率的日志数据,可以将日志传输到 Kafka,然后由专门的消费者应用进行实时消费和分析。消费者可以检查日志内容,识别出严重错误或异常情况,并及时告警(如通过邮件通知运维人员)。

  • 监控服务独立性:为什么不建议直接在服务代码中嵌入日志监控逻辑?因为监控服务应该与应用服务分离,这样便于更新、扩展,并遵循解耦设计原则。独立的监控服务可以灵活配置和管理。


总结

日志是任何系统中不可或缺的组成部分,合理的日志记录策略不仅能帮助开发人员高效排查问题,还能帮助运维团队监控系统健康、优化性能并确保安全性。在日志设计时,我们应特别关注内容的可读性、敏感信息的保护,以及合理控制日志记录频率。通过有效的日志管理、分析和告警机制,我们可以更好地保障系统的稳定性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852571.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用AOP防止请求重复提交

使用AOP防止请求重复提交首先定义注解NoPepeatSubmit@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NoRepeatSubmit {long value() default 1000*10; }定义AOP相关方法public class RepeatSubmitAspect {@Autowiredprivate StringRedisS…

三门峡知识付费系统服务热线

关于三门峡地区的知识付费系统及教育服务,虽然直接与三门峡地区的本地资源相关的信息比较有限,我们可以提供一些更宽广的信息和资源链接以帮助相关从业人员更好地了解知识付费系统和服务相关的背景信息与技术细节。例如,如果您在寻求构建或选择一个适合自身需求的知识付费系…

2024-2025-1 20241305《计算机基础与程序设计》第十二周学习总结

------------恢复内容开始------------ 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标 指针和数组作业正文 本博客…

微信小程序商城构建全栈应用

D:\PanDownload\【微信小程序】\微信小程序商城构建全栈应用 第1章 前言:不同的时代,不同的Web 1-1 前言与导语 导语 好的课程需要包含俩方面: 一:整体的思路与编程思想(大局观,AOP ,10~20%) 二:具体的编程知识与技巧(TP5,小程序,数据库等80%) books+code 1-2 产品所使用的技…

龍兄虎弟 综艺 All In One

龍兄虎弟 综艺 All In One 主持人:張菲、費玉清龍兄虎弟 综艺 All In One主持人:張菲、費玉清精彩片段 https://www.youtube.com/watch?v=fD1MxE9e3Bg&list=PLtww_vcpAB8pJn3goLppo42EDqjt8t1kh完整版 https://www.youtube.com/watch?v=67MJj22yMp0&list=PLRWrniKO…

UWB物理层实现-特殊汉明码纠错

根据802.15.4协议,chapter15.2.7,PHR部分的编码,除了一些控制参数外,在后面添加了6位单错纠正双错检测码(SECDED),用于纠错能力的提升,这6位汉明码为PHR部分提供了至少1bit的纠错能力,以及至少2bit的检错能力。此码块由汉明码构成,与一般汉明码不同的是,改码并没有穿…

NestJS导出API文档

在NestJS中,你可以使用@nestjs/swagger包来定义你的API文档,并且可以很容易地将这些文档转换为API调用。以下是一个简单的例子,展示如何使用NestJS和Swagger来创建一个API文档,并且如何生成API调用。 首先,安装@nestjs/swagger和swagger-ui-express:npm install @nestjs/…

python版本切换

1、搜索框输入:环境变量2、在下面的系统变量:选择path -> 点击:编辑3、将需要的python版本上移到上面,调整好后,一路点击确定关闭几个打开的窗口,保存环境变量配置。3、打开cmd,输入:python --version 确认版本是否切换成功

机器学习期末复习笔记

机器学习期末复习机器学习期末复习笔记 简介 主要注重决策树的计算,朴素贝叶斯,PCA降维的计算 笔记

07相关软件的安装以及HTML介绍

一、内容回顾这个软件从1.0就开始收费了,这里使用这个版本这里将侧边栏打开 这个typora软件支持Markdown的格式,markdown格式是我们经常会使用到的笔记格式的形式,后缀名是md 这种语法在整理笔记是比较方便的 1、标题 加上#号表示是标题,这个和H1,H2...标签类似 加上不同的…

Threejs教程,2024全新系统threejs入门教程

Threejs教程,2024全新系统threejs入门教程 https://www.bilibili.com/video/BV1Zm421g7oi/?spm_id_from=333.999.0.0 2 4 01-theejs三要素 WebGL 顶点数据 顶点索引 矩阵 三要素 场景 Scene 容器 相机 Camera 观察 渲染器Renderer 组合 透视相机(PerspectiveCamera) htt…

命令行下php加载模块

命令行下php加载模块 在命令行下使用 PHP 加载模块,你可以使用 -d 选项来设置 php.ini 中的设置,或者使用 dl() 函数来动态加载 PHP 扩展模块。 例如,如果你想要加载一个名为 my_module.so 的模块,你可以这样做: php -d "extension=my_module.so" script.php &l…