关于日志那些事

RDBMS架构:预写日志(Write-Ahead Logging)保证ACID性质 本文主要介绍了关系型数据库管理系统是如何设计以保证事务的原子性、一致性、隔离性以及持久性四大性质。文中的观点为写前日志(即,在任何实际写操作完成之前,先写事务日志)。补充1:如果每次事务日志都直接写入硬盘,就会造成很大的IO消耗。那么,如果将事务日志存储于内存中,这又引发了这样一个问题——可能实际数据已经写入硬盘了,而这时候发生异常了,导致事务日志未正常写入硬盘。针对这一问题,解决方案是这样的——... 阅读详情

关于日志那些事

对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环境中。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。在生产环境中,日志是查找问题来源的重要依据。本文从日志的定义、作用、分类、级别等角度介绍日志。

什么是日志

日志是用来保存系统发生的事件信息和各种对象执行的操作信息的管理对象,日志记录存放于其中。

在计算机领域,日志文件(logfile)是一个记录了发生在运行中的操作系统或其他软件中的事件的文件,或者记录了在网络聊天软件的用户之间发送的消息。 日志记录(Logging)是指保存日志的行为。 最简单的做法是将日志写入单个存放日志的文件。

为什么要使用日志

由于日志通常不属于系统的核心功能,所以常常不被团队成员所重视。对于一些简单的小程序,可能并不需要在如何记录日志的问题上花费太多精力。但是对于作为基础平台为很多产品提供服务的后端程序,就必须要考虑如何依靠良好的日志来保证系统可靠的运行了。系统上线运行时出现bug,通常不能够终止程序进行Debug,只能通过日志来定位查找问题。

还原现场,追溯问题

在系统出现问题或是为了检查系统是否出问题时,我们常常会去查看日志,此种日志多是human-readable 的。可以是格式化的日志,也常见非格式化的日志。例如:Linux系统日志

监视、统计、取证等的分析

用于这种用途的日志很多,例如访问日志、审计日志等。为了方便系统处理分析,多是格式化的数据。例如:服务器安全日志,IIS日志

数据传递

日志也经常用作系统间的信息传递,一个系统的日志可以是另一个系统的输入。譬如,MySQL 的主从间的数据传递就是借助Binlog 的。由于多是系统间的内部信息传递,二进制格式(协议)比较多。btw,由于事务日志,很多数据库本身就是一个日志系统 (“THE LOG IS THE DATABASE”)。

数据备份及恢复

日志也有用于数据的备份的。数据库系统就常有Write-ahead Logging 等事务日志(如Innodb Log)来恢复状态和数据。MySQL 也有做Binlog 备份及恢复的。

好的日志可以帮助系统的开发和运维人员:

  1. 了解线上系统的运行状态
  2. 快速准确定位线上问题
  3. 发现系统瓶颈
  4. 预警系统潜在风险
  5. 挖掘产品最大价值
  6. ……

不好的日志导致:

  1. 对系统的运行状态一知半解,甚至一无所知
  2. 系统出现问题无法定位,或者需要花费巨大的时间和精力
  3. 无法发现系统瓶颈,不知优化从何做起
  4. 无法基于日志对系统运行过程中的错误和潜在风险进行监控和报警
  5. 对挖掘用户行为和提升产品价值毫无帮助
  6. ……

日志的分类

日志从功能来说,可分为诊断日志、统计日志、审计日志。

诊断日志, 典型的有:

  • 请求入口和出口
  • 外部服务调用和返回
  • 资源消耗操作: 如读写文件等
  • 容错行为: 如云硬盘的副本修复操作
  • 程序异常: 如数据库无法连接
  • 后台操作:定期执行删除的线程
  • 启动、关闭、配置加载

统计日志:

  • 用户访问统计:用户IP、上传下载的数据量,请求耗时等
  • 计费日志(如记录用户使用的网络资源或磁盘占用,格式较为严格,便于统计)

审计日志:

  • 管理操作

对于简单的系统,可以将所有的日志输出到同一个日志文件中,并通过不同的关键字进行区分。而对于复杂的系统,将不同需求的日志输出到不同的日志文件中是必要的,通过对不同类型的文件采用不同的日志格式(例如对于计费日志可以直接输出为Json格式),可以方便接入其他的子系统。

日志的级别

