日志文件的理解

news2024/11/28 12:32:46

前言

说实在话我一直对于日志不太理解,感觉这词说的这么高大上,不好理解,甚至还有点畏惧这个东西,所以专门去研究了下,最后发现这家伙不就是输出信息嘛,就像C语言中printf输出的信息,C++中cout输出的信息,又或者java中的System.out.print()输出的信息,就是我们输出的信息
我初开始还以为程序写好后使用日志它就会自己记录信息,感觉很NB;实际上我错了,如果我在程序中不调用相应的函数输出信息你搁哪去收集?这里要说明日志系统本身不能自动生成信息,它只能记录程序员明确指定的输出内容。说白了日志就是规范化的输出信息

正文

我们平常写程序的时候大部分都会调用一些程序来输出一些信息进行调试,这些也可以看成日志信息,但是由于我们一般是东写一块西写一块,而且有时候是哪里有问题就在哪里写;最后的效果就是杂乱无章,极不规范。
规范的日志通常具备以下几个特点:

  1. 结构化的信息:日志信息包括时间戳、日志级别(如INFODEBUGWARNERROR)、日志消息以及可能的上下文信息(如线程ID、文件名、函数名)。
  2. 一致性:日志输出的格式在整个程序中保持一致,便于后续分析和处理。
  3. 易于解析:规范的日志格式有助于自动化工具(如日志分析器)进行解析和处理。
  4. 可配置:日志系统通常允许配置不同的日志级别和输出位置,方便在开发、测试、生产环境中灵活调整。

想要了解日志系统,就要了解日志的五个大方面

1. 日志级别

日志级别用于描述日志消息的重要性或严重性。不同的级别帮助开发者区分和筛选日志信息,以便更好地进行调试和维护。常见的日志级别包括:

  • DEBUG:用于开发和调试阶段,记录详细的调试信息和程序状态。这些信息有助于开发者了解程序的执行过程,但在生产环境中通常不会显示。

    qDebug() << "This is a debug message.";
    
  • INFO:用于记录一般的信息,比如程序运行的状态、进程开始或结束等。这些信息对理解程序的运行情况是有用的,但不涉及错误或警告。

    qInfo() << "This is an informational message.";
    
  • WARNING:用于记录可能会影响程序运行的警告信息。这些信息表明程序可能遇到了问题,但并不会导致程序崩溃。

    qWarning() << "This is a warning message.";
    
  • ERROR:用于记录错误信息,通常表明程序遇到的问题导致了功能失效或其他严重影响。

    qCritical() << "This is an error message.";
    

2. 日志格式

日志格式指的是日志信息的呈现方式(就是高大上的词汇上下文信息),通常包括以下内容:

  • 时间戳:记录日志消息的生成时间,有助于追踪问题发生的时间。

    QDateTime current = QDateTime::currentDateTime();
    qDebug() << current.toString("yyyy-MM-dd HH:mm:ss") << "This is a log message.";
    
  • 日志级别:指明日志的严重性等级,例如 DEBUGINFOWARNINGERROR

  • 线程信息:记录生成日志的线程ID,帮助在多线程程序中追踪日志来源。

    qDebug() << "Thread ID:" << QThread::currentThreadId() << "This is a log message.";
    
  • 源文件和行号:记录日志消息生成的源文件名和行号,方便开发者定位问题。

    qDebug() << __FILE__ << ":" << __LINE__ << "This is a log message.";
    

3. 日志存储

日志存储涉及如何管理和保存日志信息:

  • 日志文件:日志信息通常写入文件中以便持久化和后续分析。

  • 日志轮换:为了避免日志文件过大,日志轮换机制定期创建新的日志文件,并对旧的日志文件进行归档或删除。

    // 使用QFile进行日志轮换
    QFile logFile("app.log");
    logFile.open(QIODevice::Append);
    QTextStream out(&logFile);
    out << "Log entry" << endl;
    
  • 日志归档:定期将旧的日志文件移动到归档目录或进行压缩,以节省空间并保持日志文件的整洁。

4. 日志分析工具

