四、日志编写 —— TinyWebServer

news2024/12/23 16:50:17

日志编写 —— TinyWebServer

一、 前言

上期已经写完lock类的编写。这期是日志的编写。
对于日志需要弄懂几个基本概念才可以更好的理解和编写日志。

  1. 什么是日志?
  2. 常用的日志级别有哪些?
  3. 日志的基本格式是什么?
  4. 异步日志类刷新缓冲区的作用
  5. 同步和异步编写日志是什么意思?
  6. 什么是单例模式?
  7. 为什么使用单例模式?
  8. 单例模式的有哪几种常见的实现方式?

这些都是笔者作为小白刚开始不明白的点。如有其他问题,欢迎留言讨论!

二、问题回答

Ⅰ、什么是日志?

日志,由服务器自动创建,并记录运行状态,错误信息,访问数据的文件。

Ⅱ、常用的日志级别有哪些?

  • DEBUG(调试): 用于记录详细的调试信息,通常只在开发和调试阶段使用,以帮助开发人员识别和解决问题。这些日志通常包含程序的内部状态和变量值。

  • INFO(信息): 用于记录程序运行时的一般信息,如应用程序的启动和关闭,重要事件的发生,以及一些关键操作的结果。INFO级别的日志通常用于跟踪应用程序的正常运行。

  • WARNING(警告): 用于记录可能会影响应用程序正常运行但不是致命的问题。警告级别的日志通常表示潜在的问题或异常情况,但应用程序仍然可以继续运行。

  • ERROR(错误): 用于记录错误事件,这些事件可能会导致应用程序无法正常运行或无法执行关键操作。ERROR级别的日志通常需要开发人员注意和干预。

  • CRITICAL(严重): 用于记录严重的错误事件,这些事件可能会导致应用程序崩溃或无法继续运行。CRITICAL级别的日志通常表示需要立即采取行动来修复问题。

  • FATAL(致命): 有些日志系统中还包括FATAL级别,通常与CRITICAL级别类似,表示应用程序遇到了不可恢复的错误,需要立即处理。

当前项目涉及只有前4个级别

Ⅲ、日志的基本格式是什么?

  • 时间戳: 记录日志事件发生的日期和时间,通常以标准的日期时间格式表示,例如ISO 8601格式(例如:2023-09-12T14:30:00Z)。

  • 日志级别: 指示日志消息的严重性和紧急程度,如DEBUG、INFO、WARNING、ERROR或CRITICAL。

  • 日志来源: 指示生成日志消息的组件、模块或系统的名称,以便识别日志消息的来源。

  • 消息内容: 包含描述日志事件的具体信息,通常是一段文本,可以包括有关事件的详细信息、错误消息、警告或其他相关数据。

  • 附加数据: 可选项,包括与日志事件相关的附加数据,通常以键值对的形式表示,用于提供更多上下文信息。例如,可以记录特定变量的值或事件的其他相关属性。

以下是一个简单的示例日志条目,展示了上述元素的基本格式:

2023-09-12T14:30:00Z INFO MyApp - User 'Alice' logged in successfully.

四、异步日志类刷新缓冲区的作用

  1. 减少I/O开销: 异步日志通常会将日志消息先存储在内存缓冲区中,然后异步地将缓冲区中的日志数据写入磁盘或其他存储介质。这可以降低频繁的磁盘I/O操作,提高性能,因为磁盘I/O通常是相对较慢的操作。但如果不及时刷新缓冲区,可能会导致大量的日志数据滞留在内存中,增加了在刷新时的I/O负担。

  2. 确保日志完整性: 如果不定期刷新缓冲区,而是等待程序结束时才刷新,那么在程序崩溃或非正常退出时,可能会丢失尚未刷新的日志数据。手动刷新缓冲区可以确保在应用程序的不同阶段或在异常情况下,已经写入缓冲区的数据会被及时写入磁盘,以保持日志的完整性。

  3. 日志实时性要求: 某些应用程序对日志消息的实时性有较高的要求,即要求日志消息能够立即写入磁盘或其他存储介质,以便实时监控或审计。在这种情况下,手动刷新缓冲区是确保日志消息及时写入的重要步骤。

