C++ 日志输出

源代码:

log.h:

cpp 复制代码
#pragma once

#ifndef LOG_H
#define LOG_H

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <chrono>
#include <exception>
#include <sstream>
#include <iomanip>
#include <conio.h>
using namespace std;

#define RED 255, 0, 0
#define GREEN 0, 255, 0
#define BLUE 0, 0, 255
#define YELLOW 255, 255, 0

enum Level {
    Debug = 1,
    Info,
    Warning,
    Error,
    Fatal
};

string getColorString(int red, int green, int blue, char* message) {
    return "\033[38;2;" + to_string(red) + ";" + to_string(green) + ";" + to_string(blue) + "m" + message + "\033[0m";
}

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

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

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

    stringstream ss;
    ss << put_time(localtime(&in_time_t), "%Y-%m-%d_%H-%M-%S");
    return ss.str();
}


class Log {
public:
    Level level;
    string filename;

    Log() {
        level = Level::Info;
        filename = getCurrentTimeString_filename() + ".log";
    }

    Log(Level level) {
        this->level = level;
        filename = getCurrentTimeString_filename() + ".log";
    }

    Log(Level level, string filename) {
        this->level = level;
        this->filename = filename;
    }

    void setLevel(Level level) {
        this->level = level;
    }

    void setFilename(string filename) {
        this->filename = filename;
    }

    void debug(string message) {
        output(Level::Debug, message);
        write(Level::Debug, message);
    }

    void info(string message) {
        output(Level::Info, message);
        write(Level::Info, message);
    }

    void warning(string message) {
        output(Level::Warning, message);
        write(Level::Warning, message);
    }

    void error(string message) {
        output(Level::Error, message);
        write(Level::Error, message);
    }

    void fatal(string message) {
        output(Level::Fatal, message);
        write(Level::Fatal, message);
    }

    void pause() {
        cout << "Press any key to continue...";
        _getch();
    }

private:
    void write(Level level, string message) {
        fstream logFile;
        logFile.open(filename, ios::app);
        switch (level) {
        case Level::Debug: {
            string debugMessage = getCurrentTimeString() + " [DEBUG] " + message + "\n";
            logFile << debugMessage;
            break;
        }

        case Level::Info: {
            string infoMessage = getCurrentTimeString() + " [INFO] " + message + "\n";
            logFile << infoMessage;
            break;
        }

        case Level::Warning: {
            string warningMessage = getCurrentTimeString() + " [WARNING] " + message + "\n";
            logFile << warningMessage;
            break;
        }

        case Level::Error: {
            string errorMessage = getCurrentTimeString() + " [ERROR] " + message + "\n";
            logFile << errorMessage;
            break;
        }

        case Level::Fatal: {
            string fatalMessage = getCurrentTimeString() + " [FATAL] " + message + "\n";
            logFile << fatalMessage;
            break;
        }

        default:
            break;
        }

        logFile.close();
    }

    void output(Level level, string message) {
        switch (level) {
        case Level::Debug: {
            string debugMessage = getCurrentTimeString() + getColorString(RED, " [DEBUG] ") + message + "\n";
            cout << debugMessage;
            break;
        }

        case Level::Info: {
            string infoMessage = getCurrentTimeString() + getColorString(BLUE, " [INFO] ") + message + "\n";
            cout << infoMessage;
            break;
        }

        case Level::Warning: {
            string warningMessage = getCurrentTimeString() + getColorString(YELLOW, " [WARNING] ") + message + "\n";
            cout << warningMessage;
            break;
        }

        case Level::Error: {
            string errorMessage = getCurrentTimeString() + getColorString(RED, " [ERROR] ") + message + "\n";
            cout << errorMessage;
            break;
        }

        case Level::Fatal: {
            string fatalMessage = getCurrentTimeString() + getColorString(RED, " [FATAL] ") + message + "\n";
            cout << fatalMessage;
            break;
        }

        default:
            break;
        }
    }
};


#endif // LOG_H

main.cpp:

cpp 复制代码
#include "log.h"

int main() {
    Log log;

    log.info("Hello, world!");
    log.debug("This is a debug message.");
    log.warning("This is a warning message.");

    try {
        throw runtime_error("An error occurred.");
    } catch (const exception& e) {
        log.error(e.what());
    }

    log.fatal("This is a fatal error message.");
    log.pause();

    return 0;
}

运行结果

相关推荐
灵感__idea13 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
端平入洛2 天前
delete又未完全delete
c++
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