日志分析工具帮助从大量的日志数据中提取有用的信息并进行可视化:

  • ELK Stack (Elasticsearch, Logstash, Kibana):用于收集、存储和可视化日志数据。Elasticsearch存储日志,Logstash处理和转发日志,Kibana用于可视化。

  • Splunk:一个商业化的日志管理和分析平台,提供强大的搜索、监控和分析功能。

  • Grafana:用于可视化日志数据,通常与Elasticsearch等数据源结合使用。

5. 日志钩子和重定向

日志钩子日志重定向用于定制和扩展日志处理:

  • 日志钩子:允许你在日志生成时执行额外的处理,如将日志发送到远程服务器、格式化日志消息等。

    // 自定义日志钩子
    void customLogHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
        // 自定义处理逻辑
        qDebug() << "Custom log handler:" << msg;
    }
    
    qInstallMessageHandler(customLogHandler);
    
  • 日志重定向:改变日志的输出目标,例如将日志从控制台重定向到文件或网络服务。

    // 将qDebug输出重定向到文件
    QFile logFile("debug.log");
    logFile.open(QIODevice::Append);
    QTextStream out(&logFile);
    qDebug() << "Log entry redirected to file.";
    

根据输出信息的位置(就是我将信息输出到哪个地方,比如控制台,文件等),日志可以分为以下几类:

  1. 控制台日志:输出到标准输出或标准错误流的日志,通常用于开发和调试阶段。
  2. 文件日志:记录在磁盘文件中的日志,常用于生产环境,便于后续分析和归档。
  3. 远程日志:通过网络发送到远程服务器的日志,通常用于集中式日志管理和监控。
  4. 系统日志:记录在操作系统提供的日志系统中,如Linux上的syslog或Windows上的事件查看器。

Qt中的日志系统

这里详细介绍日志系统中常见的词汇

日志重定向

日志重定向是指将应用程序的输出(例如stdoutstderr)或日志信息从默认的输出位置(通常是控制台或终端)重定向到其他位置,如文件、网络、数据库或其他日志管理系统。

在Qt中,常见的日志重定向方式包括:

  1. 重定向到文件:将日志输出重定向到一个日志文件,以便后续分析。
  2. 重定向到日志系统:通过网络将日志发送到集中式日志管理系统,如 ELK (Elasticsearch, Logstash, Kibana)。
  3. 重定向到其他接口:将日志信息重定向到特殊的接口或处理函数,用于进一步的自定义处理。

日志钩子

日志钩子(Log Hook)的主要作用是对日志信息进行处理,而不是直接影响程序的执行逻辑。

日志钩子的作用:
  1. 处理和扩展日志信息:可以在日志钩子中添加、修改、格式化日志信息。例如,可以添加时间戳、上下文信息、日志级别等。
  2. 发送日志到不同的地方:通过日志钩子,可以将日志信息发送到远程日志服务器、文件、数据库等地方,而不仅仅是标准输出或文件。
  3. 过滤日志信息:可以在日志钩子中设置条件,决定哪些日志应该被记录、处理或忽略。例如,过滤掉调试级别的日志,仅保留警告和错误信息。
例子:

假设你在程序中设置了一个日志钩子,用于将所有的日志信息发送到远程日志服务器。如果这个钩子工作正常,它会处理所有生成的日志信息,并将其发送到服务器。但即便日志钩子出现问题,程序本身的执行逻辑和结果仍然会继续正常。

日志文件的使用

1. 将日志程序封装成一个独立的可执行文件
  • 方式:将日志程序打包成一个独立的可执行文件,当其他程序需要使用日志功能时,通过系统调用(如 QProcess)启动这个日志程序,并通过进程间通信(如标准输入输出、信号、套接字等)将日志数据发送给日志程序。
  • 优势:这种方式不需要直接集成代码,可以保持日志程序的独立性,并且可以很容易地在不同项目中复用。
2. 通过Qt的插件机制
  • 方式:将日志UI程序封装成一个Qt插件,其他程序可以在需要时加载该插件,将其嵌入到自己的界面中。这种方法适用于想要在主程序的UI中显示日志界面的情况。
  • 优势:插件机制允许你动态加载和显示日志界面,可以灵活控制日志界面的显示与隐藏。
