日志基础示例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.rhkb.cn/news/487166.html

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

相关文章

TimeXplusplus——提高时间序列数据的可解释性,避免琐解和分布偏移问题的深度学习可解释性的框架

摘要 论文地址&#xff1a;https://arxiv.org/abs/2405.09308 源码地址&#xff1a;https://github.com/zichuan-liu/timexplusplus 信号传输技术的优化对于推动光通信的发展至关重要。本文将详细探讨线路编码技术的目标及其实现方式。线路编码旨在提高带宽和功率效率&#xf…

python爬虫--某房源网站验证码破解

文章目录 使用模块爬取目标验证码技术细节实现成果代码实现使用模块 requests请求模块 lxml数据解析模块 ddddocr光学识别 爬取目标 网站验证码破解思路是统一的,本文以城市列表为例 目标获取城市名以及城市连接,之后获取城市房源信息技术直接替换地址即可 验证码 技术…

TimesFM模型论文内容

全文总结 这篇论文提出了一种基于解码器架构的时间序列预测基础模型TimesFM&#xff0c;旨在通过零样本学习在多种公共数据集上实现接近于监督学习模型的预测精度。 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何设计一个时间序列基础模型&#xff0c;使其在零样…

文生图模型开源之光!ComfyUI - AuraFlow本地部署教程

一、模型介绍 AuraFlow 是唯一一个真正开源的文生图模型&#xff0c;由Fal团队开源&#xff0c;其代码和权重都放在了 FOSS 许可证下。基于 6.8B 参数优化模型架构&#xff0c;采用最大更新参数化技术&#xff0c;还重新标注数据集提升指令遵循质量。在物体空间和色彩上有优势…

【高中生讲机器学习】28. 集成学习之 Bagging 随机森林!

创建时间&#xff1a;2024-12-09 首发时间&#xff1a;2024-12-09 最后编辑时间&#xff1a;2024-12-09 作者&#xff1a;Geeker_LStar 嘿嘿&#xff0c;你好呀&#xff01;我又来啦~~ 前面我们讲完了集成学习之 Boooooosting&#xff0c;这篇我们来看看集成学习的另一个分支…

双色Hanoi塔问题(hanoi)

双色Hanoi塔问题hanoi C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 设A、 B、 C是3 个塔座。开始时&#xff0c;在塔座A 上有一叠共n 个圆盘&#xff0c;这些圆盘自下而上&#xff0c;由大到小地叠在一…

微信小程序提交测试版,但是扫描体验版的二维码 显示 页面不存在

检查路径首页是否和我们微信小程序中的首页路径一致。 显然我的不一致。 {"pagePath": "pages/index/index","text": "产品","iconPath": "icons/Group 450.png","selectedIconPath": "/icons/组 …

12月9日IO

1.fread,fwrite实现文件拷贝 #include <myhead.h>int main(int argc, const char *argv[]) {// 打开两个文件FILE *fp fopen("1.txt", "r");FILE *fp1 fopen("2.txt", "w");if (NULL fp || NULL fp1) {perror("fopen&…

【服务器部署应用由http协议切换为https】

文章目录 服务器部署应用由http协议切换为https1. 下载openssl及其配置1.1 下载1.2 无脑下一步即可1.3 环境变量配置1.4 验证配置以及生成证书证书路径 2. nginx配置修改 服务器部署应用由http协议切换为https 1. 下载openssl及其配置 1.1 下载 openssl下载地址 根据系统选择…

如何创建基于udp的客户端和服务端

1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…

计算机视觉在科学研究(数字化)中的实际应用

计算机视觉是一种利用计算机技术来解析和理解图像和视频的方法。.随着计算机技术的不断发展&#xff0c;计算机视觉被广泛应用于科学研究领域&#xff0c;为科学家提供了无限的可能。 一、生命科学领域 在生命科学领域&#xff0c;计算机视觉被广泛用于图像识别、分类和测量等…

C++实现一个经典计算器(逆波兰算法)附源码

1、本篇要实现的内容 最近&#xff0c;大家讨论计算器的实现比较热&#xff0c;今天我也来用C和Visual Studio实现一个计算器的小程序。这里使用逆波兰算法&#xff0c;能够根据当前用户输入的算式表达式字符串&#xff0c;计算出所要的结果&#xff0c;算式字符串可以包括加、…

【电子元器件】音频功放种类

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 音频功放将小信号的幅值提高至有用电平&#xff0c;同时保留小信号的细节&#xff0c;这称为线性度。放大器的线性…

Linux图形化工具推荐

1、MobaXterm MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - DownloadFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Downloadhttps://mobaxterm.mobatek.net/download.html 2、FinalShell FinalShell SSH工具,服…

人工智能大模型LLM开源资源汇总(持续更新)

说明 目前是大范围整理阶段&#xff0c;所以存在大量机翻说明&#xff0c;后续会逐渐补充和完善资料&#xff0c;减少机翻并增加说明。 Github上的汇总资源&#xff08;大部分英文&#xff09; awesome-production-machine-learning 此存储库包含一系列精选的优秀开源库&am…

Python 读取 Excel 表格并导出为 DBF 文件

以下是将上述代码封装为函数的版本。函数接收 input_excel_path、sheet_name 和 output_dbf_path 作为参数&#xff0c;按照需求读取 Excel 表格并导出为 DBF 文件。 封装函数代码 import pandas as pd import dbfdef excel_to_dbf(input_excel_path, sheet_name, output_dbf_…

【设计模式系列】策略模式(二十四)

一、什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是软件设计模式中的一种行为型模式。它定义了一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互换使用&#xff0c;算法的变化不会影响使用算法的用户。策略模式让算法的变化独立于…

3.2 网络协议IP

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 1 定义2 虚拟互连网络3 分组在互联网中的传送4 IPv4 地址 1 定义 网际协议 IP是 TCP/IP 体系中两个最主要的协议之一&#xff0c;也是最重要的互连网协议之一。IPv4 和 IPv6 …

酷柚易汛生产管理系统PHP+Uniapp

生产管理系统&#xff0c;帮助企业数字化转型&#xff0c;打造智能工厂&#xff0c;专业为生产企业量身开发的一套完整的生产管理系统。主要包含以下模块&#xff1a;购货模块、生产模块、仓库模块、资料模块&#xff0c;可配合酷柚易汛进销存无缝衔接使用。 产品理念: 共享功…

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…