C++ cmake实现日志类的示例代码

C++ cmake实现日志类的示例代码攻略

前置要求

  • 安装cmake工具:在官网 https://cmake.org/download/ 下载对应系统的版本进行安装
  • C++编译器:这里以g++为例
  • IDE:这里以Visual Studio Code为例

步骤一:创建工程

利用cmake工具创建一个C++工程。

  1. 在项目根目录创建文件CMakeLists.txt,内容如下
cmake_minimum_required(VERSION 3.0)
project(MyLog)

include_directories(include)

aux_source_directory(src DIR_SRCS)

add_executable(MyLog ${DIR_SRCS})
  1. 在根目录下创建include和src目录,并分别放入头文件和源文件

步骤二:实现日志类

在include目录下创建Log.h文件,代码如下

#ifndef LOG_H
#define LOG_H

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <stdarg.h>
#include <string>
#include <chrono>

enum LogLevel{LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR};

class Log
{
public:
    static Log* GetInstance();

    void LogMessage(LogLevel level, const char* format, ...);
    void SetLogLevel(LogLevel level);

private:
    LogLevel m_logLevel;
    std::ofstream m_output;

    Log();
    virtual ~Log();
    Log(const Log&) = delete;
    Log& operator=(const Log&) = delete;
};

#endif // LOG_H

在src目录下创建Log.cpp文件,代码如下

#include "Log.h"

Log::Log()
{
    m_logLevel = LogLevel::LOG_INFO;
    m_output = std::ofstream("log.txt", std::ios_base::app);
}

Log::~Log()
{
    m_output.close();
}

Log* Log::GetInstance()
{
    static Log log;
    return &log;
}

void Log::LogMessage(LogLevel level, const char* format, ...)
{
    if (level >= m_logLevel)
    {
        auto now = std::chrono::system_clock::now();
        auto now_time_t = std::chrono::system_clock::to_time_t(now);
        auto now_tm = std::localtime(&now_time_t);
        char buffer[80];
        std::strftime(buffer, sizeof(buffer), "[%Y-%m-%d %H:%M:%S]", now_tm);
        m_output << buffer;

        va_list args;
        va_start(args, format);
        char message[1024];
        vsprintf(message, format, args);
        va_end(args);

        m_output << " [" << level << "] " << message << std::endl;
    }
}

void Log::SetLogLevel(LogLevel level)
{
    m_logLevel = level;
}

步骤三:使用日志类

在main.cpp中使用Log类进行日志输出,代码如下:

#include "Log.h"

int main()
{
    auto log = Log::GetInstance();
    log->SetLogLevel(LOG_INFO);
    log->LogMessage(LOG_INFO, "This is an info message. \n");
    log->LogMessage(LOG_WARN, "This is a warning message. \n");
    log->LogMessage(LOG_DEBUG, "This is a debug message. \n");
    log->LogMessage(LOG_ERROR, "This is an error message. \n");

    return 0;
}

示例一

我们将日志级别设为LOG_INFO,执行main函数,可以看到log.txt文件中只有info信息输出。

示例二

我们将日志级别设为LOG_WARN,执行main函数,可以看到log.txt文件中有info和warn信息输出。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ cmake实现日志类的示例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++产生随机数的实现代码

    以下是关于C++产生随机数的实现攻略: 1. 使用标准库函数 C++中内置了产生随机数的函数:std::rand()。该函数需要在使用前先调用srand()函数进行初始化。srand()函数可以接受一个参数,该参数为种子值,通常使用代表当前系统时间的值或者当前进程ID等较为常见。 示例代码: #include <iostream> #includ…

    C 2023年5月24日
    00
  • C语言实现魔方比赛管理系统

    C语言实现魔方比赛管理系统 系统实现需求 本系统需要实现以下功能: 登录与注册功能 管理员与普通用户权限管理 创建比赛与编辑比赛 报名参加比赛 评分与排名展示功能 系统框架 本系统采用C语言,使用MySQL数据库进行数据存储。 系统框架如下: graph TD; A[登录与注册] –> B[管理员与普通用户权限管理]; B –> C[创建比赛…

    C 2023年5月24日
    00
  • Mac系统下源码编译安装MySQL 5.7.17的教程

    下面是“Mac系统下源码编译安装MySQL 5.7.17的教程”: 准备工作 在开始安装前,需要准备一下基础工作: 安装Xcode开发环境 Xcode 是 Mac 上的 IDE 工具,可以辅助开发各种编程语言的程序。获取安装包方式有两种: 在 Mac App Store 中搜索 Xcode 下载安装(需要苹果账号); 前往苹果的开发者网站手动下载并安装。(需…

    C 2023年5月22日
    00
  • 看面子选LCD —液晶面板A、B、C

    看面子选LCD —液晶面板A、B、C 在选择液晶面板时,除了考虑像尺寸和价格等常规因素,还需要谨慎评估其面板类型。面板的类型可以在宣传材料或数据表中找到。在液晶面板市场上,面板类型通常被标记为A、B或C类别,而且这些类别不仅影响面板的品质,而且会影响面板的价格。下面是一个详细的攻略来帮助你在A、B、C类别之间作出决策。 A、B、C 类面板的差异 三种类型面板…

    C 2023年5月22日
    00
  • C程序 插入排序

    下面是关于”C程序 插入排序”的完整使用攻略。 插入排序是什么? 插入排序是一种简单直观的、比较常用的排序算法。其基本思想是将待排序的数组分成两部分,已排序和未排序,然后将未排序的元素一个一个插入到已排序部分的正确位置上,直到整个数组都被排序。 插入排序的实现 下面是一份C程序的插入排序实现,以进行升序排序为例。 #include <stdio.h&g…

    C 2023年5月9日
    00
  • Lua教程(六):编译执行与错误

    Lua教程(六):编译执行与错误 Lua是一门解释型脚本语言,它的源代码需要经过编译才能在计算机上运行。本篇教程将介绍如何编译和执行Lua代码,以及如何处理代码中的错误。 编译执行Lua代码 Lua交互模式 在安装了Lua解释器后,打开终端或命令行,输入lua命令即可进入Lua交互模式。在交互模式下,可以逐行输入Lua代码并立即执行,也可以使用dofile或…

    C 2023年5月23日
    00
  • 如何解决Win10更新错误0x8024401c怎么办?Win10更新失败错误0x8024401c的解决方法

    针对Win10更新错误0x8024401c,以下是解决方法的完整攻略: 1. 检查网络连接 首先要检查网络连接是否正常,这是Win10更新失败的主要原因之一。可以尝试以下方法进行检查: 第一步:打开浏览器,打开任意网页,查看是否能正常访问; 第二步:确保网络连接正常,并尝试重新连接; 第三步:如果网络连接正常,尝试断开并重新连接网络,查看问题是否得到解决。 …

    C 2023年5月23日
    00
  • C语言实现的PNPoly算法代码例子

    以下是关于C语言实现的PNPoly算法的完整攻略: 什么是PNPoly算法 PNPoly(Point in Polygon)算法是一种用于判断一个点是否在一个2D多边形区域内的算法。此算法的原理是基于射线法,通过从测试点发射一条水平向右的射线,若与多边形的边有交点,则将计数器加1,若与多边形的边重合,则不加计数,最终通过计数器奇偶性判断点是否在多边形内。 实…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部