3. 作为一个子窗口或对话框嵌入
  • 方式:将日志UI程序设计成一个可以嵌入的窗口(如 QWidgetQDialog),在其他程序中创建这个窗口并将其添加到现有的UI布局中。
  • 优势:这种方式能够将日志界面直接嵌入到其他程序的界面中,让用户感觉它是原生的一部分。

4. 通过脚本或命令行参数启动日志UI

  • 方式:可以编写一个脚本或通过命令行参数启动日志UI程序,并通过配置文件或环境变量控制其行为和与主程序的交互。
  • 优势:这种方式较为灵活,不需要修改主程序代码即可使用日志UI。

在这里插入图片描述

参考

飞扬青云日志示例程序

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

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

相关文章

【电子通识】开关上的“|”和“0”到底哪个是开?哪个是关?

有的电器、灯具和插座上带有电源开关&#xff0c;开关上会出现“|”和“O”两个符号。如下所示船型开关上就有“|”和“0”。 也有开关用ON/OFF代表开闭。 如果只看符号判断“|”和“O”到底代表什么含义呢&#xff1f;你又能分清哪个是电路连通&#xff0c;哪个是电路断开…

05.震动控制继电器开关

首先先知道控制器的原理 通过继电器来控制电路&#xff0c;比如智能插座&#xff0c;比如 220V 的灯&#xff0c;比如我们项目不带开关的傻瓜式报警器 当设置继电器为低电平触发时&#xff0c; STC89C52RC 的 IO 输出 低电平&#xff0c;就会导致 COM口和NO口闭合 &#xff0c…

LearnOpenGL——点光源阴影笔记

LearnOpenGL——点光源阴影笔记 点光源阴影一、生成深度立方体贴图1. 创建立方体贴图2. 光空间的变换3. 深度着色器 二、万向阴影贴图三、PCF 点光源阴影 点光阴影&#xff08;也叫万向阴影贴图&#xff08;Omnidirectional Shadow Maps&#xff0c;OSM&#xff09;&#xff0…

【乐吾乐大屏可视化组态编辑器】动画按顺序播放

动画按顺序播放 在线使用&#xff1a;https://v.le5le.com/ 如案例所示&#xff0c;通过连线去串联一组动画图元&#xff0c;动画按照顺序向后执行。 ① 首先给每个图元都配置动画&#xff0c;注意这里的动画播放次数一定要配置有限个&#xff08;这里配置都是1次&#xff0…

AI在医学领域:FEDMEKI平台实现在隐私约束下将医学知识整合到基础模型

基础模型已在众多领域掀起了一场革命性的变革&#xff0c;它们在处理多样化模态和复杂任务方面展现出了卓越的能力。以GPT-3和LLaMA为例&#xff0c;这些模型在众多应用场景中均表现出色。其成功的核心在于接触并学习海量的训练数据&#xff0c;从而深入洞察不同领域。借助这些…

【python与java的区别-04(文件流)】

一、文件和目录的操作 1、IO流&#xff08;Stream&#xff09; 通过“流”的形式允许计算机程序使用相同的方式来访问不同的流入/流出源。Stream是从起源&#xff08;source&#xff09;到接收(sink)的有序数据。我们把输入/输出源对比成“水桶”&#xff0c;那么流就是“管道…

企业给排水乙级资质续期:人才储备与补充计划

企业给排水乙级资质续期过程中&#xff0c;人才储备与补充计划是至关重要的环节。以下是一个详细的人才储备与补充计划&#xff0c;旨在帮助企业顺利应对资质续期挑战&#xff1a; 一、人才储备计划 1. 提前规划与预测 政策分析&#xff1a;密切关注住建部门或相关权威机构发…

VirtualBox和VMware的虚拟机ip配置为同一网段不使用wlan的网卡(vulnhub打靶前期准备)

打靶前期准备工作&#xff0c;virtualbox和VMware之间的网络互通&#xff08;即同一个网段下非wlan网卡的设置&#xff09; 首先在打靶的时候因为vulnhub的靶机都是使用的virtualbox的虚拟机&#xff0c;但是我的kali已经用了很久了一直使用的是VMware&#xff0c;突然转换使用…

面试必刷——二叉树习题/面试题详解

&#xff08;1&#xff09;检查两棵树是否相同 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems…

品质更进阶 长安马自达MAZDA EZ-6通关中国“热极”

