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;
}

运行结果

相关推荐
Hrain-AI16 分钟前
企业 AI 治理运营怎么做:分级授权、Token 用量可观测与模型统一纳管
大数据·人工智能·算法
独立开发之道26 分钟前
【three.js教程】Three.js 材质详解:从“不反光“到“物理级真实“怎么选
开发语言·javascript·材质
剑指offer.42 分钟前
Linux多任务-线程篇
java·jvm·算法
Highcharts.js42 分钟前
Highcharts for Python 一套 Python 可视化图表生成库
开发语言·python·highcharts·可视化图表
这是程序猿1 小时前
深入剖析Java HashMap:底层原理、数据结构与核心机制全解析
java·开发语言·数据结构
nike0good1 小时前
CF 126B(Password-z algorithm/exkmp)
开发语言·c++·算法
无定义_1 小时前
Bellman-Ford——贝尔曼福特算法
数据库·算法
huaweichenai1 小时前
PHP实现对接MQTT协议
开发语言·php
牧羊人.3331 小时前
动手学深度学习 01:核心组件与完整训练流程
开发语言·人工智能·深度学习
晓晓_za8986681 小时前
GEO 搜索源码白帽合规改造:适配各大 AI 信源收录规则
java·开发语言·人工智能·性能优化·开源