Python日志使用
1.实现一个简单的带颜色的日志import os import colorlog current_path os.path.abspath(os.path.dirname(__file__)) class LogHelp : 日志辅助类 _logger None _close_imme True staticmethod def set_close_flag(flag): LogHelp._close_imme flag staticmethod def _initlog(): import logging import colorlog LogHelp._logger logging.getLogger() # 输出到文件 logfile convert.log hdlr logging.FileHandler(logfile) # 创建一个ColorFormatter来设置日志消息的颜色 color_formatter colorlog.ColoredFormatter( %(log_color)s%(asctime)s - %(levelname)s - %(message)s, log_colors{ DEBUG: yellow, INFO: green, WARNING: yellow, ERROR: red, CRITICAL: red,bg_white, } ) # 将ColorFormatter添加到StreamHandler formatter logging.Formatter(%(asctime)s|%(levelname)s|%(lineno)d|%(funcName)s|%(message)s) hdlr.setFormatter(color_formatter) LogHelp._logger.addHandler(hdlr) # 输出到屏幕 hdlr2 logging.StreamHandler() hdlr2.setFormatter(color_formatter) hdlr2.setLevel(logging.INFO) LogHelp._logger.addHandler(hdlr2) LogHelp._logger.setLevel(logging.NOTSET) #LogHelp._logger.setLevel(logging.INFO) # LogHelp._logger.info(\n\n\n) # LogHelp._logger.info(logger is inited!) staticmethod def get_logger() : if LogHelp._logger is None : LogHelp._initlog() return LogHelp._logger staticmethod def close() : if LogHelp._close_imme: import logging if LogHelp._logger is None : return logging.shutdown() # log macro LOG_DEBUGLogHelp.get_logger().debug LOG_INFOLogHelp.get_logger().info LOG_WARNLogHelp.get_logger().warning LOG_ERRORLogHelp.get_logger().error FOREGROUND_RED 0x0c # red. FOREGROUND_GREEN 0x0a # green. FOREGROUND_BLUE 0x09 # blue. # 按间距中的绿色按钮以运行脚本。 if __name__ __main__: LOG_INFO(hahhahah)2.利用logging实现日志系统。提供更全的自定义内容import logging import datetime from pathlib import Path import shutil import typing from typing import Optional import sys import io class BaseLogger(logging.Logger): # pragma: no cover TODO class LogException(Exception): pass def __init__(self, name): super().__init__(name) self.console_handler: Optional[logging.StreamHandler] None self.console_error_handler: Optional[logging.StreamHandler] None # We can download logs from the BK build windows. So it is not necessary to log to files. self.file_handler: Optional[logging.FileHandler] None def warning(self, msg, *args, **kwargs): self.flush_console_output() super().warning(msg, *args, **kwargs) self.flush_console_error() def error(self, msg, *args, terminateTrue, **kwargs): self.flush_console_output() super().error(msg, *args, **kwargs) self.flush_console_error() if terminate: exit(1) def critical(self, msg, *args, **kwargs): self.flush_console_output() super().critical(msg, *args, **kwargs) self.flush_console_error() raise ValueError(Critical error happened.) def print(self, msg, *args, **kwargs): old_formatter self.console_handler.formatter self.console_handler.formatter logging.Formatter(%(message)s) super().info(msg, *args, **kwargs) self.console_handler.formatter old_formatter def flush(self): if self.console_handler: self.console_handler.flush() if self.console_error_handler: self.console_error_handler.flush() if self.file_handler: self.file_handler.flush() def flush_console_error(self): if self.console_error_handler: self.console_error_handler.flush() def flush_console_output(self): if self.console_handler: self.console_handler.flush() def suspend(self): fh self.file_handler fh.close() self.removeHandler(fh) def recover(self): fh _create_file_handler(self.name, appendTrue) fh.setLevel(logging.INFO) self.addHandler(fh) #创建日志记录器继承自定义的BaseLogger类 def _create_nfs_logger(logger_name, level) - BaseLogger: # pragma: no cover TODO logging.setLoggerClass(NfsLogger) new_logger typing.cast(NfsLogger, logging.getLogger(logger_name)) new_logger.setLevel(logging.DEBUG) info_stream io.TextIOWrapper(sys.stdout.buffer, encodingutf-8) info_handler logging.StreamHandler(info_stream) info_handler.setLevel(level) info_handler.addFilter(lambda record: record.levelno logging.INFO) info_formatter logging.Formatter(%(message)s) info_handler.setFormatter(info_formatter) new_logger.addHandler(info_handler) new_logger.console_handler info_handler error_stream io.TextIOWrapper(sys.stderr.buffer, encodingutf-8) error_handler logging.StreamHandler(error_stream) error_handler.setLevel(logging.WARNING) error_formatter logging.Formatter([%(levelname)s]: %(message)s - %(filename)s:%(lineno)d) error_handler.setFormatter(error_formatter) new_logger.addHandler(error_handler) new_logger.console_error_handler error_handler if common.LOCAL_BUILD: init_log_dir() file_handler _create_file_handler(logger_name) new_logger.addHandler(file_handler) new_logger.file_handler file_handler new_logger.info(fInit logger {logger_name} succeed) return new_logger #初始化日志记录器 def init_logger(logger_name, levellogging.DEBUG): # pragma: no cover TODO global task_logger if task_logger: default_logger.warning(Task logger cannot be recreated!) else: task_logger _create_nfs_logger(logger_name, level) return task_logger task_logger: Optional[BaseLogger] None def logger() - BaseLogger: if task_logger: return task_logger