继在中国规格最高的重庆垫江测试场完成驾控试炼后&#xff0c;8月20日-22日&#xff0c;长安马自达MAZDA EZ-6“众测先享官—品质更进阶”在中国“热极”吐鲁番再次拉开帷幕。针对电动车用户最关心的酷暑天气用车痛点场景&#xff0c;由长安马自达工程师团队携手用户代表、权威…

云微客短视频矩阵获客有多容易?低成本获客备受好评

数字化时代&#xff0c;短视频矩阵已经成为企业获客的重要渠道之一&#xff0c;云微客短视频矩阵系统为企业解决在短视频营销中的账号搭建、内容生产、账号运营、低成本引流等难题。 短视频矩阵是一种基于抖音、快手、小红书、视频号等短视频平台&#xff0c;通过批量剪辑、批量…

Linux shell编程学习笔记72:tr命令——集合转换工具

0 前言 在大数据时代&#xff0c;我们要面对大量数据&#xff0c;有时需要对数据进行整理和转换。 在Linux中&#xff0c;我们可以使用 tr命令来整理和转换数据&#xff0c;也可以进行简单的加解密。 1 tr命令 的帮助信息&#xff0c;功能&#xff0c;格式&#xff0c;选项和…

图片展示时等比例缩放

通过object-fit进行图片等比例缩放 object-fit 属性有以下几种值&#xff1a; contain&#xff1a;图片等比例缩放以完全填充容器&#xff0c;同时保持图像的宽高比。 cover&#xff1a;图片等比例缩放以完全填充容器&#xff0c;但可能会裁剪图片。 fill&#xff1a;图片拉伸以…

AR 眼镜之-系统应用音效-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 系统应用音效 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;初始化 2&#xff09;播放音效 3&#xff09;释放资源 2. &#x1f4a0; 播放音效 2.1 静音不播放 2.2 获取音效默认音量 3. ⚛️ …

一文通透mamba2:力证Transformer are SSM——从SSM、半可分矩阵、SSD到mamba2

前言 实话说&#xff0c;过去一两月一直忙着我司两大类项目的推进 一类是正在逐一上线基于大模型的论文翻译、论文审稿、论文对话、论文修订/润色、论文idea提炼等等一类是正在抓紧做面向一个个工厂的具身智能机器人的解决方案&#xff0c;且很快会分别在我司在各地的办公室(…

day06_算法训练

一. Stream流 1.1 Stream流概述 概念: jdk1.8以后提供的新的API, 主要用于批量操作数据(集合的另外一种操作方式),代码非常简洁 流式处理思想: 2.2 Stream对象获取 1.单列集合的Stream流对象获取 2.双列集合的Stream流对象获取 3.数组的Stream流对象获取 4.散装数据的St…

数据结构day03(栈 Stack 顺序栈、链式栈 )内含具体详细代码实现

目录 【1】栈 Stack 1》栈的定义 2》顺序栈 2》链式栈 4》顺序栈的链式栈的区别 【1】栈 Stack 1》栈的定义 栈&#xff1a;是只允许在一端进行插入或删除的线性表&#xff0c;首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&…

《Python编程:从入门到实践》笔记(一)

一、字符串 1.修改字符串大小写 title()以首字母大写的方式显示每个单词&#xff0c;即将每个单词的首字母都改为大写&#xff0c;其他的改为小写。 upper()将字母都改为大写&#xff0c;lower()将字母都改为小写。 2.合并(拼接)字符串 Python使用加号()来合并字符串。这种合…

Java—认识异常 ( ̄▽ ̄)~*

目录&#xff1a; 一、异常的概念和体系结构&#xff1a; 1、异常的概念&#xff1a; 2、异常的体系&#xff1a; 3、异常的分类&#xff1a; 二、异常的处理&#xff1a; 1、防御式编程&#xff1a; 1&#xff09;、 事前防御型(LBYL) &#xff1a; 2&#xff09;、事后…

C语言典型例题47

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题3.7 输入4个整数&#xff0c;要求按照从小到大的顺序输出 4个数之间进行比较&#xff0c;冒泡排序最最最详细过程&#xff0c;如果想更改为任意数之间相互比较&#xff0c;只需要修改两个地方&#xff08;数组大…