Python写日志【自用】

【Python实用教学】Python 中如何高效完美地处理日志记录? 优雅地处理日志对于应用程序的健康运行至关重要。logging模块为开发者提供了多种方法来记录和管理日志信息。从基础的配置到高级的处理器和过滤器,在本文中全面探讨了 Python 中如何优雅地处理日志。 阅读详情

记录代码出错的位置

def f2(b, a):
    print(b - a)

def f1(a, b):
    return f2(b, a)

def try_log(func, *args, **kwargs):
    from time import strftime
    from traceback import format_exc
    try:
        func(*args, **kwargs)
    except:
        error = format_exc()
        print('\033[031m', error, '\033[0m', sep='\n')
        with open('%s.log' % strftime('%Y-%m-%d'), 'a', encoding='utf-8') as f:
            f.write('%s\n' % error)

if __name__ == '__main__':
    try_log(f1, 1, b='2')

分日期保存文件

def write_log(*args):
    from time import strftime
    ymd = strftime('%Y%m%d')
    with open('%s.log' % ymd, 'a', encoding='utf-8') as f:
        for i in args:
            f.write('%r\n' % i)
        f.write('\n')

traceback+写文件

import os
from traceback import format_exc
from time import strftime
_path = os.path.dirname(__file__)
_get_abs_path = lambda path: os.path.normpath(os.path.join(_path, path))

def write_log(*args, **kwargs):
    fname = kwargs.pop('fname') if 'fname' in kwargs else'log.txt'
    with open(fname, 'a', encoding='utf-8') as f:
        for i in args:
            f.write('{}\n'.format(i))
            print('\033[031m', i, '\033[0m')
        for i in kwargs.items():
            f.write('{} {}\n'.format(*i))
            print('\033[031m', *i, '\033[0m')
        f.write('\n')

def traceback_func(func, *args, **kwargs):
    try:
        value = func(*args, **kwargs)
        return value
    except:
        error = format_exc()  # 在线程中失效
        write_log(error, *args, **kwargs)

def remove():
    """清空日志,谨慎启动"""
    for fname in os.listdir(_path):
        if '.txt' in fname:
            abs_fname = _get_abs_path(fname)
            print(abs_fname)
            os.remove(abs_fname)

if __name__ == '__main__':
    remove()

traceback+装饰器

from traceback import format_exc

def write_log(*args, **kwargs):
    fname = kwargs.pop('fname') if 'fname' in kwargs else'log.txt'
    with open(fname, 'a', encoding='utf-8') as f:
        for i in args:
            f.write('{}\n'.format(i))
            print('\033[031m', i, '\033[0m')
        for i in kwargs.items():
            f.write('{} {}\n'.format(*i))
            print('\033[031m', *i, '\033[0m')
        f.write('\n')

def traceback_func(fn):
    def function_timer(*args, **kwargs):
        try:
            result = fn(*args, **kwargs)
            return result
        except:
            error = format_exc().strip()  # 在线程中失效
            write_log(error, *args, **kwargs)
    return function_timer

def f1(a):
    print(int(a))

@traceback_func
def f2(a, *args, **kwargs):
    f1(a)

if __name__ == '__main__':
    f2('a', fname='a.txt', k='v')

logging模块

format中文解释remark
%(message)s日志信息必要
%(asctime)s时间常用
%(pathname)s绝对路径:sys.argv[0]常用
%(lineno)d行号常用
%(funcName)s函数名常用
%(module)s模块名有用
%(filename)s文件名有用
%(relativeCreated)d导入logging后的相对时间(毫秒级)有用
%(created)f当前时间:time.time()少用
%(levelname)s日志级别名称,DEBUG、INFO、ERROR……少用
%(levelno)s日志级别(10, 20, 30, 40, 50)少用
%(name)s日志器名称,默认root少用
%(process)s进程ID不用
%(processName)s进程名称不用
%(thread)s线程ID不用
%(thread)s线程名称不用
%(msecs)dasctime时间的毫秒部分不用
"""
message | %(message)s | 日志信息 | 必要
asctime | %(asctime)s | 时间 | 常用
pathname | %(pathname)s | 绝对路径:sys.argv[0] | 常用
lineno | %(lineno)d | 行号 | 常用
funcName | %(funcName)s | 函数名 | 常用
module | %(module)s | 模块名 | 有用
filename | %(filename)s | 文件名 | 有用
relativeCreated | %(relativeCreated)d | 导入logging后的相对时间(毫秒级) |有用
created | %(created)f | 当前时间:time.time() | 少用
levelname | %(levelname)s | 日志级别名称,DEBUG、INFO、ERROR…… | 少用
levelno | %(levelno)s | 日志级别(10, 20, 30, 40, 50) | 少用
name | %(name)s | 日志器名称,默认root | 少用
process | %(process)s | 进程ID | 不用
processName | %(processName)s | 进程名称 | 不用
thread | %(thread)s | 线程ID | 不用
threadName | %(thread)s | 线程名称 | 不用
msecs | %(msecs)d | asctime时间的毫秒部分 | 不用
"""
import logging, time
logging.basicConfig(level=logging.DEBUG, format=__doc__)  # 配置
# logging.info('msg')
time.sleep(.5)  # 检验relativeCreated
logger = logging.getLogger('a1')
logger.debug('msg')