相关新闻

堆叠与集群

堆叠与集群

一、堆叠与集群的概念 1、对于工作在接入层和汇聚层的盒式交换机而言,可以使用专门的堆叠线缆连接专门的堆叠口,来实现多台交换机在逻辑上绑定成一台逻辑交换机,从而大大提升其设备性能; 2、对于工作在核心层的框式交换机而言&a…

2026/8/25 7:56:31 阅读更多 →
C++基础:找出vector容器中最大的两个数

C++基础:找出vector容器中最大的两个数

C基础:找出vector容器中最大的两个数 文章目录C基础:找出vector容器中最大的两个数1. 前言2. 动态数组2.1 构造函数2.2 赋值操作2.3 插入和删除2.4 容量和大小2.5 数据存取2.6 互换容器2.7 释放内存3. 迭代器4. 算法4.1 排序4.2 倒序4.3 去重4.4 复制4.5…

2026/8/25 7:56:30 阅读更多 →
Git 配置、常见问题与实用技巧全攻略

Git 配置、常见问题与实用技巧全攻略

引言 Git 作为现代软件开发中不可或缺的版本控制工具,其配置的合理性与问题处理能力直接影响开发效率。本文系统整理了 Git 的核心配置方法、高频问题解决方案以及一系列提升效率的实用技巧,旨在帮助开发者快速搭建高效的 Git 工作环境并从容应对日常开发…

2026/8/25 7:55:30 阅读更多 →

最新新闻

解决VMware日志文件缺失错误:从权限到配置的完整修复指南

解决VMware日志文件缺失错误:从权限到配置的完整修复指南

1. 问题定位:当VMware提示“unable to proceed without a log file”时,到底发生了什么?如果你正在用VMware Workstation 16(或者更早的版本)启动一个虚拟机,突然弹出一个错误窗口,上面写着“un…

2026/8/25 8:36:49 阅读更多 →
MySQL小数类型选型指南:DECIMAL、FLOAT与DOUBLE精度与性能实战

MySQL小数类型选型指南:DECIMAL、FLOAT与DOUBLE精度与性能实战

1. 项目概述:为什么MySQL里存个小数,反而最容易翻车?“MySQL数据库(8):数据类型-小数”——这个标题看起来平平无奇,像极了教科书里第8章的课后习题。但我在带团队做金融系统迁移时,…

2026/8/25 8:36:49 阅读更多 →
AI求职转型:两周斩获offer的三大关键问题

AI求职转型:两周斩获offer的三大关键问题

1. 项目概述作为一名在AI行业摸爬滚打多年的从业者,我最近刚经历了一次成功的求职转型,仅用两周时间就拿到了心仪的AI岗位offer。在这个过程中,我总结出了三个关键问题,它们像指南针一样帮助我精准定位适合自己的工作机会。今天就…

2026/8/25 8:36:49 阅读更多 →
px还是dp?AndroidScreenAdaptation两种适配模式怎么选:UI标注px直接写、dp党也适用的完整对比

px还是dp?AndroidScreenAdaptation两种适配模式怎么选:UI标注px直接写、dp党也适用的完整对比

px还是dp?AndroidScreenAdaptation两种适配模式怎么选:UI标注px直接写、dp党也适用的完整对比 【免费下载链接】AndroidScreenAdaptation A light and easy-to-use Android development screen adaptation tool library(一个轻量好用的安卓开发屏幕适配工…

2026/8/25 8:36:49 阅读更多 →
HyperLine Spotify插件深度解析:如何在macOS终端实时显示正在播放歌曲(完整原理指南)

HyperLine Spotify插件深度解析:如何在macOS终端实时显示正在播放歌曲(完整原理指南)

HyperLine Spotify插件深度解析:如何在macOS终端实时显示正在播放歌曲(完整原理指南) 【免费下载链接】hyperline ✨ Status line plugin for Hyper ✨ 项目地址: https://gitcode.com/gh_mirrors/hy/hyperline HyperLine 是一款为 Hy…

2026/8/25 8:36:49 阅读更多 →
foobox-cn:三步给foobar2000换上现代化DUI皮肤,新手直接上手

foobox-cn:三步给foobar2000换上现代化DUI皮肤,新手直接上手

foobox-cn:三步给foobar2000换上现代化DUI皮肤,新手直接上手 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobar2000的音质口碑一直在线,但默认界面还是那套灰扑…

2026/8/25 8:35:49 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →