日志的规范
-
确定日志级别: 确保你的系统有一个明确的日志级别策略。通常,日志级别包括DEBUG,INFO,WARN,ERROR和FATAL。DEBUG级别的日志记录所有详细信息,适用于开发和调试环境。INFO级别的日志记录常规操作信息,如系统启动和停止。WARN级别的日志记录可能会引发问题的情况。ERROR级别记录那些阻止系统操作的问题,而FATAL级别记录那些导致系统崩溃的严重错误。
-
日志的清晰性: 确保你的日志消息清晰、简洁且易于理解。避免使用专业术语和复杂的技术语言。尽可能地使用简单的语言来描述问题,以便任何人都能理解日志的内容。
-
记录关键动作: 记录所有关键的系统或业务操作。例如,用户登录和注销、系统状态变更、数据库操作、远程API调用等。这不仅有助于调试问题,而且有助于了解系统的运行情况。
-
保持完整性: 确保日志记录了足够的信息,以便在发生问题时可以恢复现场。例如,如果一个操作失败,除了记录失败的消息和错误代码,还应记录失败前后的系统状态,以及导致失败的输入数据。
-
日志格式的一致性: 无论是在单个应用程序中,还是在分布式系统中,都应该使用一致的日志格式。这样可以方便日志的解析和分析,也便于使用日志分析工具。可以采用一些通用的日志格式,如JSON。
-
避免记录敏感信息: 在日志中不要记录敏感信息,如用户密码,信用卡号,身份证号等。如果需要记录,也要对敏感信息进行脱敏或加密处理,以保护用户隐私和系统安全。
-
设定日志的保留策略: 你需要设定一个明确的日志保留策略,例如日志文件的最大大小、日志文件的最长保留时间、日志文件的备份策略等。这样可以防止日志文件占用过多的磁盘空间,同时也可以保证在需要时可以查看历史日志。
-
错误追踪: 如果在应用中有错误或异常发生,确保在日志中记录错误的栈轨迹。这将有助于快速定位错误发生的源头。同时,对于重复发生的错误,应该有特定的标记,以便于统计和分析。
-
使用日志库: 使用成熟的日志库,如Log4J、SLF4J、Logback等,可以方便的进行日志级别控制、日志格式化、日志文件滚动等操作,同时这些日志库通常性能优良,不会对应用性能产生太大影响。
-
实时监控和报警: 配置实时的日志监控和报警系统,对于重要的错误和异常,应该及时发出报警通知,以便开发人员尽快处理。例如,可以使用ELK(Elasticsearch,Logstash,Kibana)堆栈进行日志集中管理和实时分析。
-
合理分割日志文件: 当日志文件过大时,查找信息会变得困难。你可以使用日志库的滚动策略,每天、每小时或者达到一定大小时,创建一个新的日志文件。
-
日志的上下文信息: 尽可能在日志中包含上下文信息,例如,用户ID,操作类型,操作对象等。这样,当问题发生时,我们可以更好地理解问题的背景。
-
使用唯一请求ID: 对于每个用户请求,生成一个唯一的请求ID,并在日志中记录。这样可以方便地追踪和分析一个请求在系统中的完整执行路径和执行情况。
-
结构化日志: 尽量使用结构化日志,例如JSON,而不是纯文本日志。结构化日志更方便机器处理,便于日志分析和可视化。
-
记录性能指标: 对于关键操作,可以在日志中记录操作的开始时间和结束时间,以及操作的执行时间。这样可以帮助我们了解系统的性能,及时发现性能问题。
-
避免冗余记录: 防止日志中出现重复或冗余信息。避免在多个地方记录相同的信息,以减少日志的大小和提高日志的阅读性。
-
考虑日志的可读性: 使用易于理解的语言和格式,使得日志即使在没有任何背景信息的情况下也容易阅读。避免使用复杂的编码和缩写。
-
日志应适应变更: 确保你的日志策略可以容易地适应系统的变更。例如,当添加新的功能,修改既有的功能,或者更换新的硬件时,不需要大规模地改变日志策略。
-
日志级别的灵活配置: 在不同的环境和场景下,可能需要不同的日志级别。例如,在开发环境和测试环境中,可能需要更详细的DEBUG级别的日志,而在生产环境中,通常只需要INFO级别或WARN级别的日志。因此,日志级别应该可以通过配置灵活地改变,而不需要修改代码。
-
有序的时间戳: 确保你的日志条目包含有序的时间戳,这样可以帮助你理解事件的发生顺序。在分布式系统中,你可能需要使用某种同步机制,以确保所有服务器的日志时间戳的一致性
-
日志安全性: 在存储和传输日志时,应确保日志的安全,防止日志被未经授权的人员访问或篡改。
-
记录操作结果: 对于用户的操作,应记录其结果,如成功或失败,以及失败的原因。
-
记录重要决策: 在程序中,如果有重要的决策逻辑,如分支选择,应在日志中记录决策的理由和结果。
-
记录资源使用情况: 可以在日志中记录系统的资源使用情况,如内存,CPU,磁盘等,这对于性能调优和故障排查非常有用。
-
记录系统的状态变更: 如果系统的状态发生了重要的变更,应在日志中记录,如系统启动,系统停止,服务上线,服务下线等。
-
记录关键业务操作: 对于关键的业务操作,如交易,付款等,应详细记录其操作流程和结果。
-
使用专用的日志服务器: 可以考虑使用专用的日志服务器,对日志进行集中管理,这样可以更方便地查看和分析所有服务器的日志。
-
使用机器学习进行日志分析: 可以使用机器学习技术,对日志进行自动化的分析,如异常检测,趋势预测等。
-
日志的可查询性: 日志应该便于查询,可以使用关键字,时间范围,日志级别等进行快速查找。
-
日志的实时性: 对于重要的日志,应该能够实时查看,而不需要等到日志文件关闭后才能查看。
-
记录网络通讯: 对于网络通讯,如请求和响应,应在日志中记录其关键信息,如URL,参数,头信息,状态码等。
-
错误日志的详细程度: 为了方便排查问题,错误日志应该足够详细,包括错误的类型,位置,原因等信息。
-
记录用户行为: 可以在日志中记录用户的操作,如登录,注销,点击等,这对于用户行为分析和产品优化非常有用。
-
日志的归档: 对于历史的日志,应进行归档,以减少存储空间,同时也便于历史数据的查阅。
-
记录系统的配置信息: 在系统启动时,可以在日志中记录系统的配置信息,如版本号,配置参数等。
-
记录服务的响应时间: 对于服务的调用,可以在日志中记录其响应时间,这对于服务性能的监控非常有用。
-
记录数据库操作: 对于数据库的操作,如SQL语句,可以在日志中记录,这对于数据库性能优化和故障排查非常有用。
-
日志的自动化处理: 对于日志,应进行自动化的处理,如清理,归档,分析等,以减少人工操作的负担。
-
日志的灾备: 对于重要的日志,应进行备份,以防止日志的丢失。
-
记录系统的负载情况: 可以在日志中记录系统的负载情况,如并发数,队列长度等,这对于系统性能的监控非常有用。
相关文章:
日志的规范
确定日志级别: 确保你的系统有一个明确的日志级别策略。通常,日志级别包括DEBUG,INFO,WARN,ERROR和FATAL。DEBUG级别的日志记录所有详细信息,适用于开发和调试环境。INFO级别的日志记录常规操作信息&#x…...
Spring AOP(AOP概念,组成成分,实现,原理)
目录 1. 什么是Spring AOP? 2. 为什么要用AOP? 3. AOP该怎么学习? 3.1 AOP的组成 (1)切面(Aspect) (2)连接点(join point) (3&a…...
Android WebView简单应用:构建内嵌网页浏览功能
在现代移动应用开发中,内嵌网页浏览功能是许多应用程序的常见需求。Android平台提供了WebView组件,它允许开发者将网页内容嵌入到应用中,并提供了丰富的功能和定制选项。本文将介绍如何在Android应用中使用WebView组件,帮助您快速…...
并发——乐观锁常见的两种实现方式,乐观锁的缺点
文章目录 乐观锁常见的两种实现方式1. 版本号机制2. CAS算法 乐观锁的缺点1 ABA 问题2 循环时间长开销大3 只能保证一个共享变量的原子操作 乐观锁常见的两种实现方式 乐观锁一般会使用版本号机制或CAS算法实现。 1. 版本号机制 一般是在数据表中加上一个数据版本号version字段…...
Spring 事务管理
目录 1. 事务管理 1.1. Spring框架的事务支持模型的优势 1.1.1. 全局事务 1.1.2. 本地事务 1.1.3. Spring框架的一致化编程模型 1.2. 了解Spring框架的事务抽象(Transaction Abstraction) 1.2.1. Hibernate 事务设置 1.3. 用事务同步资源 1.3.1…...
unity修改单个3D物体的重力的大小该怎么处理呢?
在Unity中修改单个3D物体的重力大小可以通过以下步骤实现: 创建一个新的C#脚本来控制重力: 首先,创建一个新的C#脚本(例如:GravityModifier.cs)并将其附加到需要修改重力的3D物体上。在脚本中,…...
[Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果
说明 我们知道QWidget等设置了this->setWindowFlags(Qt::FramelessWindowHint);后无法移动和调整大小,但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求,并且在Windows 10上有Aero效果。 先看一下效果…...
【API生命周期看护】API日落
一、基本概念 在API的整个生命周期中,不可能是永远不变的。功能可能有变动、服务也可能有升级迭代,这个时候对外的能力入口:API自然也需要改变。 一般来说,API的变动是不可以引入兼容性问题的,也即不管做什么变动&am…...
PHP 使用ThinkPHP实现电子邮件发送示例
文章目录 首先我们需要设置我们的邮箱客户端授权,获取到授权码找到我们的邮箱设置去账号中找到这一堆服务,找到后开启smtp服务开启服务后管理服务 接下来需要去下载相应的第三方类库(我这里使用的是PHPMailer)在thinkPHP中封装一下邮件服务类实际调用效果…...
Leetcode-每日一题【剑指 Offer 18. 删除链表的节点】
题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调…...
[LINUX使用] top 命令的使用
COLUMNS150 LINES100 top 序号 是否为启动命令 命令模板 详解 1 no vh 帮助 2 yes -d 0.01 0.01秒的间隔刷新top输出 3 no c COMMAND列切换 4 yes -e [k | m | g | t | p] 以何种计量单位显示内存列 k-kb,m-mb,g-gb,t-t…...
通过redis进行缓存分页,通过SCAN扫描进行缓存更新
问题:当我们要添加缓存时,如果我们用了PageHelper时,PageHelper只会对查询语句有效(使用到sql的查询),那么如果我们把查询到的数据都添加到缓存时,就会无法进行分页; 此时我们选择将…...
C#小轮子 Debug,Release,发布模式如何运行不同的代码
文章目录 前言C#运行模式运行模式介绍三种模式区分代码 前言 编译模式和发布模式的代码不一样是非常正常的。比较常见的是数据库不一样。编译测试数据库和发布真实的数据库地址不一样。 C#运行模式 运行模式介绍 运行模式有三种: Debug 不进行优化,…...
【【萌新的STM32 学习-6】】
萌新的STM32 学习-6 BSP 文件夹,用于存放正点原子提供的板级支持包驱动代码,如:LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹,不过可以先建好备用。 CMSIS 文件夹,用于存放 CMSIS 底层代码(ARM 和 ST…...
“深入解析JVM:探索Java虚拟机的工作原理“
标题:深入解析JVM:探索Java虚拟机的工作原理 摘要:本文将深入解析Java虚拟机(JVM)的工作原理,从字节码到执行过程,从内存模型到垃圾回收机制,逐步剖析JVM的核心组成部分和工作原理。…...
【目标检测系列】YOLOV2解读
为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…...
【深入浅出程序设计竞赛(基础篇)第一章 算法小白从0开始】
深入浅出程序设计竞赛(基础篇)第一章 算法小白从0开始 第一章 例题例1-1例1-2例1-3例1-4例1-5例1-6例1-7例1-8例1-9例1-10例1-11 第一章 课后习题1-11-21-31-4 第一章 例题 例1-1 #include<iostream> using namespace std;int main(){cout <&…...
openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句
文章目录 openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句36.1 语法格式36.2 参数说明36.3 示例 openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句 清理表数据,TRUNCATE TABLE用于删除表的数据,但不删除表结构。也可以…...
ChatGPT生成文本检测器算法挑战大赛
ChatGPT生成文本检测器算法挑战大 比赛链接:2023 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 1、数据加载和预处理 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, cross_val_predict from sklearn.linea…...
O2OA开发平台实施入门指南
O2OA(翱途)开发平台,是一款适用于协同办公系统开发与实施的基础平台,说到底,它也是一款快速开发平台。开发者可以基于平台提供的能力完成门户、流程、信息相关的业务功能开发。 既然定位为开发平台,那么开…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
