日志基础示例python和c++

文章目录

  • [0. 引言](#0. 引言)
  • [1. python](#1. python)
  • [2. c++](#2. c++)

0. 引言

本文主要记录python版本和c++版本常用的日志基础示例。

1. python

python版本常用的是logging库,结合colorlog库,可根据不同日志级别打印不同颜色的日志,为了便于分析问题,还添加了日志保存到文件的设置,默认保存到代码运行目录的logs/时间戳目录下,代码示例如下:

python 复制代码
import logging
import colorlog
import os
from datetime import datetime

class ColorLogger:
    SUCCESS_LEVEL_NUM = 25

    def __init__(self, name='app_logger', log_dir='logs', level=logging.DEBUG):
        # 定义 SUCCESS 级别
        logging.addLevelName(self.SUCCESS_LEVEL_NUM, "SUCCESS")

        # 创建日志目录
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)

        # 创建带时间戳的子目录
        timestamp = datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
        log_folder = os.path.join(log_dir, timestamp)
        os.makedirs(log_folder)

        # 日志文件路径
        log_file = os.path.join(log_folder, 'app.log')

        # 自定义日志记录方法
        def success(self, message, *args, **kwargs):
            if self.isEnabledFor(ColorLogger.SUCCESS_LEVEL_NUM):
                self._log(ColorLogger.SUCCESS_LEVEL_NUM, message, args, **kwargs)

        # 将自定义方法绑定到 Logger 类
        logging.Logger.success = success

        # 创建 logger 对象
        self.logger = logging.getLogger(name)
        self.logger.setLevel(level)

        # 创建控制台 handler
        console_handler = colorlog.StreamHandler()
        console_formatter = colorlog.ColoredFormatter(
            "%(log_color)s%(asctime)s - %(levelname)s - %(message)s",
            log_colors={
                'DEBUG': 'blue',
                'INFO': '',
                'WARNING': 'yellow',
                'ERROR': 'red',
                'CRITICAL': 'bold_red',
                'SUCCESS': 'green'
            }
        )
        console_handler.setFormatter(console_formatter)
        self.logger.addHandler(console_handler)

        # 创建文件 handler
        file_handler = logging.FileHandler(log_file)
        file_handler.setLevel(level)
        file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(file_formatter)
        self.logger.addHandler(file_handler)

    def debug(self, message):
        self.logger.debug(message)

    def info(self, message):
        self.logger.info(message)

    def warning(self, message):
        self.logger.warning(message)

    def error(self, message):
        self.logger.error(message)

    def critical(self, message):
        self.logger.critical(message)

    def success(self, message):
        self.logger.success(message)

# 实例化示例
if __name__ == "__main__":
    logger = ColorLogger()

    test = "1234567890"

    # 记录各种级别的日志
    logger.info(f"这是测试信息 {test}")
    logger.debug("这是调试信息 (DEBUG)")
    logger.info("这是普通信息 (INFO)")
    logger.warning("这是警告信息 (WARNING)")
    logger.error("这是错误信息 (ERROR)")
    logger.critical("这是严重错误信息 (CRITICAL)")
    logger.success("这是成功信息 (SUCCESS)")

运行结果:

2. c++

c++也可以实现类似的效果,main.cpp 代码如下:

cpp 复制代码
#include <iostream>
#include <fstream>
#include <iomanip>
#include <ctime>
#include <sstream>
#include <filesystem>

class ColorLogger {
public:
    enum LogLevel { DEBUG, INFO, WARNING, ERROR, CRITICAL, SUCCESS };

    ColorLogger(const std::string& name = "app_logger", const std::string& logDir = "logs")
        : loggerName(name), logDirectory(logDir) {
        // 创建日志目录
        if (!std::filesystem::exists(logDirectory)) {
            std::filesystem::create_directory(logDirectory);
        }

        // 创建带时间戳的子目录
        std::string timestamp = getCurrentTimestamp();
        logFolder = logDirectory + "/" + timestamp;
        std::filesystem::create_directory(logFolder);

        // 日志文件路径
        logFile = logFolder + "/app.log";
        logStream.open(logFile, std::ios::app);
    }

    ~ColorLogger() {
        if (logStream.is_open()) {
            logStream.close();
        }
    }

    void log(LogLevel level, const std::string& message) {
        std::string prefix = getLogLevelString(level);
        std::cout << prefix << message << std::endl;  // 输出到控制台
        if (logStream.is_open()) {
            logStream << prefix << message << std::endl;  // 写入到文件
        }
    }

    void debug(const std::string& message) {
        log(DEBUG, message);
    }

    void info(const std::string& message) {
        log(INFO, message);
    }

    void warning(const std::string& message) {
        log(WARNING, message);
    }

    void error(const std::string& message) {
        log(ERROR, message);
    }

    void critical(const std::string& message) {
        log(CRITICAL, message);
    }

    void success(const std::string& message) {
        log(SUCCESS, message);
    }

private:
    std::string loggerName;
    std::string logDirectory;
    std::string logFolder;
    std::string logFile;
    std::ofstream logStream;

    std::string getCurrentTimestamp() {
        auto now = std::time(nullptr);
        std::tm tm = *std::localtime(&now);
        std::ostringstream oss;
        oss << std::put_time(&tm, "%Y%m%d_%H%M%S");
        return oss.str();
    }

    std::string getLogLevelString(LogLevel level) {
        switch (level) {
            case DEBUG:   return "\033[34m[DEBUG] \033[0m";   // 蓝色
            case INFO:    return "\033[0m[INFO] \033[0m";     // 默认颜色
            case WARNING: return "\033[33m[WARNING] \033[0m";  // 黄色
            case ERROR:   return "\033[31m[ERROR] \033[0m";    // 红色
            case CRITICAL:return "\033[41m[CRITICAL] \033[0m"; // 红色背景
            case SUCCESS: return "\033[32m[SUCCESS] \033[0m";  // 绿色
            default:      return "\033[0m[UNKNOWN] \033[0m";   // 默认颜色
        }
    }
};

// 实例化示例
int main() {
    ColorLogger logger;

    // 记录各种级别的日志
    logger.debug("这是调试信息 (DEBUG)");
    logger.info("这是普通信息 (INFO)");
    logger.warning("这是警告信息 (WARNING)");
    logger.error("这是错误信息 (ERROR)");
    logger.critical("这是严重错误信息 (CRITICAL)");
    logger.success("这是成功信息 (SUCCESS)");

    return 0;
}

对应的CMakeLists.txt如下:

c 复制代码
cmake_minimum_required(VERSION 3.10)

# 设置项目名称和版本
project(ColorLoggerProject VERSION 1.0)

# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加可执行文件
add_executable(ColorLogger main.cpp)
bash 复制代码
mkdir build
cd build
make -j8
# 执行
./ColorLogger

运行结果:

当然,c++也有现成的库,比如glog,spdlog等,常用的是glog,示例代码如下:

需要先安装glog (推荐源码编译):

bash 复制代码
git clone https://github.com/google/glog.git
cd glog
mkdir build
cd build
cmake ..
make

main.cpp代码示例:

cpp 复制代码
#include <glog/logging.h>
#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
    // 初始化 Google Logging
    google::InitGoogleLogging(argv[0]);

    FLAGS_log_dir = "logs";

    std::string test = "1234567890";

    LOG(INFO) << "这是测试信息 " << test; // 普通信息
    LOG(WARNING) << "这是警告信息";       // 警告信息
    LOG(ERROR) << "这是错误信息";         // 错误信息
    // LOG(FATAL) << "这是致命错误信息"; // 致命错误(程序会终止)

    google::ShutdownGoogleLogging();
    return 0;
}

对应的CMakeLists.txt :common_lib_path 替换成自己编译的glob路径

c 复制代码
cmake_minimum_required(VERSION 3.10)

project(GlogExample)

# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(common_lib_path "/nvme/PLITOE/common_lib")

include_directories(${common_lib_path}/include)

link_directories(${common_lib_path}/lib)

# 添加可执行文件
add_executable(glog_example main.cpp)

# 链接 glog 库
target_link_libraries(glog_example glog)
bash 复制代码
mkdir build
cd build
make -j8
# 执行,可先在当前文件夹下 mkdir logs
./glog_example

执行后,可在logs中看到各种级别的日志文件。

须知少时凌云志,曾许人间第一流。

⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

相关推荐
PluviophileDD3 分钟前
【笔记】C语言转C++
c语言·c++
Byron Loong8 分钟前
Python+OpenCV系列:模版匹配
python·opencv·计算机视觉
獨枭15 分钟前
MFC 自定义编辑框:打造灵活的数据输入控件
c++·mfc
逆袭之路66629 分钟前
浅谈右值引用 移动语义 完美转发 std::move std::forward,窥探模板元编程的一角
c++
安於宿命31 分钟前
【Linux】文件系统
linux·服务器·c++
GOTXX39 分钟前
【自动驾驶】单目摄像头实现自动驾驶3D目标检测
图像处理·人工智能·python·目标检测·机器学习·3d·自动驾驶
天天要nx39 分钟前
D94【python 接口自动化学习】- pytest进阶之fixture用法
python·pytest
oioihoii39 分钟前
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
开发语言·c++
imred1 小时前
python数据分析一例:使用SQL和pandas对数据进行聚合和diff
python·sql·数据分析·pandas
OTWOL1 小时前
预处理基础指南
开发语言·数据结构·c++·算法