linux

如何用C++实现Linux下的日志系统

小樊
39
2025-09-13 06:05:31
栏目: 编程语言

在Linux下使用C++实现一个日志系统,可以按照以下步骤进行。这个日志系统将包括基本的日志级别、日志输出到文件和控制台、以及按日期分割日志文件的功能。

1. 定义日志级别

首先,定义日志级别,例如:

enum LogLevel {
    DEBUG,
    INFO,
    WARNING,
    ERROR,
    FATAL
};

2. 创建日志类

创建一个日志类,用于处理日志的记录和输出。

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <sstream>
#include <iomanip>

class Logger {
public:
    Logger(const std::string& logFileName) : logFileName(logFileName), logLevel(INFO) {}

    void setLogLevel(LogLevel level) {
        logLevel = level;
    }

    void log(LogLevel level, const std::string& message) {
        if (level < logLevel) return;

        std::ostringstream logStream;
        logStream << getCurrentTime() << " [" << logLevelToString(level) << "] " << message;

        std::cout << logStream.str() << std::endl;
        logFile << logStream.str() << std::endl;
    }

private:
    std::string logFileName;
    LogLevel logLevel;
    std::ofstream logFile;

    std::string getCurrentTime() {
        auto now = std::chrono::system_clock::now();
        auto in_time_t = std::chrono::system_clock::to_time_t(now);

        std::stringstream ss;
        ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X");
        return ss.str();
    }

    std::string logLevelToString(LogLevel 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";
        }
    }

    void rotateLogFile() {
        if (logFile.is_open()) {
            logFile.close();
            std::string newFileName = logFileName + "." + getCurrentTime() + ".log";
            std::rename(logFileName.c_str(), newFileName.c_str());
            logFile.open(logFileName, std::ios::app);
        }
    }
};

3. 使用日志类

在你的应用程序中使用这个日志类。

int main() {
    Logger logger("app.log");
    logger.setLogLevel(INFO);

    logger.log(INFO, "This is an info message.");
    logger.log(DEBUG, "This debug message will not be logged.");
    logger.log(ERROR, "This is an error message.");

    return 0;
}

4. 编译和运行

使用g++编译你的程序:

g++ -o myapp myapp.cpp
./myapp

5. 日志文件分割

为了实现日志文件按日期分割,可以在每次记录日志时检查当前时间是否与上次记录日志的时间不同,如果不同则关闭当前日志文件并打开一个新的日志文件。

void log(LogLevel level, const std::string& message) {
    if (level < logLevel) return;

    auto now = std::chrono::system_clock::now();
    auto currentTime = std::chrono::system_clock::to_time_t(now);
    std::tm* localTime = std::localtime(&currentTime);

    if (localTime->tm_mday != lastLoggedDay) {
        rotateLogFile();
        lastLoggedDay = localTime->tm_mday;
    }

    std::ostringstream logStream;
    logStream << getCurrentTime() << " [" << logLevelToString(level) << "] " << message;

    std::cout << logStream.str() << std::endl;
    logFile << logStream.str() << std::endl;
}

在日志类中添加一个成员变量来记录上次记录日志的日期:

private:
    std::string logFileName;
    LogLevel logLevel;
    std::ofstream logFile;
    std::tm lastLoggedDay = {0};

这样,日志文件将每天自动分割,并且每个日志文件都会包含当天的日期。

通过以上步骤,你可以在Linux下使用C++实现一个基本的日志系统。根据需要,你可以进一步扩展这个系统,例如添加更多的配置选项、支持不同的日志输出目标(如网络)等。

0
看了该问题的人还看了