对于日志级别的分类,有以下参考:

  • FATAL — 表示需要立即被处理的系统级错误。当该错误发生时,表示服务已经出现了某种程度的不可用,系统管理员需要立即介入。这属于最严重的日志级别,因此该日志级别必须慎用,如果这种级别的日志经常出现,则该日志也失去了意义。通常情况下,一个进程的生命周期中应该只记录一次FATAL级别的日志,即该进程遇到无法恢复的错误而退出时。当然,如果某个系统的子系统遇到了不可恢复的错误,那该子系统的调用方也可以记入FATAL级别日志,以便通过日志报警提醒系统管理员修复;

  • ERROR — 该级别的错误也需要马上被处理,但是紧急程度要低于FATAL级别。当ERROR错误发生时,已经影响了用户的正常访问。从该意义上来说,实际上ERROR错误和FATAL错误对用户的影响是相当的。FATAL相当于服务已经挂了,而ERROR相当于好死不如赖活着,然而活着却无法提供正常的服务,只能不断地打印ERROR日志。特别需要注意的是,ERROR和FATAL都属于服务器自己的异常,是需要马上得到人工介入并处理的。而对于用户自己操作不当,如请求参数错误等等,是绝对不应该记为ERROR日志的;

  • WARN — 该日志表示系统可能出现问题,也可能没有,这种情况如网络的波动等。对于那些目前还不是错误,然而不及时处理也会变为错误的情况,也可以记为WARN日志,例如一个存储系统的磁盘使用量超过阀值,或者系统中某个用户的存储配额快用完等等。对于WARN级别的日志,虽然不需要系统管理员马上处理,也是需要及时查看并处理的。因此此种级别的日志也不应太多,能不打WARN级别的日志,就尽量不要打;

  • INFO — 该种日志记录系统的正常运行状态,例如某个子系统的初始化,某个请求的成功执行等等。通过查看INFO级别的日志,可以很快地对系统中出现的 WARN,ERROR,FATAL错误进行定位。INFO日志不宜过多,通常情况下,INFO级别的日志应该不大于TRACE日志的10%;

  • DEBUG or TRACE — 这两种日志具体的规范应该由项目组自己定义,该级别日志的主要作用是对系统每一步的运行状态进行精确的记录。通过该种日志,可以查看某一个操作每一步的执 行过程,可以准确定位是何种操作,何种参数,何种顺序导致了某种错误的发生。可以保证在不重现错误的情况下,也可以通过DEBUG(或TRACE)级别的日志对问题进行诊断。需要注意的是,DEBUG日志也需要规范日志格式,应该保证除了记录日志的开发人员自己外,其他的如运维,测试人员等也可以通过 DEBUG(或TRACE)日志来定位问题

日志记录哪些信息

理想的日志中应该记录不多不少的信息。

所谓不多,是指不要在日志中记录无用的信息。实践中常见到的无用的日志有:

1)能够放在一条日志里的东西,放在多条日志中输出;

2)预期会发生且能够被正常处理的异常,打印出一堆无用的堆栈;

3)开发人员在开发过程中为了调试方便而加入的“临时”日志

所谓不少,是指对于日志的使用者,能够从日志中得到所有需要的信息。在实践中经常发生日志不够的情况,例如:

1)请求出错时不能通过日志直接来定位问题,而需要开发人员再临时增加日志并要求请求的发送者重新发送同样的请求才能定位问题;

2)无法确定服务中的后台任务是否按照期望执行;

3)无法确定服务的内存数据结构的状态;

4)无法确定服务的异常处理逻辑(如重试)是否正确执行;

5)无法确定服务启动时配置是否正确加载;

通常情况下会遗漏的日志:

  1. 系统的配置参数:系统在启动过程中通常会首先读启动参数,可以在系统启动后将这些参数输出到日志中,方便确认系统是按照期望的参数启动的;
  2. 后台定期执行的任务:如定期更新缓存的任务,可以记录任务开始时间,任务结束时间,更新了多少条缓存配置等等,这样可以掌握定期执行的任务的状态;
  3. 异常处理逻辑:如对于分布式存储系统来说,当系统在一个存储节点上读数据失败时,需要去另一个数据节点上进行重试,可以将读数据失败这件事情记录下来,之后可以通过对日志的分析确认是否某些节点的磁盘可能存在故障。再比如,如果系统需要请求一个外部资源,可以将请求这个外部资源偶尔失败又重试成功这件事情记录下来
  4. 日志中需要记录关键参数,出错时的关键原因等。

如何记录和收集日志

