Python 日志

news/2024/10/23 9:24:30/

欢迎访问我的博客首页。


Python 日志

  • 1. 通过函数调用栈实现
  • 2. 改变 print 函数输出字体的颜色
  • 3. 使用 logging
    • 3.1 自定义名称的句柄
    • 3.2 使用默认句柄
  • 4. 参考

1. 通过函数调用栈实现


  traceback 库记录着 Python 的调用栈。使用 traceback,不仅可以输出日志位置,还可以输出函数调用栈。

import traceback, time, osdef selfLog(*logs, toFile=True):tracebackinfo = str(traceback.extract_stack()[-2])begin = tracebackinfo.index('file')end = tracebackinfo.rindex(' in')tracebackinfo = tracebackinfo[begin:end]times = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())if toFile:tracebackinfo = 'file ' + os.path.basename(tracebackinfo)handle = open('log.txt', 'a')handle.write('-- log: %s, %s\n' % (tracebackinfo, times))handle.write('    ')for log in logs[:-1]:handle.write('%s ' % log)handle.write('%s\n' % logs[-1])handle.close()returnprint('-- log: %s, %s' % (tracebackinfo, times))print('   ', end='')for log in logs[:-1]:print('%s' % log, end=' ')print(logs[-1])

  假如上面的代码在 selfLog.py 中,调用者代码:

from selfLog import selfLog
selfLog('abcd')
selfLog('abc', 'def')

  可以看出,我们可以像使用 print 语句一样使用 selfLog:输出单个对象、逗号隔开的多个对象、格式化输出对象。

2. 改变 print 函数输出字体的颜色


  python 可以指定 print 字体颜色,代码 selfLog.py:

import config
import time, traceback
from colorama import initinit(autoreset=True)def getColor(rank):manner = 1foreground = 30  # [30, 37]background = 47  # [40, 47]foreground += rank % 8background -= rank % 8# color = '\033[%d;%d;%dm' % (manner, foreground, background)color = '\033[%d;%dm' % (manner, foreground)return colordef selfLog(rank, *logs):if rank < config.selfLogRank:returntracebackinfo = str(traceback.extract_stack()[-2])begin = tracebackinfo.index('file')end = tracebackinfo.rindex(' in')tracebackinfo = tracebackinfo[begin:end]times = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())print('-- %s, %s' % (tracebackinfo, times))color = getColor(rank)for log in logs:print('   %s%s' % (color, log), end=' ')print()

config.py:

selfLogRank = 0

main.py:

from selfLog import selfLogif __name__ == '__main__':selfLog(1, 'Reading image...', 'info_1', 'info_2')selfLog(3, 'Failed to read image!', 'info_1')

  调用时第一个参数 rank 不小于 config.selfLogRank 才会输出。

3. 使用 logging


  logging 是 Python 的日志库,可以很方便地把日志输出到控制台或文件中。

  使用 logging 库,可以输出单个字符串、数字、变量等对象,但不能输出逗号隔开的多个对象。如果想输出多个对象,需要使用格式化输出。

3.1 自定义名称的句柄


  标准库 logging 有一个 logger,该 logger 有一个名称为 root 的默认句柄。句柄负责输出日志,可以通过 logger 添加句柄。

import time
import loggingdef init_log():# 1.变量。date_fmt = '%Y/%m/%d %H:%M:%S'masg_fmt = '%(name)s %(pathname)s, line %(lineno)d, %(asctime)s %(levelname)-5.5s: %(message)s'path_log = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.log'# 2.名称为 root 的默认日志。logging.basicConfig(filename='root_' + path_log, filemode='w', format=masg_fmt, datefmt=date_fmt,level=logging.NOTSET)# 3.自定义名称的日志。logger = logging.getLogger('阿尔法公司')# 3.1 控制台。console_handler = logging.StreamHandler()console_handler.setLevel(logging.WARNING)console_handler.setFormatter(fmt=logging.Formatter(fmt=masg_fmt, datefmt=date_fmt))logger.addHandler(console_handler)# 3.2 文件。file_handler = logging.FileHandler(filename=path_log, mode='a', encoding='utf-8')file_handler.setLevel(logging.ERROR)file_handler.setFormatter(fmt=logging.Formatter(fmt=masg_fmt, datefmt=date_fmt))logger.addHandler(file_handler)return loggerif __name__ == '__main__':logger = init_log()logging.info('logging 信息')logging.debug('logging 调试')logging.warning('logging 警告')logging.error('logging 错误')logging.critical('logging 严重错误')logger.info('logger 信息')logger.debug('logger 调试')logger.warning('logger 警告')logger.error('logger 错误')logger.critical('logger 严重错误')

  basicConfig 用于配置默认名为 root 的句柄。在这里配置文件名时日志将会被输出到文件,否则输出到控制台。无论使用 logging.info/debug/warning/error/critical 还是 logger.info/debug/warning/error/critical 输出,都会按 basicConfig 的配置输出到文件或控制台。

  上面使用 logger 添加的两个自定义句柄,分别把日志输出到控制台和文件。这两个句柄只能响应 logger.info/debug/warning/error/critical,不能响应 logging.info/debug/warning/error/critical。