要注意的是,在异步日志类中,刷新缓冲区的时机通常由一定的策略或触发条件来确定,而不是在每条日志消息之后都手动刷新。常见的策略包括:

  • 定时刷新: 定期刷新缓冲区,以确保日志数据定期写入磁盘。例如,每隔一定时间或每秒刷新一次。

  • 缓冲区大小限制: 当缓冲区达到一定大小时,自动触发刷新操作,以避免缓冲区过大。

  • 关闭程序前刷新: 在程序即将正常关闭时,确保将缓冲区中的数据刷新到磁盘。

刷新缓冲区是异步日志实现中的一个重要设计考虑,以平衡性能和日志数据的可靠性和实时性。不同的应用场景和性能需求可能会导致不同的刷新策略。

Ⅴ、同步和异步编写日志是什么意思?

  1. 同步写日志:
  • 同步写日志是指在应用程序的执行流程中,当发出日志消息时,程序会等待日志消息被写入到目标存储(通常是文件或数据库)之后才继续执行后续操作。
    这意味着应用程序在记录每条日志消息时会阻塞,直到写入操作完成,然后才能继续执行。
  • 同步写日志可以保证日志消息的完整性和可靠性,但可能会对应用程序的性能产生负面影响,特别是在高并发或高吞吐量的情况下。
  1. 异步写日志:
  • 异步写日志是指在应用程序的执行流程中,当发出日志消息时,程序不会等待日志消息被写入到目标存储,而是立即继续执行后续操作。
  • 写入日志消息的操作会在后台或独立线程中进行,以减少对主应用程序的性能影响。
  • 异步写日志通常更适合高性能要求的应用程序,因为它可以减少因等待磁盘或网络写入操作而引起的延迟。

选择同步或异步写日志取决于应用程序的需求和性能要求:

  • 如果应用程序要求高可靠性和确保每条日志消息都被记录,并且性能要求不是首要考虑因素,那么同步写日志可能更合适。

  • 如果应用程序对性能有较高的要求,可以容忍一些日志消息可能丢失或延迟写入,那么异步写日志可能更适合,因为它可以减少对应用程序性能的影响。

一种常见的异步写日志策略是使用缓冲区,将多条日志消息先存储在内存中,然后定期批量写入到目标存储,以减少写入操作的频率,提高性能。不过需要注意的是,在异步写日志中,应该小心处理异常情况,以确保不会丢失重要的日志信息。
这里引用社长的图。这下大家应该都明白了
在这里插入图片描述

Ⅵ、什么是单例模式?

最常用的设计模式之一,保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

Ⅶ、为什么使用单例模式?

使用单例模式的日志记录类可以确保在整个应用程序中一致地使用和管理日志记录,提高了代码的可维护性和可扩展性。同时,它还可以帮助您更好地控制日志记录的配置和性能。

Ⅷ、单例模式的有哪几种常见的实现方式?

懒汉式和饿汉式是最常见的两种实现方式

  1. 懒汉式(Lazy Initialization): 在第一次请求实例时才创建实例,延迟初始化
  2. 饿汉式(Eager Initialization): 在类加载时就创建实例,立即初始化。

三、代码结构分析

要写好这个项目,应该要以以下的思路去编写

  1. 这个项目既可以同步又可以异步。其中异步需要使用阻塞队列。

  2. 阻塞队列的实现

    • 引入"locker.h" : 阻塞队列,在添加到阻塞队列和写入到文件的时候,肯定只允许一个线程操作。多个线程同时会让数据错误。
    • 使用模板: 阻塞队列不确定要写的是什么类型的数据,所以用模板。
    • 成员函数: 现在的长度、最大长度、头、尾、循环队列
    • 成员变量: 构造函数、析构函数、获取头元素、获取尾元素、判空、判满、增加、头删、定时头删、清空
  3. 日志的实现

    • 引入"block_queue.h" :

    • 使用单例模式: 这里使用的是懒汉模式

    • 使用可变参数宏: 灵活且方便的方式来处理不同数量和类型的日志消息。

    • **成员函数:**构造函数、析构函数、同步写、异步写、初始化、缓冲区刷新

    • 成员变量:

      • 写入文件相关:

        1. 打开log的文件指针
        2. 路径名
        3. log文件名
        4. 日志最大行数
        5. 日志行数记录
        6. 日志缓冲区大小
        7. 因为按天分类,记录当前时间是那一天
      • 是否同步标志位

      • 阻塞队列

      • 关闭日志