应用程序运行时的产生的各种信息,都应该通过日志 API 来进行记录。很多开发人员习惯于使用 System.out.println、System.err.println 以及异常对象的 printStrackTrace 方法来输出相关信息。这些使用方式虽然简便,但是所产生的信息在出现问题时并不能提供有效的帮助。这些使用方式都应该改为使用日志 API。使用日志 API 并没有增加很多复杂度,但是所提供的好处是显著的。

输出日志需要使用一个或者多个日志框架,这些框架提供了必要的对象、方法和配置来传输消息。Java在java.util.logging包中提供了一个默认的框架。除此之外,还有很多其它第三方框架,包括Log4j、Logback以及tinylog。还有其它一些开发包,例如SLF4J和Apache Commons Logging,它们提供了一些抽象层,对你的代码和日志框架进行解耦,从而允许你在不同的日志框架中进行切换。Java日志框架可以参考文章[4]。

常用的收集日志框架有kafka、flume、logstash等。

日志管理

日志输出到不同的文件

在性能测试时遇到的另一个问题是,当并发量很大时,可能会有一些请求处理失败(如0.5%),为了对这些错误进行分析,需要去查这些错误请求的日志。而由于这种情况下日志量巨大,使得对错误日志的分析变得困难。

这种情况下可以将所有的错误日志同时输出到一个单独的文件之中。

日志文件的大小

日志文件不宜过大,过大的日志文件对于日志监控,问题定位等都会带来不便。因此需要进行日志文件的切分,日志文件应该按天来分割,还是按照小时来分割,应该根据日志量来决定,原则就是方便开发或运维人员能快速查找日志。

为了防止日志文件将整个磁盘空间占满,需要定期对日志文件进行删除。例如,在收到磁盘报警时,可以将两个月以前的日志文件删除。此处比较好的实践是:

  • 将所有日志文件收集起来,这样即使在记录日志的机器上删除,也可以通过收集的日志对之前的问题进行定位;
  • 每天通过定时任务来删除过期日志,如每天在凌晨4点删除60天前的日志

参考:

[1] https://zh.wikipedia.org/wiki/日志文件

[2] http://support.huawei.com/enterprise/docinforeader!loadDocument1.action?contentId=DOC1000156029&partNo=10032

[3] https://zhuanlan.zhihu.com/p/27363484

[4] https://www.cnblogs.com/chanshuyi/p/something_about_java_log_framework.html

物理机centos7系统重启后直接进入dracut Warning: /dev/centos/root does not exist Warning: /dev/mapper/centos-root does not exist 在shell命令行执行以下: dracut:/# lvm vgscan dracut:/# lvm vgchange -ay dracut:/# exit 之后可以正常进入系统(测试正常)。 但是重启之后依然会进入dracut模式,永久解决如下: 查看kernel文件 [root@ecs ~]# ls -ltrh /boot 阅读详情

相关推荐

Kriging代理模型理论相关推导

代理模型,Kriging,加点准则

森屹的博客 1万+

大数据技术笔试题库

一、单选: 1、下列选项中,执行哪一个命令查看Linux系统的IP配置。 A、ipconfig B、find C、ifconfig D、arp -a 2、在MapReduce程序中,map()函数接收的数据格式是()。 A、字符串 B、整型 C、Long D、键值对 3、下列选项中,关于HDFS的架构说法正确的是()。 A、HDFS采用的是主备架构 B、HDFS采用的是主从架构 C、HDFS采用的是从备架构 D、以上说法均错误 4、下列选项中,主要用于决定整个MapReduc

杨校的博客 1万+

FPGA矩阵键盘计算器Verilog实现与Quartus仿真全流程解析

本文详细解析了基于FPGA和Verilog的矩阵键盘计算器实现全流程,包括矩阵键盘扫描、状态机设计、算术运算逻辑及数码管显示驱动。通过Quartus仿真与Testbench测试,确保设计稳定性与准确性,适合数字逻辑设计初学者学习FPGA开发与硬件描述语言应用。

chair的专栏 742

日志文件系统工作原理

文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据(metadata)包括 Superblock、inode bitmap、inode、data block bitmap等,所以写操作无法一步完成,如果其中任何一个步骤被打断,就会造成数据的不一致或损坏。举一个简化的例子,我们对一个文件进行写操作,要涉及以下步骤: 从data block bitmap中分配一个数据块; 在in

不要害怕_Cullen 1822

从SolidWorks到Simulink:手把手教你用URDF文件搭建六轴机械臂仿真模型(含STL文件配置避坑)

