三、日志编写 —— TinyWebServer

news2024/11/24 11:43:30

日志编写 —— 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/1004391.html

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

相关文章

爱尔眼科周进院长出席CCOS 2023并担任学术讲者及培训导师

星城长沙,大咖云集,护航光明,共创未来!9月6日—10日,国内眼科学界最盛大的学术会议——中华医学会第二十七次全国眼科学术大会(CCOS 2023)在湖南长沙隆重举办!逾万名国内外眼科专家、学者代表参加盛会,聚焦眼科发展的新…

骨传导耳机弊端都有哪些?盘点骨传导耳机有哪些缺点!

骨传导耳机有弊端吗?答案是有的!不过由于骨传导耳机的优点大于缺点,所以骨传导耳机的弊端可以忽略不计,下面跟大家说下骨传导耳机都有什么弊端。 1、漏音情况 不管什么耳机,都会存在漏音情况,只是漏音的…

恒运资本:早盘三大指数震荡 减肥药概念再度大涨!

周二(9月12日),A股三大股指震动,涨跌互现。到上午收盘,上证指数涨0.04%,报3144.03点;深证成指涨0.32%,报10415.22;创业板指跌0.10%;沪深两市算计成交额4492.47亿元&#…

C++ 特性模版

目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形…

【SpringCloud微服务项目实战-mall4cloud项目(2)】——mall4cloud-gateway

mall4cloud-gateway网关模块 系统架构与网关介绍网关介绍 网关层代码依赖引入bootstrap配置nacos配置gateway配置处理跨域问题gateway路由断言配置gateway路由过滤配置 总结 代码地址 github地址 fork自github原始项目 gitee地址 fork自gitee原始项目 系统架构与网关介绍 从图…

企业为什么要做网络安全?

网络安全任何人都无法独善其身,无论个个人还是企业或者是高校、机构等,都需要参与到网络安全维护中。 在当今数字化时代,随着互联网的普及和企业信息化程度的提高,网络安全成为了企业运营中不可忽视的重要问题。网络安全指的是通过…

浅谈限流式保护器在高校防火工作的应用

安科瑞 华楠 【摘要】摘要:为了预防火灾和减少火灾带来的危害,保护校园和师生生命财产安全, 建和谐安宁的校园环境,保障学校安全稳定发展,我们必须要时刻拧紧消防安全这弦,时刻注意这根高压线。随着近年来…

RFID标签:实现固定资产全生命周期管理与极速盘点的利器

随着企业规模的扩大和业务的发展,固定资产管理变得越来越重要。然而,传统的手工管理方式往往效率低下、容易出错,无法满足现代企业对高效、准确管理的需求。在这样的背景下,RFID(Radio Frequency Identification&#…

C++项目实战——基于多设计模式下的同步异步日志系统-⑦-日志输出格式化类设计

文章目录 专栏导读日志格式化类成员介绍patrernitems 格式化子项类的设计抽象格式化子项基类日志主体消息子项日志等级子项时间子项localtime_r介绍strftime介绍 源码文件名子项源码文件行号子项线程ID子项日志器名称子项制表符子项换行符子项原始字符串子项 日志格式化类的设计…

2100. 适合打劫银行的日子;2080. 区间内查询数字的频率;1774. 最接近目标价格的甜点成本

2100. 适合打劫银行的日子 核心思想:枚举前后缀。我们只需要预处理到第i天的前后缀,然后枚举一边i即可。最开始的时候我是分开求前后缀的,这里可以把前后缀一起进行处理。 2080. 区间内查询数字的频率 核心思想:二分。其实有一种…

Postman抓包网页请求

安装postman Interceptor谷歌插件 1.点击软件右下角Capture 2.启用代理 设置端口 3.手动点开谷歌插件,开始获取 4.获取结果可以点击进入详情页,查看接口信息

通过Python行命令搭建HTTP服务器结合内网穿透实现外网访问

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 Python作为热度比较高的编程语言,其语法简单且语句清晰,而且python有…

Vue项目中全局变量process的用法解析

一、什么是process process对象是一个全局变量,提供了有关当前Node.js进程的信息并对其进行控制。常用于Vue项目中环境区分,对不同环境的配置不同,例如:根据全局变量区分请求的url地址、是否开始eslint、不同环境的特殊配置等等。…

AiDB: 一个集合了6大推理框架的AI工具箱 | 加速你的模型部署

首发于GiantPandaCV公众号 项目地址: https://github.com/TalkUHulk/ai.deploy.box 网页体验: https://www.hulk.show/aidb-webassembly-demo/ PC: https://github.com/TalkUHulk/aidb_qt_demo Android: https://github.com/TalkUHulk/aidb_android_demo Go Server: https://gi…

[ Linux Audio 篇 ] 音频软件 Audacity 指导手册

音频软件 Audacity 指导手册 背景修订记录双声道提取到单声道查看频响特性查看增益导出Raw数据与作者沟通 背景 对于经常调试音频的开发人员来说,使用Audacity分析音频数据已经成为家常便饭。尤其对于日常使用Ubuntu / Linux等操作系统的开发人员来说,拥…

从构建者到设计者的低代码之路

低代码开发技术,是指无需编码或通过少量代码就可以快速生成应用程序的工具,一方面可降低企业应用开发人力成本和对专业软件人才的需求,另一方面可将原有数月甚至数年的开发时间成倍缩短,帮助企业实现降本增效、灵活迭代。那么&…

华为HCIA学习(一)

文章目录 一.根据考试题总结知识点(一题一点)二.上午学习三.下午学习四.今天只做了70题,需要的可以找我 一.根据考试题总结知识点(一题一点) 二.上午学习 ① VRP系统是VRP是华为公司从低端到高端的全系列路由器、交换…

MySQL数据库20G数据迁移至其他服务器的MySQL库或者云MySQL库

背景:20G的MySQL数据迁移至火山云MySQL库,使用navicat的数据传输工具迁移速度耗费时间过长。 方案一:使用火山云提供的MySQL数据迁移服务(其他大厂应该提供的也有) 方案二:使用数据迁移工具kettle&#x…

【记录贴】使用项目管理软件管理大型复杂项目是种什么体验?

随着手上的几个项目陆续验收交付,现在我又接了一个新项目,这次是一个中大型的软件开发项目。大型项目具有规模大、周期长、团队成员构成复杂、影响因素多等特征,所以我在项目推进过程中遇到了很多困难,想跟大家分享交流下&#xf…

深圳唯创知音电子将参加IOTE 2023第二十届国际物联网展•深圳站

​ 2023年9月20~22日,深圳唯创知音电子将在 深圳宝安国际会展中心(9号馆9B1)为您全面展示最新的芯片产品及应用方案,助力传感器行业的发展。 作为全球领先的芯片供应商之一,深圳唯创知音电子一直致力于为提供高质量、…