打印结果

message | msg | 日志信息 | 必要
asctime | 2020-02-13 16:21:34,550 | 时间 | 常用
pathname | E:/PycharmProjects/anaconda/logger/__init__.py | 绝对路径:sys.argv[0] | 常用
lineno | 25 | 行号 | 常用
funcName | <module> | 函数名 | 常用
module | __init__ | 模块名 | 有用
filename | __init__.py | 文件名 | 有用
relativeCreated | 501 | 导入logging后的相对时间(毫秒级) |有用
created | 1581582094.550740 | 当前时间:time.time() | 少用
levelname | DEBUG | 日志级别名称,DEBUG、INFO、ERROR…… | 少用
levelno | 10 | 日志级别(10, 20, 30, 40, 50) | 少用
name | a1 | 日志器名称,默认root | 少用
process | 4608 | 进程ID | 不用
processName | MainProcess | 进程名称 | 不用
thread | 14292 | 线程ID | 不用
threadName | 14292 | 线程名称 | 不用
msecs | 550 | asctime时间的毫秒部分 | 不用

路径引用示例

日志等级

日志级别名称描述日志级别
DEBUG调试,最详细的日志信息10
INFO基本信息(如,打印时间、进度、中间结果、最终结果…)20
WARNING预警信息(如,磁盘可用空间较低),此时应用程序仍正常运行30
ERROR错误信息,程序某功能不能运行40
CRITICAL严重错误信息,程序不能运行50
  • CRITICAL > ERROR > WARNING > INFO > DEBUG
  • 默认级别为WARNING(输出大于等于WARNING级别的日志)

四大组件

组件名称对应类名功能描述
日志器Logger提供了应用程序可一直使用的接口
处理器Handler将logger创建的日志记录发送到合适的目的输出
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志,丢弃哪条日志
格式器Formatter决定日志记录的最终输出格式
常用Logger方法
Logger.addHandler()
常用Handler
logging.StreamHandler:日志打印
logging.FileHandler:日志写入文件
常用Formater参数
fmt:格式
datefmt:时间格式

写文件

import logging

# logger对象
logger = logging.getLogger()

# Handler加入
sh = logging.StreamHandler()  # 打印
fh = logging.FileHandler('log.txt', encoding='utf-8')  # 写文件
logger.addHandler(sh)
logger.addHandler(fh)

# 日志等级
logger.setLevel(logging.DEBUG)
sh.setLevel(logging.INFO)
fh.setLevel(logging.WARNING)

# 日志格式
fmt = logging.Formatter('%(message)s\n%(asctime)s\n%(pathname)s\n%(lineno)d\n')
sh.setFormatter(fmt)
fh.setFormatter(fmt)

# 日志过滤
class Filter(logging.Filter):
    def filter(self, record):
        if record.msg is not None:
            return True
logger.addFilter(Filter())

if __name__ == '__main__':
    logger.info('info')  # 只打印
    logger.warning('警告')  # 既打印也写文件
    logger.error(None)  # 过滤空值
Python写自动化之logging日志写入 日志写入是我们日常工作中常用到的功能,我们可以直接使用写文件的方式来以自己的方式写日志,另外,当我们在一个比较大的项目中,涉及到日志写入时,一般会使用logging模块来进行日志的写入,第一步,先写一个单例,创建一个logger对象: def _instance(): global logger if logger is None: logging.config. 阅读详情

相关推荐

【Python】写日志

Log Level logging模块提供5个级别的日志管理, 日志等级由下至上逐渐提升,设置日志等级后,只有等级大于等于设定级别的日志写入操作才会执行写入,如果将log的level设置为INFO,那么除了DEBUG级别的打印/写文件之外,其他级别的都会打印/写入 控制台打印日志 方式一:获取log的root对象,设置level后直接打印import logging #获取logger ro...