本文详细介绍了从SolidWorks到Simulink的六轴机械臂URDF仿真全流程,包括URDF文件导出、Simscape模型生成与调试、动力学参数获取与验证等关键步骤。重点解决了STL文件配置、关节接口设置等工程化难题,帮助开发者高效构建可控制的数字孪生体。通过实战案例和优化技巧,提升机械臂仿真效率与准确性。

weixin_26812607的博客 265

风-车-桥耦合随机振动预测框架:从物理模型到高效代理

本文提出了一种风-车-桥耦合随机振动预测的混合框架,结合物理模型与代理模型实现高效计算。该框架的核心数学本质是时变参数-随机激励-高维动力系统,主要解决三大计算难点:自由度规模悬殊、时变特性和随机性传播。系统采用分层解耦-代理加速的技术路线,底层基于物理模型建立车辆运动方程和桥梁运动方程,上层通过深度学习代理实现随机激励到响应的端到端映射。文中详细介绍了随机激励建模(包括脉动风速和路面不平度)、子系统建模、耦合求解方法,并提供了可运行的Python代码实现。该框架可显著提高风-车-桥系统随机振动分析的效率,

huanghm88的专栏 102

预写式日志(Write-Ahead Logging (WAL))

预写式日志 (WAL) 是一种实现事务日志的标准方法。有关它的详细描述可以在大多数(如果不是全部的话)有关事务处理的书中找到。 简而言之,WAL 的中心思想是对数据文件的修改(它们是表和索引的载体)必须是只能发生在这些修改已经记录了日志之后, 也就是说,在描述这些变化的日志记录冲刷到永久存储器之后。 如果我们遵循这个过程,那么我们就不需要在每次事务提交的时候都把数据页冲刷到磁盘,因为我们知道在出现...

varyall的专栏 9737

【100%通过率】华为OD机试真题 Python 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

诊断日志知多少 | DiagnosticSource 在.NET上的应用

1. 引言最近为了解决ABP集成CAP时无法通过拦截器启用工作单元的问题,从小伙伴那里学了一招。借助DiagnossticSource,可以最小改动完成需求。关于DiagnosticSo...

圣杰 1253

《AgentScope-Java 深入浅出教程》第2章 环境搭建与第一个智能体

创建// 【导入说明】/*** 时间相关工具类* 工具类是普通的 Java 类,通过注解声明为工具。* 智能体可以根据用户需求自动调用这些工具。*/// 【工具定义】获取当前时间@Tool(name = "get_current_time", // 工具名称:LLM 看到的名称description = "获取指定时区的当前时间" // 工具描述:帮助 LLM 理解何时使用// 【参数定义】// @ToolParam 的 name 属性是必需的!

步子哥的博客 417

【100%通过率】华为od机试C卷【特殊的加密算法】Python 实现

有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下1.明文为一段数字串由0-9组成2.密码本为数字0-9组成的二维数组3.需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由相邻的单元格数字组成,上下和左右是相邻的,注意:对角线不相邻,同一个单元格的数字不能重复使用。

MISAYAONE的博客 5924

日志那些事

通常日志数据的时效性较低且数据量较大,因此要定期 rotate,将旧的日志数据做清理或归档。如果归档,可以采用冷热架构,将旧的日志数据归档到冷存储中,以节省存储成本。过多的日志也需要更多的存储空间和更高的查询时间,因此需要谨慎打印。应用日志主要记录系统运行期间发生过的离散事件,用于在分析故障问题时提供上下文,帮助快速定位问题,因此也被称为诊断日志。下面是一个建议的格式。日志产生的时间戳,一般取应用所在机器的本地时间,精确到毫秒。避免打印敏感信息,比如请求中的 token,用户的敏感信息。

艾希射日 931

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 233

关于日志的那些事

原文链接https://www.cnblogs.com/lzxianren/p/log.html 为什么需要日志 因为项目上线后不允许你调试,你只能通过Log来分析问题。项目出问题时,你要能拿出Log证明自己负责的部分没有问题,如果是自己的问题,要从Log里快速找出错误原因。如果没有从Log里找出错误原因,那一定是一件很悲催的事情,特别是在bug不容易重现的情况下。 哪些地方...

qq_40723205的博客 130

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mysql日志那些事

mysql相关日志介绍,看完分析问题你不会找不到地方了

有莘不破的博客 1228

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Electron日志的那些事