3.2 使用默认句柄


  虽然自定义句柄可以指定名称,但我们必须获取 logger,才能使用它输出。在其它文件中使用 logger,必须先把它 import 进来。使用默认句柄时,只需在项目任意位置配置 logging,在其它文件只需 import logging 就能直接使用。

import time
import loggingdef init_log():# 1.变量。date_fmt = '%Y/%m/%d %H:%M:%S'masg_fmt = '%(name)s %(pathname)s, line %(lineno)d, %(asctime)s %(levelname)-5.5s: %(message)s'path_log = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + '.log'# 2.名称为 root 的默认日志。# logging.basicConfig(filename='root_' + path_log, filemode='w', format=masg_fmt, datefmt=date_fmt,#                     level=logging.NOTSET)# 3.自定义名称的日志。# logger = logging.getLogger('阿尔法公司')# 3.1 控制台。console_handler = logging.StreamHandler()console_handler.setLevel(logging.WARNING)console_handler.setFormatter(fmt=logging.Formatter(fmt=masg_fmt, datefmt=date_fmt))logging.getLogger().addHandler(console_handler)# 3.2 文件。file_handler = logging.FileHandler(filename=path_log, mode='a', encoding='utf-8')file_handler.setLevel(logging.ERROR)file_handler.setFormatter(fmt=logging.Formatter(fmt=masg_fmt, datefmt=date_fmt))logging.getLogger().addHandler(file_handler)if __name__ == '__main__':init_log()logging.info('logging 信息')logging.debug('logging 调试')logging.warning('logging 警告')logging.error('logging 错误')logging.critical('logging 严重错误')

4. 参考


  1. print 颜色
  2. logging 级别,博客园,2019。

http://www.ppmy.cn/news/29127.html

相关文章

前端二面vue面试题总结

什么是 mixin &#xff1f; Mixin 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果希望在多个组件之间重用一组组件选项&#xff0c;例如生命周期 hook、 方法等&#xff0c;则可以将其编写为 mixin&#xff0c;并在组件中简单的引用它。然后将 mixin 的内容合并到组件中…

计算理论 复杂度预备知识

文章目录计算理论 复杂度预备知识符号递归表达式求解通项公式主方法Akra-Bazzi 定理计算理论 复杂度预备知识 符号 f(n)o(g(n))f(n)o(g(n))f(n)o(g(n)) &#xff1a;∃c\exists c∃c &#xff0c;当 nnn 足够大时&#xff0c; f(n)<cg(n)f(n)\lt cg(n)f(n)<cg(n) &#…

Kafka基本概念

什么是Kafka Kafka是一个消息系统。它可以集中收集生产者的消息&#xff0c;并由消费者按需获取。在Kafka中&#xff0c;也将消息称为日志(log)。 一个系统&#xff0c;若仅有一类或者少量的消息&#xff0c;可直接进行发送和接收。 随着业务量日益复杂&#xff0c;消息的种类…

华为机试题:HJ86 求最大连续bit数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【链表OJ题(一)】移除链表元素

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(一)1. 移除…

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。…

互联网医院系统软件开发|互联网医院管理系统开发的好处

互联网医院一直是现在的热门行业&#xff0c;很多的医院已经开发了互联网医院&#xff0c;并且已经在良好的运行中&#xff0c;而有一些医院和企业正在开发中&#xff0c;或者打算开发互联网医院系统&#xff0c;其实这些企业和医院还是很有远见的&#xff0c;因为他们知道并了…

mysql实现if语句判断功能的六种使用形式

文章目录 前言一、ifnull函数二、nullif函数三、if函数四、if语句(多用于存储过程)五、if-else语句(多用于存储过程)六、if-elseif-else语句(多用于存储过程)总结前言 在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,函数的好处是可以作为sql的一…