u011974126的专栏 430

Python日志全攻略

logging模板块是Python的一个内置标准库,用于实现对日志的控制输出,对于日常的日志输出,甚至是系统级的日志输出,也均可以使用logging模块来进行实现。配置1.服务用于对logging模块整个日志输出的一次性配置,也就是说屡次配置时以第一次配置的为准,以后再使用basicConfig进行配置则无效。设置日志输出的文件,默认输出到控制台。设置打开日志文件的方式,默认为“a”,即追加。设置日志时间字符串的输出格式,默认时间字符串格式为%Y-%m-%d%H%M%S。和。................

noobiee的博客 5855

单细胞转录组分析(scRNA-seq)

单细胞转录组测序(Single-cell RNA sequencing,scRNA-seq)是一种高通量测序技术,可以在单细胞水平解析基因表达情况,揭示细胞异质性,探索稀有细胞类型,并研究细胞状态转换及动态调控机制。与传统的。

大甘的博客 6150

python日志

python日志文件相关操作

my19880888的博客 6731

为什么传统CNN在视网膜分割中败给Mamba?从血管拓扑学揭秘Serp-Mamba的蛇形扫描黑科技

本文深入分析了传统CNN在视网膜血管分割任务中的局限性,特别是在处理高分辨率图像和复杂血管拓扑结构时。针对这些问题,文章重点介绍了Serp-Mamba模型的核心创新——蛇形交织自适应扫描(SIA)机制,该机制通过让扫描路径自适应地贴合血管曲率,并结合模糊驱动双重校准(ADDR)模块应对极端类别失衡,从而在视网膜血管分割任务上实现了性能的显著突破。

ss78901的博客 897

LightGBM学习笔记

LightGB学习笔记1. lightgbm概述1.1 lightgbm介绍1.2 lightgbm和xgboost对比2 .直方图算法及改进2.1 直方图算法2.2 直方图算法改进2.2.1 GOSS算法3.树的生长策略4.系统设计5. 实战 lightgbm是基于boosting的学习框架,使用的是基于决策树的学习算法,具有更快的训练速度、更低的内存使用、更高的正确率、并且能够支持并行化学习,可以用来处理大规模数据,本文主要是针对学习视频https://www.bilibili.com/video/BV

一一xi的博客 3306

Python 实现简单的日志功能

【代码】Python 实现简单的文件日志功能。

Y32579的博客 651

BPMN2.0规范及流程引擎选型方案

本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。

比特桃 1万+

Python如何写日志文件

Python如何写日志文件

weixin_62234706的博客 712

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)

SPSS(二)SPSS实现多因素方差分析模型 单因素方差分析上一篇博客https://blog.youkuaiyun.com/LuYi_WeiLin/article/details/89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素方差分析,就是同时考虑若干个控制因素的情况下,分别分析它们的改变是否造成观察变量的显著变动 (多个自变量,一个因变量)自变量类型以分类变量为主也可以...

可乐联盟 6万+

python logging 重复写日志问题

python logging 重复写日志问题用Python的logging模块记录日志时,遇到了重复记录日志的问题,第一条记录写一次,第二条记录写两次,第三条记录写三次。。。很头疼,这样记日志可不行。网上搜索到了原因与解决方案:原因:没有移除handler 解决:在日志记录完之后removeHandler修改前示例代码:import logging def log(message): lo

灰蓝 3万+

全新YOLOv11有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

YOLOv11专栏持续更新500+种创新改进方案,涵盖卷积优化、注意力机制、主干网络、Neck特征融合、检测头、小目标检测等核心模块。提供独家创新点组合方案、模型轻量化改进及最新Mamba架构融合技术,配套完整实验代码和训练参数解析。订阅用户可加入专属答疑群,获取一键运行项目支持。专栏包含YOLOv11网络结构详解、配置文件解读等入门必读内容,助力科研论文发表与模型性能提升。限时开放订阅通道,提供多种涨点改进方案组合,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 4016

python如何写日志_Python写日志文件

【例】/root/testpmpy/bin/recordLog.py的作用是记录日志,记录的日志会存放在/root/testpmpy/log下。最新的日志名称为iamrecord.log,之后每次运行都会将上一个iamrecord.log加上时间戳后缀。recordLog.py内容如下注:举例仅描述功能,单独使用没有实际意义,可以作为函数嵌入到其它脚本。import sys, os, time, ...

weixin_39936380的博客 1063

RTT Studio和Cubemx联合开发

