【Linux】简易日志工具项目

在这里插入图片描述

有些鸟儿是不应该被关在笼子里的,
因为他们的羽毛太丰润了。
当他们飞走,你会由衷地庆贺他获得自由。
--- 肖申克的救赎》---

1 日志

日志(Log)是记录软件运行过程中发生的事件、状态变化和错误信息的记录文件。在软件开发和系统运维中,日志起着至关重要的作用

1.1 什么是日志

定义:日志是一种按时间顺序排列的记录,用于记录软件在运行过程中产生的各种信息,包括操作行为、系统状态、错误警告等。就像日记一样,程序每进行一个任务操作都要留下信息,方便他人查看。

日志通常包含以下几种信息:

  • 时间戳:记录事件发生的时间。
  • 日志级别:表示日志信息的严重程度,如DEBUG、INFO、WARNING、ERROR、FATAL。
  • 来源:指出产生日志的文件行数(可以快速找到对应模块)。
  • 消息内容:具体描述事件或错误信息。

目前,在实际开发中我们有非常丰富的日志库可以选择:

  1. spdlog是一个非常快速、支持并发的C++日志库,它提供了易于使用的接口和丰富的特性,包括异步日志记录、多线程支持、格式化输出等。官方网站在这里
  2. Glog是由Google开发的C++日志库,它提供了基于C++风格的日志API,支持条件日志记录、日志旋转和严重错误时的信号处理。官方网站在这里

1.2 日志的意义

日志在开发中主要有以下一些作用:

  1. 追踪问题:通过日志,开发者可以了解软件在运行过程中的状态,快速定位问题所在。
  2. 分析原因:日志记录了软件运行过程中的详细信息,有助于分析问题产生的原因。
  3. 优化性能:通过分析日志,可以发现软件的性能瓶颈,从而进行优化。
  4. 安全审计:日志记录了软件的操作行为,有助于审计和监控系统的安全性。
  5. 数据挖掘:在某些场景下,日志数据可以用于数据挖掘,为业务分析和决策提供支持。

同样日志在项目开发中至关重要,从开发调试阶段 - 测试阶段 - 部署阶段 - 运行维护阶段…都具有相当重要的作用!并且一个优雅的日志系统是可以让开发者赏心悦目的进行项目开发,优雅!

总之,日志在项目开发中具有举足轻重的作用。一个完善的日志系统可以提高软件的可靠性、稳定性和可维护性,为软件开发和运维提供有力支持。

1.3 为什么要构建自己的日志工具

从学习的角度出发,开发一个自己的简易日志工具可以带来以下好处:

  1. 深入理解日志原理
    通过自己实现日志工具,可以更深入地理解日志记录的基本原理,包括日志的格式化、写入、级别控制等。对以后使用第三方日志库有很大帮助
  2. 掌握核心编程技能
    在开发过程中,可以锻炼和提升核心编程技能,如文件操作、字符串处理、时间管理、异常处理等。这是一笔很重要的经验!
  3. 模块化和抽象思维
    日志工具的开发需要良好的模块化和抽象思维能力,这有助于在未来的项目中更好地组织代码。
  4. 错误处理和调试
    在开发过程中,不可避免地会遇到错误和调试问题,这提供了实践错误处理和调试技巧的机会。
  5. 理解日志在系统中的作用
    通过实现日志工具,可以更深刻地理解日志在系统监控、问题排查、性能分析等方面的重要性。
  6. 增强项目经验
    开发日志工具可以作为一个独立的项目经验,有助于在简历上展示实际编程能力和解决问题的能力。

总之,开发一个自己的简易日志工具是一个综合性的学习过程,下面我们来开发一个自己的日志工具!

2 构建自己的日志工具

2.1 框架搭建

设计一个日志系统首先要明确我们希望打印出什么格式的日志信息:
在这里插入图片描述
我们想要呈现出上面这样的日志信息,就需要设置一个信息类logmessage来储存信息,类内需要这些信息:

  • int _level : 日志等级,通过枚举变量来快速通过数字对应等级
  • pid_t _id : 进程ID
  • std::string _filename : 文件名
  • int _filenumber : 行号
  • std::string _curr_time : 当前时间
  • std::string _message_info : 日志信息

然后我们在设计一个初步的日志类Log,我们希望的是通过:

Log lg;
lg.LogMessage(__FILE__ , __LINE__ , DEBUG , "%d %s %f" , 1 , "你好" , 3.14);

这样的上层调用来实现日志信息的打印,所以Log内部不需要设置信息类logmessage。只需要在LogMessage函数中设置一个临时变量,保证每次调用都会通过这个临时来储存信息。为了可以区分是向显示器打印还是向文件打印,我们添加一个成员变量_type来方便后期确认打印方式!

#pragma once

#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <aio.h>
#include <stdarg.h>
#include <fstream>
#include <cstring>

//打印方式
#define SCREEN_TYPE 1
#define FILE_TYPE 2

const std::string file = "log.txt";

// 等级划分
enum
{
   
    DEBUG = 1,
    INFO,
    WARNING,
    ERROR,
    FATAL,
};

// 信息类
class logmessage
{
   

public:
    std::string _level;        // 日志信息等级
    int _id;                   // 进程ID
    std::string _curr_time;    // 当前时间
    std
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我龙翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值