【Linux】日志

2024-07-12 1145阅读

日志是记录软件运行过程中发生的事件的一种手段,通常包含以下内容:

  • 时间戳:记录日志条目创建的确切时间。这对于追踪事件发生的时间顺序至关重要。
  • 日志级别:表示日志信息的严重性或重要性,常见的级别包括 DEBUG、INFO、WARNING、ERROR 和 FATAL。
  • 消息:日志条目的主要文本内容,描述了发生了什么事件或情况。
  • 来源:生成日志条目的组件、模块、类或函数名,有助于定位日志信息在代码中的位置。
  • 线程信息:在多线程应用程序中,记录产生日志的线程ID或名称。
  • 进程信息:记录产生日志的进程ID或名称。
  • 用户信息:如果是用户驱动的应用程序,可能需要记录进行操作的用户ID或名称。
  • 主机信息:记录生成日志的服务器或主机的名称或IP地址。
  • 异常信息:如果日志是由于异常情况而产生的,通常包括异常的类型、消息、堆栈跟踪等。
  • 自定义上下文:根据应用程序的需要,可能包括与事件相关的特定上下文信息,如交易ID、会话ID、请求参数等。

    在C++标准库中,并没有直接提供专门的日志记录功能,然而,C++标准库中的一些组件可以用来模拟实现日志记录。

    需要实现:

    • 日志级别:Debug, Info, Warning, Error, Fatal:这些枚举值定义了不同的日志级别。
    • 日志输出风格:Screen, OneFile, ClassFile:定义了日志消息的输出方式,分别对应控制台输出、单个文件输出和按类别分文件输出。
    • 获取当前时间戳:TimeStampToLocalTime获取当前时间戳并转换为本地时间。
    • 输出日志消息:屏幕、单个文件、多类文件。

      Log.hpp如下:

      #pragma once
      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      // 日志级别
      enum
      {
          Debug = 0,
          Info,
          Warning,
          Error,
          Fatal
      };
      // 输出风格
      enum
      {
          Screen = 10,
          OneFile,
          ClassFile
      };
      // 日志级别的字符串输出
      std::string LevelToString(int level)
      {
          switch (level)
          {
          case Debug:
              return "Debug";
          case Info:
              return "Info";
          case Warning:
              return "Warning";
          case Error:
              return "Error";
          case Fatal:
              return "Fatal";
          default:
              return "Unknown";
          }
      }
      // 获取当前时间戳并转换为本地时间
      std::string TimeStampToLocalTime()
      {
          time_t curtime = time(nullptr);
          struct tm *cur = localtime(&curtime);
          char time_buffer[128];
          snprintf(time_buffer, sizeof(time_buffer), "%d/%d/%d %d:%d:%d",
                   cur->tm_year + 1900, cur->tm_mon + 1, cur->tm_mday,
                   cur->tm_hour, cur->tm_min, cur->tm_sec);
          return time_buffer;
      }
      const int default_Style = Screen;
      const std::string default_filename = "log.";
      const std::string default_logdir = "log"; // 文件的默认存储路径
      class Log
      {
      public:
          Log()
              : _style(default_Style),
                _filename(default_filename)
          {
              mkdir(default_logdir.c_str(), 0775);
          }
          // 更改输出风格
          void ChangeStyle(int style)
          {
              _style = style;
          }
          // 输出消息到单个文件
          void WriteLogToOneFile(const std::string &logname, const std::string &message)
          {
              umask(0);
              int fd = open(logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666);
              if (fd 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]