首页 > 编程语言 >C++日志类

C++日志类

时间:2022-12-31 18:12:46浏览次数:54  
标签:const val level LogLevel void format C++ 日志

我们在写一些小项目时,封装一个log类,无论是在debug,还是运行信息输出,都可以带来不小的便利。

1. 信息分类

我们的输出信息可能时debug信息,错误信息,或者是运行状态信息,所以,我们可以利用enum来对信息分类,方便后续的日志打印。

enum class LogLevel : int
{
    Debug = 0,
    Info = 1,
    Error = 2,
    Fatal = 3
};

2. 主体功能实现

主体功能放在Logger类中实现

class Logger
{
    friend class Log;

public:
    explicit Logger(LogLevel level = LogLevel::Info);
    void ResetLogLevel(LogLevel level)
    {
        level_ = level;
    }

    void Write(LogLevel level, const char *format, ...);
    void Debug(const char *format, ...);
    void Info(const char *format, ...);
    void Error(const char *format, ...);
    void Fatal(const char *format, ...);

private:
    void WriteImpl(LogLevel level, const char *format, va_list *val);
    std::string GetSystemTime();
    std::string GetLevelStr(LogLevel level);
    LogLevel level_;
    Logger(const Logger &);
    void operator=(const Logger &);
};

其中,构造函数只是指明日志的内别,是Debug信息,Error信息亦或者其他信息。另外,真正的输出打印工作放在WriteImpl函数中,其实现如下:

inline void Logger::WriteImpl(LogLevel level, const char *format, va_list *val)
{

    std::string level_str = GetLevelStr(level);
    std::string time_str = GetSystemTime();
    va_list val_copy;
    va_copy(val_copy, *val);
    printf("[%s] [%s] ", level_str.c_str(), time_str.c_str());
    vprintf(format, *val);
    fflush(stdout);
    va_end(val_copy);
}

其中,所用到的GetLevelStr与GetSystemTime函数的函数名便描述了函数的功能。

3. 顶层接口

用户通过顶层类的接口,直接打印日志信息。

class Log
{
public:
    static void ResetLogLevel(LogLevel level);
    static void Write(LogLevel level, const char *format, ...);
    static void Debug(const char *format, ...);
    static void Info(const char *format, ...);
    static void Error(const char *format, ...);
    static void Fatal(const char *format, ...);
private:
    static Logger logger_;
};

4. 代码实现

1. log.h

enum class LogLevel : int
{
    Debug = 0,
    Info = 1,
    Error = 2,
    Fatal = 3
};

class Logger
{
    friend class Log;

public:
    explicit Logger(LogLevel level = LogLevel::Info);
    void ResetLogLevel(LogLevel level)
    {
        level_ = level;
    }

    void Write(LogLevel level, const char *format, ...);
    void Debug(const char *format, ...);
    void Info(const char *format, ...);
    void Error(const char *format, ...);
    void Fatal(const char *format, ...);

private:
    void WriteImpl(LogLevel level, const char *format, va_list *val);
    std::string GetSystemTime();
    std::string GetLevelStr(LogLevel level);
    LogLevel level_;
    Logger(const Logger &);
    void operator=(const Logger &);
};

class Log
{
public:
    static void ResetLogLevel(LogLevel level);
    static void Write(LogLevel level, const char *format, ...);
    static void Debug(const char *format, ...);
    static void Info(const char *format, ...);
    static void Error(const char *format, ...);
    static void Fatal(const char *format, ...);
private:
    static Logger logger_;
};

2. log.cpp

Logger::Logger(LogLevel level) : level_(level)
{
}

void Logger::Write(LogLevel level, const char *format, ...)
{
    va_list val;
    va_start(val, format);
    WriteImpl(level, format, &val);
    va_end(val);
}

inline void Logger::WriteImpl(LogLevel level, const char *format, va_list *val)
{

    std::string level_str = GetLevelStr(level);
    std::string time_str = GetSystemTime();
    va_list val_copy;
    va_copy(val_copy, *val);
    printf("[%s] [%s] ", level_str.c_str(), time_str.c_str());
    vprintf(format, *val);
    fflush(stdout);
    va_end(val_copy);
}

std::string Logger::GetSystemTime()
{
    time_t t = time(0);
    char str[64];
    strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S", localtime(&t));
    return str;
}

