日志基础示例python和c++

文章目录

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

0. 引言

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

1. python

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

import logging
import colorlog
import os
from datetime import datetimeclass ColorLogger:SUCCESS_LEVEL_NUM = 25def __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)# 创建控制台 handlerconsole_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)# 创建文件 handlerfile_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 Logginggoogle::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.mzph.cn/news/888926.shtml

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

相关文章

【Linux】基础IO-----文件详解

目录 一、文件理解&#xff1a; 二、C语言的文件操作&#xff1a; 1、fopen&#xff1a; 什么是当前路径&#xff1a; 2、fclose&#xff1a; 3、fwrite&#xff1a; 4、默认打开的三个流&#xff1a; 三、系统文件&#xff1a; 1、open&#xff1a; 2、close&#xf…

第7章:响应式设计 --[CSS零基础入门]

什么是响应式设计 响应式设计&#xff08;Responsive Web Design, RWD&#xff09;是一种网页设计和开发的方法&#xff0c;它使网站能够根据用户的设备特性&#xff08;如屏幕尺寸、分辨率、方向等&#xff09;自动调整其布局和内容。响应式设计的目标是确保网站在不同类型的…

探索 ONLYOFFICE 8.2 版本:更高效、更安全的云端办公新体验

引言 在当今这个快节奏的时代&#xff0c;信息技术的发展已经深刻改变了我们的工作方式。从传统的纸质文件到电子文档&#xff0c;再到如今的云端协作&#xff0c;每一步技术进步都代表着效率的飞跃。尤其在后疫情时代&#xff0c;远程办公成为常态&#xff0c;如何保持团队之间…

Vue-打印自定义HTML表格

自定义打印方法 1. 准备HTML结构 首先&#xff0c;构造了一个基本的HTML页面框架&#xff0c;并设置了页面的字符编码为UTF-8&#xff0c;以确保中文和其他特殊字符能正确显示。页面的标题设置为传入的 title 参数值。 let printStr "<html><head><met…

http1.0、1.1、2.0、 3.0

http1.0、1.1、2.0、 3.0 http1.1 引入长连接&#xff0c;在1.0&#xff0c;每次请求都需要建立新的TCP连接&#xff0c;处理请求完毕后立即断开。就导致处理大量图片&#xff0c;链接等资源&#xff0c;需要大量的连接与断开&#xff0c;造成资源浪费和时间延迟。而长连接允许…

跟着问题学15——GRU网络结构详解及代码实战

1 RNN的缺陷——长期依赖的问题 &#xff08;The Problem of Long-Term Dependencies&#xff09; 前面一节我们学习了RNN神经网络&#xff0c;它可以用来处理序列型的数据&#xff0c;比如一段文字&#xff0c;视频等等。RNN网络的基本单元如下图所示&#xff0c;可以将前面的…

pytest中使用conftest做测试前置和参数化

pytest中比较高阶的应用是&#xff0c;使用conftest去做测试前置工作、测试收尾工作和参数化。conftest是pytest的一个组件&#xff0c;用于配置测试环境和参数。通过conftest, 可以创建一个可复用的测试配置文件&#xff0c;以便在多个测试模块之间共享配置信息。即&#xff0…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

mvn test 失败,单独运行单元测试成功

标题mvn test 失败&#xff0c;单独运行单元测试成功 使用junit4进行单元测试时是通过的&#xff0c;但是在执行maven的test与package时测试不通过 报错信息&#xff1a; parse data from Nacos error,dataId:guoyu-new-asset-dev.yml,data: ....... 配置文件内容 ....... o…

android 富文本及展示更多组件

模拟微博 #热贴 和 用户 的这种 富文本形式组件&#xff0c;不说了&#xff0c; 直接上代码 package com.tongtong.feat_watch.viewimport android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater impo…

gitlab 生成并设置 ssh key

一、介绍 &#x1f3af; 本文主要介绍 SSH Key 的生成方法&#xff0c;以及如何在GitLab上添加SSH Key。GitLab 使用SSH协议与Git 进行安全通信。当您使用 SSH密钥 对 GitLab远程服务器进行身份验证时&#xff0c;您不需要每次都提供您的用户名和密码。SSH使用两个密钥&#x…

保姆级教程Docker部署Nacos镜像

目录 1、创建挂载目录 2、拉取 Nacos 镜像 3、临时启动并复制文件 4、创建Nacos表结构 5、修改Nacos配置 6、正式启动 Nacos 7、登录Nacos 1、创建挂载目录 在宿主机上创建一个目录用于配置文件映射&#xff0c;这个目录将作为数据卷挂载到容器内部&#xff0c;使得我…

【北京迅为】iTOP-4412全能版使用手册-第六十七章 USB鼠标驱动详解

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…

Java项目实战II基于微信小程序的旅游社交平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着移动互联网的迅猛发展&#xff0c;旅游已经成为人…

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…

IS-IS二

目录 ISIS建立邻接关系的基本条件&#xff1a; 1、接口链路类型一致 2、广播型链路上&#xff0c;接口类型一致 3、Hello包级别和类型一致 4、L1区域的ID要一致&#xff0c;L2的邻居区域ID不做要求 5、L1-2在区域ID相同下&#xff0c;即建立L1也建立L2区域ID不同只能建立…

️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南20241206

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南 &#x1f4dd; 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能的飞速发展&#xff0c;越来越多的开发者尝试在本地环境中部署大模型进行实验。然而&#xff0c;由于资源需求高、网络限制多…

设计模式の单例工厂原型模式

文章目录 前言一、单例模式1.1、饿汉式静态常量单例1.2、饿汉式静态代码块单例1.3、懒汉式单例&#xff08;线程不安全&#xff09;1.4、懒汉式单例&#xff08;线程安全&#xff0c;同步代码块&#xff09;1.5、懒汉式单例&#xff08;线程不安全&#xff0c;同步代码块&#…

net.sf.jsqlparser.statement.select.SelectItem

今天一启动项目&#xff0c;出现了这个错误&#xff0c;仔细想了想&#xff0c;应该是昨天合并代码&#xff0c;导致的mybatis-plus版本冲突&#xff0c;以及分页PageHelper版本不兼容 可以看见这个我是最下边的Caused by 报错信息&#xff0c;这个地方提示我 net .sf.jsqlpar…