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++11中的chrono库详解

    C++11中的chrono库详解 C++11中的chrono库提供了一种方便的方法来处理时间和日期。它具有高度的可移植性和更好的精度。 我们将了解该库中主要的三个组件:duration,time_point和clock。 duration duration表示一段时间,它拥有以下属性: 精度:例如浮点、整数 长度:例如秒、毫秒、微秒、纳秒 在 chrono …

    C 2023年5月23日
    00
  • 详解如何配置CLion作为Qt5开发环境的方法

    下面我将详细讲解 CLion 如何配置成为 Qt5 开发环境的方法。 准备工作 在开始配置之前,需要确认以下几点: 已经安装了 Qt5 及其相关工具; 已经安装了 CMake 和 CLion。 配置步骤 打开 CLion,新建一个 CMake 工程。 在 CMakeLists.txt 中添加以下内容: find_package(Qt5 COMPONENTS …

    C 2023年5月23日
    00
  • C语言实现小型工资管理系统

    下面我会详细讲解一下“C语言实现小型工资管理系统”的完整攻略。 1. 确定功能需求 首先需要确定工资管理系统的具体功能需求,例如: 添加员工信息 修改员工信息 查询员工信息 删除员工信息 计算员工工资 2. 建立数据存储模型 其次需要建立数据存储模型,决定使用何种数据结构来存储员工信息。通常可以使用结构体来定义员工信息,例如: struct Employee…

    C 2023年5月23日
    00
  • C语言中%d和%i格式说明符的区别

    下面是详细讲解“C语言中%d和%i格式说明符的区别”的完整使用攻略。 在C语言中,%d和%i两个格式说明符都是用来输出整数类型的变量的,但是它们有一些细微的区别。 区别一:进制数的输出 %d格式说明符会将输出的整数按照10进制输出,而%i格式说明符则会根据整数变量的前缀来输出对应的进制数。 举个例子,假设有一个十六进制的整数变量x,值为0x1F,使用%d和%…

    C 2023年5月10日
    00
  • C++基础学生管理系统

    C++基础学生管理系统:完整攻略 简介 学生管理系统是程序开发中常见的一个小型项目,用于对学生信息、成绩等进行管理。本篇攻略将介绍如何使用C++编写一个简单的学生管理系统。 功能分析 根据需求,我们将实现以下功能: 添加学生信息(包括姓名、学号、性别、年龄、身份证号、联系电话、家庭住址等); 查询所有学生信息; 按条件查询学生信息(可以按学号、姓名、年龄等条…

    C 2023年5月23日
    00
  • Java编程基础测试题分享

    Java编程基础测试题分享攻略 背景说明 Java编程入门的学习是需要实践的。而测试题是测试自己知识掌握情况的重要方式之一。本文将介绍如何准备Java编程基础测试题,以及如何完整的解答测试题,帮助初学者更好地进行自我学习和检验。 准备测试题 找到适当的测试题,可以在网上搜索一些Java编程基础测试题,或者向周围有经验者拿一些推荐的Java编程基础测试题 将测…

    C 2023年5月23日
    00
  • c语言printf实现同一位置打印输出的实例

    下面是关于C语言中printf函数实现同一位置打印输出的攻略。 1. 实现同一位置输出的基本思路 C语言中的printf函数可以支持在同一位置多次打印输出。实现同一位置输出的基本思路如下: 利用转义字符\r将光标移动到一行的起始位置; 在同一行内不断输入新的内容,利用转义字符\b将光标不断左移; 在新的内容输入完毕后,利用空格将后面多余的内容覆盖掉。 具体实…

    C 2023年5月22日
    00
  • 英语打字练习软件-c语言编写

    ​学习c语言的时候编写的英语打字练习软件,已经上传github 自取 https://github.com/grey-wood-wolf/typing-software   软件实际效果如下 在下载的压缩包里,运行exe文件就可使用,源码为ConsoleApplication1这个文件      部分代码如下: void welcom()//介绍 { int…

    C语言 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部