1. RTT studio创建工程 创建工程 ## 创建完成以后的目录结构 2. 配置CubuMx 双击cubumx的图标打开CubeMx 配置时钟 生成代码 构建后的代码结构 编译代码满屏错误:不要慌 3. 新增脚本 新建scons脚本文件 SConscript 脚本内容如下 import os from building import * cwd = GetCurrentDir() src = Glob('*.c') # add cubemx drivers src = Split('''

Car12 1568

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python写日志文件

 日志文件是记录程序操作及事件的记录文件或记录文件的集合。一般由程序开发人员编写,开发、运维人员共同使用,开发人员可以通过日志调试程序,运维人员通过日志检查程序近期是否正常运行,如果出现异常,则可通过日志快速定位问题。因此,用日志记录程序流程,事件,以及异常时的详细信息非常重要,尤其是对于部署在客户场地的程序。另外,日志有时也用于记录用户操作、程序运行地理位置等跟踪信息,用于后台的用户研究和数据挖...

谢彦的技术博客 9720

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python如何写日志_python写日志

导读热词写日志的办法多种多样,我这个是我喜欢的办法,可以做个参考没啥说的,直接上代码def write_log(value):now_time = time.time() #获取当前日期和时间time_format = '%Y-%m-%d %H:%M:%S' #指定日期和时间格式time_put = time.strftime(time_format,now_time) #格式化时间,时间变成YY...

weixin_29207149的博客 1450

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python 日志模块封装_python写日志封装类实例

python写日志封装类实例本文实例讲述了python实现写日志封装类。分享给大家供大家参考。具体如下:# encoding:utf-8import sysimport loggingimport timedef writeLog(message):logger=logging.getLogger()filename = time.strftime('%Y-%m-%d',time.localtim...

weixin_29952601的博客 432

Python 记录异常和写日志

python 2 : try: my_fun() exception exceptions as e: print (e) python3: try: my_fun() exception Exception as e: print (e)

tutu96177的博客 4397

python如何写日志_【Python】教你如何在python中添加日志

背景起因是这次的项目用thrift来连接算法(python)和业务逻辑(java),因此有必要在python中添加日志来记录传入的参数。这样,当算法端没有正确响应时,就能方便地排查原因。简易版实现首先,我在google里面找到了官方的HOWTO文档资料。具体文档见参考资料1.如何将日志落成日志文件?import logging​logging.basicConfig(filename='examp...

weixin_39963465的博客 976

python logging模块-写日志、log回滚

1、logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点: 1、可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息; 2、print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出; 3、其它特点:basicConfig整个工程只在第一次配置时生效。

alex1801 7455

python如何写日志_python如何写日志

这篇文章介绍了 Python 的 logging 模块,包括它的设计以及针对更多复杂案例的适用方法。这篇文章不是写给开发者的文档,它更像是一个指导手册,来说明 Python 的 logging 模板是如何搭建的,并且激发感兴趣的人深入研究。为什么使用 logging 模块?也许会有开发者会问,为什么不是简单的 print 语句呢? Logging 模块有很多优势,包括:多线程支持通过不同级别的日志...

weixin_29614359的博客 829

python如何写日志_一日一技:更优雅地在 Python 中写日志

一日一技:更优雅地在 Python 中写日志摄影:产品经理买单:kingname原来我们在 Python 中写日志,使用的是 Python 自带的 logging 模块,要实现既在终端输出,又能写文件,并且日志文件还能 rotate ,代码需要十多行:import loggingfrom logging.handlers import RotatingFileHandleros.makedirs(...

weixin_39927508的博客 507

python异步_python异步写日志 | 学步园

附件中下载代码:假设有以下函数Python代码def myfunc():logging.info('log something ....')##do something#logging.info('log something agein')return 2这个函数在 return 2 之前记录了2次日志。并且必须要等这两条logging写入硬盘中之后才return 2现在遇到的一个情况就是这个函数...

weixin_39881958的博客 580

logging的陷阱:python使用logging不能写日志,写不出日志

问题我自己写了两个模块request和checkcode,这两个中都引用了logging进行记录日志. 当分别使用request和checkcode时均没有问题,但是,将两个模块都导入后,写日志就出现异常.总是一个能写日志,一个不能写日志.原因因为两个文件中都是使用logging配置文件的方式创建logger,而且这两个模块都使用的不是同一个配置文件,所以,执行了两遍logging.config.

win_turn的博客 1万+
上一篇: 图解Python逻辑回归:调包实现+徒手实现
下一篇: sklearn各聚类算法比较
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值