📜  c++ logger 类示例 - C++ (1)

📅  最后修改于: 2023-12-03 15:29:49.641000             🧑  作者: Mango

C++ Logger 类示例

在软件开发中,日志是避免 bug,调试代码和监测程序运行情况的一个必备工具。C++ 语言是一种功能强大的语言,也有很多成熟的日志库可供使用。但是,有时我们需要自己编写日志功能或者进行定制化开发。这个时候我们可以使用 C++ Logger 类,这里给大家介绍一下 C++ Logger 类的实现方法。

Logger 类概述

Logger 类是一个简单的 C++ 类,用于将消息输出到控制台或者文件中。Logger 只需要简单地初始化,就可以使用类似于 Logger::Info("message") 的静态方法输出。Logger 支持多种日志级别,包括 Debug、Info、Warning、Error、Critical 等。Logger 还可以根据用户提供的选项设置日志格式、日志存放路径、输出方式等信息。

Logger 类实现

下面是 Logger 类的头文件和源文件实现代码:

//Logger.h

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>

enum class eLogLevel
{
    Debug,
    Info,
    Warning,
    Error,
    Critical
};

class Logger
{
public:
    static void Initialize(eLogLevel level = eLogLevel::Debug, const std::string& filename = "", bool stdoutEnabled = true);
    static void Debug(const std::string& message);
    static void Info(const std::string& message);
    static void Warning(const std::string& message);
    static void Error(const std::string& message);
    static void Critical(const std::string& message);

private:
    static std::string getCurrentDateTimeStr();

    static eLogLevel m_OutputLevel;
    static std::ofstream m_OutputFile;
    static bool m_stdoutEnabled;
};
//Logger.cpp

#include "Logger.h"

using namespace std;

eLogLevel Logger::m_OutputLevel = eLogLevel::Debug;
bool Logger::m_stdoutEnabled = true;
std::ofstream Logger::m_OutputFile;

void Logger::Initialize(eLogLevel level, const std::string& filename, bool stdoutEnabled)
{
    m_OutputLevel = level;
    m_stdoutEnabled = stdoutEnabled;

    if (!filename.empty())
    {
        m_OutputFile.open(filename, ios_base::out | ios_base::app);
        if (!m_OutputFile.is_open())
        {
            cerr << getCurrentDateTimeStr() << "Logger : Unable to open log file '" << filename << "'." << endl;
            return;
        }
    }
}

void Logger::Debug(const std::string& message)
{
    if (m_OutputLevel > eLogLevel::Debug)
        return;

    auto timestamp = getCurrentDateTimeStr() + " [DEBUG]: ";
    if (m_stdoutEnabled)
        cout << timestamp << message << endl;
    if (m_OutputFile.is_open())
        m_OutputFile << timestamp << message << endl;
}

void Logger::Info(const std::string& message)
{
    if (m_OutputLevel > eLogLevel::Info)
        return;

    auto timestamp = getCurrentDateTimeStr() + " [INFO]: ";
    if (m_stdoutEnabled)
        cout << timestamp << message << endl;
    if (m_OutputFile.is_open())
        m_OutputFile << timestamp << message << endl;
}

void Logger::Warning(const std::string& message)
{
    if (m_OutputLevel > eLogLevel::Warning)
        return;

    auto timestamp = getCurrentDateTimeStr() + " [WARNING]: ";
    if (m_stdoutEnabled)
        cout << timestamp << message << endl;
    if (m_OutputFile.is_open())
        m_OutputFile << timestamp << message << endl;
}

void Logger::Error(const std::string& message)
{
    if (m_OutputLevel > eLogLevel::Error)
        return;

    auto timestamp = getCurrentDateTimeStr() + " [ERROR]: ";
    if (m_stdoutEnabled)
        cerr << timestamp << message << endl;
    if (m_OutputFile.is_open())
        m_OutputFile << timestamp << message << endl;
}

void Logger::Critical(const std::string& message)
{
    if (m_OutputLevel > eLogLevel::Critical)
        return;

    auto timestamp = getCurrentDateTimeStr() + " [CRITICAL]: ";
    if (m_stdoutEnabled)
        cerr << timestamp << message << endl;
    if (m_OutputFile.is_open())
        m_OutputFile << timestamp << message << endl;
}

string Logger::getCurrentDateTimeStr()
{
    auto now = chrono::system_clock::now();
    auto in_time_t = chrono::system_clock::to_time_t(now);
    char buffer[256];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime(&in_time_t));
    return string(buffer);
}
Logger 类使用

首先,我们需要在我们的 C++ 代码中包含 Logger 头文件:

#include "Logger.h"

接着,我们需要初始化 Logger,可以通过以下代码进行初始化:

Logger::Initialize(Logger::eLogLevel::Debug, "log.txt", true);

这个初始化代码在当前目录下创建一个名为 log.txt 的文件,并将日志输出到这个文件中。如果我们想将日志信息输出到控制台,我们可以将 stdoutEnabled 设置为 true:

Logger::Initialize(Logger::eLogLevel::Debug, "log.txt", true);

输出日志信息非常简单,只需要像下面这样调用 Logger 的静态方法即可:

Logger::Debug("This is a debug message");
Logger::Info("This is an information message");
Logger::Warning("This is a warning message");
Logger::Error("This is an error message");
Logger::Critical("This is a critical message");

以上代码根据不同的日志级别将不同类型的日志信息输出到文件和控制台中。

Logger 类优化和扩展

以上示例只是一个基本的 Logger 类实现,我们可以根据实际需求进行优化和扩展,例如:

  • 支持更多的日志级别,如 Trace 级别,可按消息的重要性设置不同的日志级别。
  • 支持多种日志存储方式,例如数据库、云端存储等。
  • 支持更多的日志输出格式,例如 JSON、XML 等格式。
  • 支持日志滚动,保留最新的几个日志文件,以防止日志文件变得过大等。

以上扩展需要根据具体需求进行实现。