具体的代码实现,看仓库就可以了。就不赘诉了。

四、下期预告

数据连接池的编写

五、最后

如有帮助,求赞!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚幻4学习笔记(12)操控导入的角色、动画蓝图、播放蒙太奇和打包、角色重定向

虚幻4学习笔记 操控导入的角色设置鼠标旋转关掉动态模糊 动画蓝图、播放蒙太奇和打包角色走路奔跑动画shift 奔跑F 跳舞移动打断 跳舞 打包角色重定向姿势调整解决跑步 腿分太开隐藏剑 B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 操控导入的角色…

FreeSWITCH 1.10.10 简单图形化界面10 - 鼎兴FXO网关SIP注册公网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面10 - 鼎兴FXO网关SIP注册公网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关呼叫路由(呼入及…

Eclipse搭建struts2框架

新建动态web项目; 输入项目名称; New Runtime后选择如下, 选择tomcat的安装目录; 然后如下,完成; 当前的目录结构如下;之前要配置好java环境; 如果创建项目时没有选中生成web.xml&am…

人工智能学习1

文章目录 人工智能人工智能的诞生人工智能的发展历程人工智能与机器学习的关系 机器学习机器学习的发展历程讨论机器学习的必要性机器学习的定义机器学习的三要素机器学习的基本概念作业 人工智能 人工智能的诞生 人工智能诞生于一群科学家想使用机器模拟人类思维或者人类智能…

黑马JVM总结(十二)

(1)五种引用_强软弱 实线箭头表示强引用,虚心线表示软弱虚终结器引用 在平时我们用的引用,基本都为强引用 ,比如说创建一个对象通过运算符赋值给了一个变量,那么这个变量呢就强引用了刚刚的对象 强引用的…

Linux 磁盘挂载 磁盘卸载

挂载: 虚拟机中本来是没有光盘,但是有复刻的镜像文件,不影响我们挂载,当我们将镜像设备挂载到固定的目录下后,我们就可以通过访问目录,来查看镜像文件中的内容。 1. 创建挂载点: 一般虚拟设备上…

Java进化史:从Java 8到Java 17的语言特性全解析

文章目录 Java 8:引入Lambda表达式和Stream APILambda表达式Stream API Java 9:模块化系统模块Jigsaw项目 Java 10:局部变量类型推断Java 11:引入HTTP客户端HTTP客户端 Java 12:引入Switch表达式Switch表达式 Java 13到…

为什么学鸿蒙HarmonyOS——兴趣使然,HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统

为什么学鸿蒙HarmonyOS 为什么学鸿蒙的诞生鸿蒙的未来鸿蒙OS典型案例鸿蒙是分布式操作系统总结参考学习资料 为什么学 兴趣使然,了解了一下鸿蒙系统的历史,是AIOT系统,是中国的未来的核心系统 鸿蒙:HarmonyOS是一款面向万物互联时…

antd a-list 添加分页

会分为三部分 template <a-list item-layout"horizontal" :data-source"localData" :pagination"{...paginationProps,current:currentPage}"><a-list-item slot"renderItem" slot-scope"item"><a-list-ite…

伪原创工具-好用的伪原创软件有哪些特征

在这个信息爆炸的时代&#xff0c;我们每天都要处理大量的文字信息&#xff0c;不管是在学校里写作业&#xff0c;还是在工作中处理文件。有时候&#xff0c;为了节省时间和精力&#xff0c;我们会考虑使用一些文章伪原创工具。 什么是文章伪原创&#xff1f; 让我们来明确一…

Netty(二)NIO-入门

Netty 入门 1. 概述 1.1 Netty Netty是一个异步的&#xff0c;基于事件驱动的网络应用框架&#xff0c;用于快速开发可维护&#xff0c;高性能的网络服务器和客户端 Cassandra&#xff0c;Spark&#xff0c;Hadoop&#xff0c;RocketMQ&#xff0c;ElasticSearch&#xff0c…

【小沐学写作】程序员必备技能:在线协作文档汇总

文章目录 1、简介2、微软Office在线文档2.1 功能简介2.2 使用费用2.3 用户体验 3、石墨文档3.1 功能简介3.2 使用费用 4、腾讯文档4.1 功能简介4.2 使用费用 5、语雀5.1 功能简介5.2 使用费用 6、飞书6.1 功能简介6.2 使用费用 7、印象笔记7.1 功能简介7.2 使用费用 结语 1、简…

解决xinput1_3.dll丢失的终极方法!快来尝试这4个方法吧!

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一个重要的组成部分&#xff0c;它们负责在程序和操作系统之间共享代码和数据。然而&#xff0c;当xinput1_3.dll丢失时&#xff0c;可能会导致一系列的问题&#xff0c;如系统运行缓慢、应用程序无法启动等…

当下最好不要碰PCIe 5.0 SSD

为了追求高性能&#xff0c;现在说到SSD&#xff0c;大家基本都想要买NVME PCIE SSD。PCIE SSD在消费端、云市场、数据中心的占比均在继续攀升。 截至目前&#xff0c;虽然PCIe 5.0已经发布已经过去4年&#xff0c;但是整个生态并没有很繁荣。当前主流市场还是PCIe 3.0和PCIe 4…

【算法】二分答案(TODO)

文章目录 相关链接什么时候使用二分答案&#xff1f;题目列表最大化最小化相关题目列表&#x1f4d5;2439. 最小化数组中的最大值解法1——二分答案解法2——分类讨论O(n) 2513. 最小化两个数组中的最大值&#xff08;二分答案lcm容斥原理&#xff09;&#x1f402;好题&#x…

VS code 下 makefile 【缺少分隔符 停下来】 报错解决方法

首先来看报错的makefile源码 再来看报错的信息&#xff1a; 第5行缺少分隔符&#xff0c;其实不止是第5行&#xff0c;只要是前面需要加tab留白的行都会报这个错误&#xff0c;比如说第7行第11行 编译的时候&#xff0c;前面的留白必须是按tab键生成的 但是&#xff01;&…

成为一个优秀的程序员必读书目有哪些?

首推一本刚刚出版的新书&#xff1a; 程序员的制胜技 新手程序员的生存指南&#xff0c;教你如何将理论转化为实践技能&#xff0c;解决编程工作中的挑战&#xff0c;拥有实战智慧&#xff0c;成为开发高手&#xff01; 作者20多年实战经验的结晶&#xff0c;新手程序员的生存…

从HTTP到HTTPS:网站安全通信的演进之路

HTTP协议与TCP/IP协议族内的其他协议相同部分&#xff0c;用于客户端和服务器端的通信。下面来看一下HTTP具体是怎么工作的。 1、HTTP前生今世 在HHTP/0.9版本&#xff0c;主要是通过确立了客户端请求、服务器端响应的通信流程来解决HTML文件传输&#xff0c;只能获取文本资源…

xen-trap

Xen-Trap xen的虚拟化实现有一个很重要的机制就是tarp&#xff0c;中文可以暂且叫做陷入。在ARMv8中&#xff0c;trap就是异常等级的一个切换。 当发生trap的时候&#xff0c;就会进入设定好的异常向量表中&#xff0c;硬件自动判断属于哪种类型的异常。 一、异常处理 ARM…

天然气跟踪监管系统信息更新

天然气跟踪监管系统信息更新 ① 新增仓库&#xff0c;第一步&#xff0c;“编辑仓库”对话框新增栏第二步&#xff0c;提交jQuery序列化新增仓库的form表单第三步&#xff0c;新增仓库成功第一步&#xff0c;创建编辑对象第二步&#xff0c;获取仓库修改后的几何图形及面积数据…