std::string Logger::GetLevelStr(LogLevel level)
{
    switch (level)
    {
    case LogLevel::Debug:
        return "DEBUG";
    case LogLevel::Info:
        return "INFO";
    case LogLevel::Error:
        return "ERROR";
    case LogLevel::Fatal:
        return "FATAL";
    default:
        return "UNKNOW";
    }
}

Logger Log::logger_;

void Log::ResetLogLevel(LogLevel level)
{
    logger_.ResetLogLevel(level);
}

void Log::Write(LogLevel level, const char *format, ...)
{
    va_list val;
    va_start(val, format);
    logger_.WriteImpl(level, format, &val);
    va_end(val);
}

void Log::Info(const char *format, ...)
{
    va_list val;
    va_start(val, format);
    logger_.WriteImpl(LogLevel::Info, format, &val);
    va_end(val);
}

void Log::Error(const char *format, ...)
{
    va_list val;
    va_start(val, format);
    logger_.WriteImpl(LogLevel::Error, format, &val);
    va_end(val);
}

void Log::Fatal(const char *format, ...)
{
    va_list val;
    va_start(val, format);
    logger_.WriteImpl(LogLevel::Fatal, format, &val);
    va_end(val);
}


void Log::Debug(const char *format, ...)
{
    va_list val;
    va_start(val, format);
    logger_.WriteImpl(LogLevel::Debug, format, &val);
    va_end(val);
}

标签:const,val,level,LogLevel,void,format,C++,日志
From: https://www.cnblogs.com/caieleven/p/17017057.html

相关文章

  • C++中IO封装
    之前在写一个分布式计算小项目时,频繁地使用文件IO,为简化代码,减少重复操作,降低出错可能性,便将I/O模块进行封装。当时我的需求是对大文本文件进行读写,而且该文本文件是规整......
  • SpringCloud之Sleuth全链路日志跟踪
    目录1Sleuth链路跟踪1.1分布式系统面临的问题1.2Sleuth是什么1.3Zipkin是什么1.4链路监控相关术语1.5实战练习1.5.1pom.xml1.5.2添加yml配置1.5.3添加控制器1.5.4......
  • 【win编程】- 在C/C++中调用obj文件
    问题思考:有没有一种方式,让别人用你源码实现的功能,只给你声明,不给你源码?程序编译过程:预编译-编译-链接,编译生成obj文件,最后链接生成可执行文件。那么就可以把源码......
  • docker 日志文件大小配置
    在daemon.json设置max-size=500m,意味着一个容器日志大小上限是500M,max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。{"registry-mirr......
  • C++图书收藏模拟系统[2022-12-31]
    C++图书收藏模拟系统[2022-12-31]课题名称:图书收藏模拟系统的设计与实现课题简介目前有一些著名的网上图书购买系统,比如当当网、亚马逊等,他们都有收藏和购买图书的功......
  • C/C++杂志订阅管理系统[2022-12-31]
    C/C++杂志订阅管理系统[2022-12-31]题目26“杂志订阅管理系统设计”1、问题描述使用计算机对杂志进行管理,该杂志最多拥有订阅用户不超过50人,每个订户的信息包括:编......
  • C++银行账户管理仿真软件[2022-12-31]
    C++银行账户管理仿真软件[2022-12-31]3.4银行账户管理仿真软件设计一个银行账户管理软件,可以实现:用户登录,账户管理,存取款等功能,要求通过读写文件来读取数据和保存数......
  • C/C++学生管理系统(单链表)[2022-12-31]
    C/C++学生管理系统(单链表)[2022-12-31]利用数据结构的单链表的框架实现学生管理系统以下功能要求:1)学生个人信息:姓名、学号、专业、性别、年龄、联系方式、成绩。2)学......
  • C/C++学生成绩管理系统[2022-12-31]
    C/C++学生成绩管理系统[2022-12-31]课题三:学生成绩管理系统设计学生成绩信息包括:学期,学号,班级,姓名,四门课程成绩(语文、数学、英语和计算机)等。主要功能:(1)系统以菜......
  • C/C++公司销售管理流程模拟系统[2022-12-31]
    C/C++公司销售管理流程模拟系统[2022-12-31]公司销售管理流程模拟。【背景描述】请采用合适的数据表示方式模拟公司的销售管理流程。【数据分析】本系统的目标是模拟设......