日志基础示例python和c++

news2024/12/12 23:39:29

文章目录

  • 0. 引言
  • 1. python
  • 2. c++

0. 引言

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

1. python

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

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 代码如下:

#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如下:

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)
mkdir build
cd build
make -j8
# 执行
./ColorLogger

运行结果:
请添加图片描述

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

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

git clone https://github.com/google/glog.git
cd glog
mkdir build
cd build
cmake ..
make

main.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路径

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)
mkdir build
cd build
make -j8
# 执行,可先在当前文件夹下 mkdir logs
./glog_example

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






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



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history&#xff08;历史记录&a…

喜报!极限科技(INFINI Labs)通过国家高新技术企业认定

2024 年 10 月 29 日&#xff0c;国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司 顺利通过本次高新技术企业评审&#xff0c;并获得 国家级“高新技术企业”认…

STM32 USART串口通信 综合练习

USART&#xff08;通用同步/异步串行接收/发送器&#xff09;串口通信具有以下特点&#xff1a; 全双工操作&#xff1a;设备之间可以同时进行数据的发送和接收。异步通信&#xff1a;不需要共同的时钟信号&#xff0c;双方设备有各自的时钟。单端信号&#xff1a;使用一根线传…

Linux - 进程等待和进程替换

进程等待 前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源. waitpid 我们可以通过 Linux 提供的系统调用函数 wait 系列函数来等待子进程死亡, 并回收资源. #include <sys/t…

虚拟主机怎么选哪家的性价比高

选择虚拟主机不能只看价格&#xff0c;还要看质量和服务&#xff0c;稳定快速的虚拟主机再加上优质的售后服务&#xff0c;才可令网站顺利运行&#xff0c;站长才无后顾之忧。 选虚拟主机或云服务器还是要选大牌主机商的产品比较好&#xff0c;质量和服务更有保障&#xff0c;例…

英文论文翻译成中文,怎样翻译更地道?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 最近学员群有同学问&#xff0c;英文论文翻译成中文的解决方案—“DeepL翻译出来的内容总是有点别扭&#xff0c;ChatGPT能翻译的地道一些吗&#xff1f;”。 正好有位刚加入的…

40分钟学 Go 语言高并发:服务监控与追踪

服务监控与追踪 一、知识要点总览 模块核心内容技术选型难度监控指标请求量、响应时间、错误率、资源使用Prometheus Grafana中链路追踪分布式调用链、性能瓶颈分析Jaeger, OpenTelemetry高日志处理日志收集、分析、存储ELK Stack中告警系统告警规则、通知渠道、告警分级Ale…

【Unity高级】如何实现粒子系统的间歇式喷射

先看下要最终实现的效果&#xff1a; 代码如下&#xff1a; using UnityEngine; using System.Collections;public class ParticleBurstController : MonoBehaviour {private ParticleSystem _particleSystem; // 获取粒子系统public float burstDuration 2f; // 每次…

clipchamp制作视频文字转语音音频

一.准备工作&#xff1a; 1.在浏览器打开 https://app.clipchamp.com/首次打开需要登录&#xff0c;未登录用户注册登录 2.点击右上角头像到Settings页面&#xff0c;点击Language切换到中文&#xff08;英文水平好的可以忽略此步骤&#xff09;因中文英文界面有微小差异&…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

三菱伺服通过MR Configurator2进行的试运行模式

(1)试运行模式 (a)JOG运转 可以不使用伺服系统控制器执行J0G运行。请在解除强制停止的状态下使用。无论伺服0N/伺服OFF或伺服系统控制器有无连接均可使用。 通过MR Configurator2的J0G运行画面进行操作。 1)运行模式 2)运行方法 "“仅在长按正转、反转按钮中运行”的复选框…

Sqoop导入数据(mysql---->>hive)

目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出&#xff0c;放到hdfs上&#xff08;由targ…

Flask返回中文Unicode编码(乱码)解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C++AVL树】枝叶间的旋律:AVL树的和谐之道

公主请阅 1.AVL树的概念2.AVL树的插入AVL树插入一个值的大概过程平衡因子更新更新原则更新停止条件 3.AVL树的右转旋转的原则右单旋 4.AVL树的左旋左单旋 5.AVL树的左右双旋6.AVL树的右左双旋7.AVL树的模拟实现 1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AV…

深入理解C#的TCPIP通信机制

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;在分布式系统和实时数据交换应用中&#xff0c;C#作为一种现代面向对象编程语言&#xff0c;利用其***命名空间下的Socket类&#xff0c;提供强大的TCP/IP通信功能。本文将探讨C#中TCP/IP通信的基本概念、使用方…

基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的SAR影像目标检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的SAR影像目标…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1

文章目录 Jenkins环境一站式教程&#xff1a;从安装到配置&#xff0c;打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…

K8S命令部署后端(流水线全自动化部署)

前言 本文为链接: 云效流水线k8s半自动部署java&#xff08;保姆级&#xff09;的补充,本文起初的目的是为了补充完善k8s流水线的全自动化部署,但是也适用于k8s的一键重启,因为使用k8s的web页面容易出现漏点的情况,因此也可以把代码保存为shell脚本,同样可以实现一键重启。关于…

力扣-图论-7【算法学习day.57】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…