介绍 在我们开发一些业务比较复杂的程序时,开发者们往往在重要时刻记录一些日志,这些日志在排查问题的时候,跟踪调用流程时特别有用。因为一旦程序出现问题,如果没有日志,又不能让用户去复现问题的话,我们往往需要大量时间去一步步排查和跟踪,如果有业务日志,就可以根据日志整理出一个业务处理链条,顺着这个业务链条就可以就可以得到程序处理的过程,定位并复现问题。 记录日志并不是一个有难度的工作,但它比较繁琐,有的时候要把日志打印到控制台,有的时候要生成到本地文件中。虽然繁琐但是对于web开发人员来说还不是问题,但是E

qq_39508137的博客 3650

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Mysql的日志那些事

Mysql中日志还是挺多的,主要包含以下几个常用的日志:binlog:归档日志, Server层的日志。redo log:重做日志,InnoDB存储引擎层的日志。undo log:回滚日志...

架构师小秘圈 147

日志输出的那些事

打日志是门艺术 日志是用来暴露系统内部状态的一种手段,好的日志可以帮助开发人员快速定位问题所在,然后找到合适的方式解决掉问题,一个优秀的日志输出不会包含无用输出,也不会缺少任何有用信息。然而现在的日志框架(log4j, logrus等众多框架库)是按照等级划分日志的。那么如果选择等级,输出什么样的信息就是我们需要认真思考。 大多数系统中日志的问题 日志过度 日志过度理论上会包含所有需要输出的信息,不仅是对系统暴露有用的,也有对暴露系统无用的,这些日志慢慢累积,最终会冲爆日志存储方。过多的日志主要原因是输出了

人猿进化论 791

Java日志那些事

日志系统的发展 我们日常接触到的日志系统有很多种,log4j,JUL(jdk自带),logback等,我们可以直接根据对象的日志API进行使用。但是考虑到API各不相同,所以出现了JCL(Jakarta Commons Logging)、slf4j等日志API框架。日志API框架只是统一的API,其底层的具体的日志记录工作还是由log4j...

weixin_33897722的博客 72

日志的那些事

虽然阿里云日志有7层负载,但是阿里云日志只是看到参数不全,所以需要在项目中拦截并写入access.log中,并通过filebeat+es+kibana完整查看,对es数据进行一定时间删除环境:springcloud项目,gateway服务中处理具体过程 将数据按照特定格式写入access.log中,通过filebeat进行采集指定路径下的日志并写入到es中,最后通过kibana展示 仿照 logback-access ,定义要收集的字段,开发过滤器收集字段,自定义 logstash.yml。 收集到.

感冒石头的博客 383

关于日志过滤那些事

awk是一个非常强大的工具,对于在shell脚本当中,是非常好用的。awk可以内置函数。能够非常熟悉使用awk的功能的人,需要一定的工作经验和联系才行

weixin_42816196的博客 724

日志那点事

日志是用于记录程序运行轨迹,在开发环境我们可以使用IDEA或者eclipse开发工具的Debug模式进行调试来查找bug,但是在测试环境或生产环境,是无法进行debug调试的,这时就需要打印日志来记录程序运行轨迹来帮忙查找问题。 在spring项目中,我们常使用logback+log4j框架来打印日志,log4j日志常使用的有DEBUG/INFO/WARN/ERROR四个等级,如...

u012661248的博客 239

说说Java日志那些事

日志是每个应用程序在开发的过程中必不可少的组件,通过日志输出可以获取项目的一些运行信息,监控项目的运行指标等,同时,通过学习Java日志框架还可以学习到桥接器与适配器模式等。

qq_43750656的博客 695

Spring boot日志相关的那些事

为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以便定位问题。 设计思想 1、System.out.println("");将关键数据打印在控制台;去掉?写在一个文件? 2、框架来记录系统的一些运行时信息;日志框架 ; zhanglogging.jar; 3、高大上的几个功能?异步模式?自动归档?xxxx? zhanglogging-good.jar? 4、将以前框架卸下来?换上新的框架,重新修改之前相关的API;zhanglogging-prefect.jar; 5、

qq_36194388的博客 151

log日志乃些事

1)选择正确的Log开源框架 Log4J中我们会这样写: log.debug("Found " + records + " records matching filter: '" + filter + "'"); 而在SLF4J中我们会这样写: log.debug("Found {} records matching filter: '{}'", records, filter);...

土豆编程 143
上一篇: IDEA中使用Spark SQL 连接Hive
下一篇: leetcode 341.Flatten Nested List Iterator
agent_x
博客等级 码龄12年 8粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值