当前位置:首页 » 编程语言 » pythonlogging多线程

pythonlogging多线程

发布时间: 2023-01-30 09:08:38

python中主线程怎样捕获子线程的异常

最近因为别的需求,写了一个模块,似乎在这里能用得上:

https://github.com/SakuraSa/ChatProcess


其中的 example.py :

#!/usr/bin/envpython
#coding=utf-8

"""
example
"""

__author__='Rnd495'

fromtimeimportsleep
fromChatProcessimportChatroom


classEcho(Chatroom):
"""
Echo
"""
defresponse(self,data):
ifdata.startswith('sleep'):
sec=float(data[6:])
sleep(sec)
return'wakeupafter%dms'%(sec*1000)
elifdata:
returndata
else:
self.stop()
return'goodbye'


if__name__=='__main__':
,ProcessError

print'process01:'
e=Echo.create_process(lifetime=1).start()
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:0.1'),e.remain
printe.chat(''),e.remain

print''
print'process02:'
e=Echo.create_process(lifetime=1).start()
try:
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:1.0'),e.remain
printe.chat(''),e.remain
exceptTimeoutError,error:
print'error:',error

print''
print'process03:'
e=Echo.create_process(lifetime=1).start()
try:
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:notanum'),e.remain
printe.chat(''),e.remain
exceptProcessError,error:
print'error:',error


运行结果为:

process01:
Helloworld!0.773000001907
wakeupafter100ms0.549000024796
goodbye0.547000169754

process02:
Helloworld!0.868000030518
error:TimeoutError

process03:
Helloworld!0.868000030518
error:('Erroroccurredonloop',ValueError('couldnotconvertstringtofloat:notanum',))


在其中的 process01 中,主进程捕获了 超时

在其中的 process02 中,主进程捕获了 子进程的错误


不知道你能不能用得上

⑵ logging:多线程调试时用来代替print和单步调试

当你要写多线程项目时,不免要调试错误,要debug。

一般debug的工具就是打印函数print, 调试工具gdb进行单步调试,但是多线程时,单步调试就很鸡肋了,这时就需要打印日志了

没错,打印日志无疑是调试多线程工程的高效工具了。

在python中开发,就要用到logging日志库了

logging库已经封装好日志需要的基本功能,能够实现在文件里,在命令行等写日志

还能输出日志信息的类型,如debug,warning,error等

细节在这里有所介绍:

https://docs.python.org/3/howto/logging.html

文本介绍一下,第一次使用logging时,要熟悉logging时,需要用一个非常简单的例子

先看一个最简单的例子:

运行以上代码:

printed out on the console. The INFO message doesn’t appear because the default level is WARNING . The printed message includes the indication of the level and the description of the event provided in the logging call, i.e. ‘Watch out!’. Don’t worry about the ‘root’ part for now: it will be explained later. The actual output can be formatted quite flexibly if you need that; formatting options will also be explained later.

输出结果为:

如果你想每次都在一个新的日志文件中写日志,那么使用filemode='w'参数:

分别在main 函数里,在mylib.py里写日志

运行后的输出:

以上代码会显示:

该 format参数的值

以上代码会显示:

还是该format:

以上代码会输出

如果想自己设定时间的格式:

会这样显示:

logging库中用了模块化的思路,把日志的整体功能用了4个基本的模块来完成:

Loggers,Handlers,Filters,Formatters

其中,Handlers,主要配置将信息写到命令行,还是写到文件里。

Filters,是对信息本身的过滤,决定那些信息不写,那些信息写。

Formatters决定信息输出的格式。比如是否输出时间,是否输出logger本身的名字等,决定那些信息在前,那些信息在后等。

Logger就是Handler,Filter,Formatter配置的一个日志对象了。

下面我们逐个说一下这4个类:

它有三个功能,1 提供分级日志的输出,比如 WARNING,ERROR,INFO等不同等级。2. 它可以决定哪些信息输出,哪些信息不输出。3 它可以将一条信息发给命令行和文件,可以把一条信息发给多个handler去处理。

logger 最常用的成员方法大概分两类:配置和信息发送

以下是常用的配置函数:

Logger.setLevel() 设定信息记录的等级。如果一条信息的等级比我们设定的低,那么就不对此条信息进行处理。信息一共分为:DEBUG,INFO,WARNING,ERROR,CRITICAL 五个级别,其中DEBUG是最低的等级,CRITICAL是最高的等级。

Logger.addHandler() 和 Logger.removeHandler(),添加或者删除信息处理器Handler。这个信息处理器就是定义了将日志写入命令行,还是写入文件,或者写入邮件等。

Logger.addFilter() 和 Logger.removeFilter() .添加或者删除信息过滤器Filter。这个信息过滤器,决定了哪些信息不显示。

可以看到,信息过滤器,信息处理器,信息等级共同配置了logger.

并不是每个logger你都需要去配置一遍,你可以利用logger的继承机制,只配置父logger.

一旦配置好logger之后,就可以用以下函数来在你自己代码的任意位置来记录日志了。

Logger.debug(),Logger.info(),Logger.warning(),Logger.error()和Logger.critical.这些函数的功能都是建立了日志记录信息,不同的是,函数名字就代表了其建立的日志信息的等级。

Logger.exeception()建立一个与Logger.error()比较相似的信息。但是Logger.exception()是放入一个追踪盏里面的。所以,只有在exception handler处理器中,才能使用它。

Logger.log()发送一个LOG 等级的信息,使用LOG等级的信息稍微繁琐些,因为使用LOG等级可以自定义等级。

getLogger() 返回一个logger的引用,如果指定了名字,那么返回特定名字对应的logger,如果没有指定名字,那就返回一个名字为root的loger的引用名字root,或者你指定的名字是一种级连结构。用同样的名字去调用getLogger(),会得到同样的值。logger的名字也决定了logger在树结构中的层级。例如:这里有一个logger的名字为foo,那么foo.bar,foo.bar.baz,还有foo.bam都是foo的子孙,logger还有一个有效等级level的概念。这个有效等级其实就是决定debug,info,warning等不同类型的消息是否进行记录。因为logger本身有了父子那样的继承关系,所以有效等级level也是可以继承的。如果子logger没有设定了自身的level,那么就把父logger的level继承过来使用。如果子logger本身设定了level,就用自身这个level.如果父logger仍然没有设定level,那就看父logger的父logger,一直这么追述下去,就会追述到root上,所以,我们必须给root设定一个level,或者默认一个level,方便root的子logger去继承。我们给root设定的默认levle为WARNING.如果有些日志的level,相比我们设定的WARNING低,那么它就不会被传递给Handler去处理,就不会被打印出来,或者记录进日志文件。另外logger的属性也是可继承的,所以就只配置一下root logger即可,没有root logger时,只用配置一个相对的那个根logger就行了

handler 信息处理器是负责信息分发给不同的目的地的,这个目的地可能是命令行,也可能是文件,或者邮件。分发时,同样要检查信息本身的等级severity.一个logger可以用addHandler()函数添加0个或者多个handlers。比如有这样一个场景,希望发送所有的log等级的信息到一个log文件内。所有的等级为错误的信息到stdout 标准输出上,发送所有的critical信息到邮件上。这样的场景需要3个不同的处理器,每个处理器负责发送相应等级的信息到相应的目的地。

标准库里包含一些处理器类型,本教程主要使用StreamHandler 和 FileHandler两种信息处理器。

处理器中的成员函数非常少,我们用来配置处理器的成员函数大概有这个几个:

setLevel(),用来设置处理器处理的信息等级。注意到logger中有setLevel(),而处理器中也有setLevel(),也就是说,logger把信息通过信息等级过滤一遍后,logger内的处理器需要根据处理器自身的功能设定,再根据信息等级来过滤一遍。

setFormatter() 为处理器设定一种信心记录的格式Formatter

addFilter() removeFilter()函数添加信息过滤器或者删除信息过滤器的函数。

到这里,我们发现,logger类中,将信息发送到不同的目的地就依赖Handlers实现的,

所有Handler就需要用Formatter和Filter来配置一下。接下来,我们看看Formatter和Filter.

它决定了信息显示的顺序,结构和内容。可以直接操作formatter的相关类,也可以自己继承 formatter类,去完成自己的设定。formatter的构造函数需要3个可选的参数:字符串格式的信息,日期,一个符号。

logging.Formatter.__init__(fmt=None,datafmt=None,style='%')

如果这里没有设定参数,就使用默认参数。对于fmt来说,就显示原来信息,对于datafmt来说,就以年-月-日 时:分:秒的合适显示。

下面的fmt就定义了一个按照 时间-信息等级-信息本身 来记录日志的方法:

这里有三种方法:

写代码配置logging的例子:

运行结果为:

写配置文件配置logging的例子:

代码中所需要的配置文件ogging.conf的具体内容为 :

以上代码的输出为:

显然,配置文件修改起来相对容易很多。

还有更方便的配置方式,使用字典来配置:

运行结果与上面一样。

到这里,基本完成了logging库的比较常用的使用方式。

比如在什么情况下,需要使用一个什么都不做的处理器NullHandler(),

还有关于信息等级的更详细的解释:

以及如何自定义信息等级。

还有关于异常的处理

还有关于信息的,信息都是字符串的。不过你也可以直接把某个类作为信息抛出来,因为类会自动调用其__str__()函数,返回一个类的字符串回来。

还有就是优化性能的一些小技巧

这里就编写expensive_func1 和 expensive_func2 来完成设定数据格式。

以下表格也显示了如何收集运行log的代码文件信息,线程信息,进程信息,处理器信息

以及如何操作才能收集代码文件信息,线程信息,进程信息,以及处理器信息。

我们一般会使用收集代码文件,线程,进程等信息,因为这样大大方便了多线程多进程工程的调试。

⑶ Python日志—Python日志模块logging介绍

从事与软件相关工作的人,应该都听过“日志”一词。

日志就是跟踪软件运行时事件的方法,为了能够在程序运行过程中记录错误。

通过日志记录程序的运行,方便我们查询信息,以便追踪问题、进行维护和调试、还是数据分析。

并且各编程语言都形成了各自的日志体系和相应的框架。

日志的作用总结:

首先我们要树立一个观点,那就是“不是为了记录日志而记录日志,日志也不是随意记的”。要实现能够只通过日志文件还原整个程序执行的过程,达到能透明地看到程序里执行情况,每个线程每个过程到底执行结果的目的。日志就像飞机的黑匣子一样,应当能够复原异常的整个现场乃至细节。

在项目中,日志这个功能非常重要,我们要重视起来。

在Python中,使用logging模块来进行日志的处理。

logging是Python的内置模块,主要用于将日志信息进行格式化内容输出,可将格式化内容输出到文件,也可输出到屏幕。

我们在开发过程中,常用print()函数来进行调试,但是在实际应用的部署时,我们要将日志信息输出到文件中,方便后续查找以及备份。

在我们使用日志管理时,我们也可以将日志格式化成Json对象转存到ELK中方便图形化查看及管理。

logging模块将日志系统从高向低依次定义了四个类,分别是logger(日志器)、handler(处理器)、filter(过滤器)和formatter(格式器)。其中由日志器生成的实例将接管原本日志记录函数logging.log的功能。

说明:

我们先来思考下下面的两个问题:

在软件开发阶段或部署开发环境时,为了尽可能详细的查看应用程序的运行状态来保证上线后的稳定性,我们可能需要把该应用程序所有的运行日志全部记录下来进行分析,这是非常耗费机器性能的。

当应用程序正式发布或在生产环境部署应用程序时,我们通常只需要记录应用程序的异常信息、错误信息等,这样既可以减小服务器的I/O压力,也可以避免我们在排查故障时被淹没在日志的海洋里。

那么怎样才能在不改动应用程序代码的情况下,根据事件的重要性或者称之为等级,实现在不同的环境中,记录不同详细程度的日志呢?

这就是日志等级的作用了,我们通过配置文件指定我们需要的日志等级就可以了。

说明:

总结:

开发应用程序时或部署开发环境时,可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息,可以方便进行开发或部署调试。 应用上线或部署生产环境时,应用使用WARNING或ERROR或CRITICAL级别的日志,来降低机器的I/O压力和提高获取错误日志信息的效率。 日志级别的指定通常都是在应用程序的配置文件中进行指定的。 不同的应用程序所定义的日志等级会有所差别,根据实际需求来决定。

⑷ python程序中logging怎么用

简单将日志打印到屏幕:

[python] view plain
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

输出:

WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message

可见,默认情况下Python的
logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级
CRITICAL > ERROR > WARNING > INFO > DEBUG >
NOTSET),默认的日志格式为日志级别:Logger名称:用户输出消息。

灵活配置日志级别,日志格式,输出位置

[python] view plain
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='/tmp/test.log',
filemode='w')

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
查看输出:
cat /tmp/test.log
Mon, 05 May 2014 16:29:53 test_logging.py[line:9] DEBUG debug message
Mon, 05 May 2014 16:29:53 test_logging.py[line:10] INFO info message
Mon, 05 May 2014 16:29:53 test_logging.py[line:11] WARNING warning message
Mon, 05 May 2014 16:29:53 test_logging.py[line:12] ERROR error message
Mon, 05 May 2014 16:29:53 test_logging.py[line:13] CRITICAL critical message

可见在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(mole)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

⑸ python 多线程中 日志按天分割

python 的 logging 模块, 在多线程应用中, logging.hanlders.TimedRotatingFileHandler 不能正常按日期分割。

解决办法为:重写FileHandler类,用于多线程中日志按天分割。

之后,Logger定义日志的各种参数(格式等):

实例化日志:

⑹ Python 中 logging 模块使用详情

在实际应用中,日志文件十分重要,通过日志文件,我们知道程序运行的细节;同时,当程序出问题时,我们也可以通过日志快速定位问题所在。在我们写程序时,也可以借助 logging 模块的输出信息来调试代码。

但是很多人还是在程序中使用print()函数来输出一些信息,比如:

这样用的话缺点很明显,当程序写好运行时,我们要把这些print()函数删掉,在简单的的程序中用还行,当程序比较复杂时,这个办法很低效。

如果使用 logging 模块,看看效果

运行结果如下:

你也许会问,这和 print() 函数有什么区别呢?区别就在于,logging模块可以通过改变level来控制一些语句是否被输出,比如当我们把level改成DEBUG级别:

得到输出如下:

logging 模块是python自带的一个包,因此在使用的时候,不必安装,只需要import即可。有5个level,分别是debug,主要是查看一下程序运行的信息,一般是调试程序要看的信息;info,是我们看程序是否如预料执行的信息;warn,意料之外的,但是不影响程序运行; error 和 critical 就是一些比较严重的问题,会影响程序运行。默认leval是warn,这个时候debug级别和info级别就不会被输出到日志里了。如果想要看到这些信息,就需要进行一些设置。

我们主要调用 basicConfig(***kwargs*) 这个函数对 logging 进行设置。

常用的参数如下:

我们通过调整format,可以输出我们想要的格式,比如:

结果是:

这就是在 format 参数中设置了时间的,所以得到了时间,我们可以输出多种想要的信息

总结:

本文主要介绍了 logging 模块的基础用法,除非是自己写的小脚本中我们使用print()函数,其他情况下最好还是用logging模块来打印信息,输出日志吧。

⑺ python 多线程logger问题

因为logging是threadsafe的,但不是process-safe(应该没有这个词儿,只是为了便于理解)的。这段代码就是多个进程共同操作一个日志文件。这种情况下,logging的行为就很难说了。


我测试了一下,日志中大概几百行。而且,可以看到一些顺序错乱现象:

Fri, 08 Aug 2014 01:19:38 logging_in_multithread.py[line:40] theadWorking ERROR 2
FFri, 08 Aug 2014 01:19:36 logging_in_multithread.py[line:40] theadWorking ERROR 11(注意这里的FFri)


把代码这样改:

fornuminrange(processNum):
p=Process(target=processWorking,args=('2',))
processs.append(p)
p.start()
p.join()

还有其他方法,比如:为logging实现一个FileHandler,以使logging在multiple process的环境下也能正常工作。这是我从网上了解到的做法,自己还没实践过。


Python Manual中logging Cookbook中有这么一段话:

Logging to a single file from multiple processes

Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported, because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, one way of doing this is to have all the processes log to a SocketHandler, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing processes to perform this function.)

这段话中也提出了另外一种解决方案。

⑻ python的问题

IDE选用这里推荐两款常用的 IDE,可以按照自己的条件和场景来选择。PyCharmPyCharm 是由 JetBrain 的人员制作的 IDE,该团队负责最着名的 java IDE,IntelliJ IDEA之一。PyCharm 的界面和功能对于那些有使用过其他 JetBrain 产品的人来说,是完美的。 此外,如果您喜欢 IPython 或 Anaconda 发行版,那么 PyCharm 可以将其工具和库(如NumPyMatplotlib)集成在一起,从而让您可以使用数组查看器和交互式图表。Thonny现在的开发工具太多了,而且每个开发工具都致力于做成最好用最智能的工具,所以功能越堆越多,越怼越智能。安装这些开发工具比较烧脑,经常需要经过许多配置步骤。作为一个 Python 开发者来说,好多人光是这些配置都要弄半天。配置好之后,打开软件,发现满屏都是菜单、按钮,无从下手,学习这些功能使用又是一大难题。这是一款对初学者特别友好的开发 IDE,它是由爱沙尼亚的 Tartu 大学开发,十分易于上手,还支持插件。如果你有编程基础,会其他编程语言,那么建议你用Pycharm。如果你是编程小白,或者零基础上手,那么建议你用Thonny。入门首先要学习Python基础知识,直接上课程:Python 环境搭建Python 基础语法Python 变量与数据类型Python 流程控制Python函数Python 模块和包Python 数据结构--序列Python ListPython tupplePython 类与对象Python 字典Python 集合Python 函数的参数Python 高阶函数Python 输入输出Python 错误和异常Python 之引用Python 之迭代器Python 之装饰器Python NameSpace & ScopePython Standard Library 01Python Standard Library 02Python datetime 和 timePython 垃圾回收机制Python 到底是值传递还是引用传递Python 之对象的比较与拷贝进阶通过上面基础知识的学习,相信你已经知道Python是个什么玩意了,对它也有一个初步的了解,对它的入门知识点也有些印象了。这时候你需要进阶学习,在入门的基础上更进一步。下面就从 Python 模块、Python爬虫基础、Python Web开发、Python 数据库操作、Python 数据分析及数据科学、Python IO及异步、Python网络编程、Python图像处理、Python 办公、Python 机器学习、Python 可视化 这些Python的基础大类来进行深入学习。Python 模块Python os 模块详解Python shutil 模块Python sys 模块详解Python queue 模块详解Python collections 模块Python random 模块Python logging 模块详解Python 枚举Python json&picklepathlib 模块Python calendar 模块Python math 模块Python decimal 模块Python itertools 模块Python statistics 模块Python operator 模块Python paramiko 模块Python filecmp&difflib模块初识 Python 多线程Python 多线程之 threading 模块Python Queue 进阶用法Python multiprocessing 模块Python 线程池Python 多线程 EventPython爬虫基础爬虫介绍Python 爬虫之 urllib 包基本使用Python 用户登录 Flask-LoginPython Requests 库的基本使用Python Requests 库高级用法正则表达式XPath 和 lxml爬虫利器 Beautiful Soup 之遍历文档PyQuery 详解爬虫利器 Beautiful Soup 之搜索文档Selenium 环境配置Selenium详解Python Scrapy 爬虫框架及搭建Python Scrapy 项目实战PySpider框架的使用Scrapy 模拟登陆Python 解析 XML爬取微信公众号文章内容Python 爬取豆瓣电影 top 250Python newspaper 框架Python Web开发Web 开发 Flask 介绍Web开发 Jinja2模板引擎Flask 框架集成BootstrapWeb表单Flask数据持久化Web 开发 RESTfulPython Web开发 Django 简介Python Django 模型概述与应用HTTP 入门Python Web 开发之 JWT 简介Python Web开发 OAuth2.0 简介OAuth2.0 客户端实战Flask 单元测试Web 开发 Django 管理工具Web 开发 Django 模板Flask 项目结构Python 数据库操作Python 操作 Redis 数据库介绍Python 操作 SQLitePython 操作 MongoDB 数据库介绍Python 操作 MySQLPython SQLAlchemyPython 数据分析及数据科学数据分析之 Numpy 初步NumPy Ndarray 对象及数据类型NumPy 字符串操作NumPy 数学函数NumPy 统计函数NumPy 排序和筛选函数NumPy 位运算与算术函数数据分析之 pandas 初步NumPy 矩阵Numpy 中数组和矩阵的区别Python IO及异步文件读写StringIO & BytesIOPython asyncioPython异步之aiohttpPython网络编程TCP 编程UDP 编程Python图像处理图像库 PIL(一)图像库 PIL(二)图像库 PIL 实例—验证码去噪Python 办公Python 操作 ExcelPython 操作 WordPython 解析 PDFPython 操作 CSVPython 机器学习机器学习概览第 112 天:机器学习算法之蒙特卡洛Python XGBoost 算法项目实战三木板模型算法项目实战第116天:机器学习算法之朴素贝叶斯理论机器学习算法之 K 近邻第120天:机器学习算法之 K 均值聚类机器学习之决策树Python 可视化Python matplotlib introctionPython Matplotlib 进阶操作Seaborn-可视化统计关系Seaborn-可视化分类数据Seaborn-可视化数据集的分布实战Python的知识点学完了之后,并不代表学完了。这只能代表你会Python了,并不能表示你可以去找工作、你可以去接单了。因为你还缺乏实战练习,这个阶段需要你能从一个实际需求中进行建模,然后用Python去实现模型,得到预期的结果。这里列一些贴近工作生活实际的小项目,每个项目都能让你学习到如何进行需求建模,如何用代码去实现,去解决实际的问题。解析网络网盘链接:几行代码,网盘链接提头来见!揭露出轨女友:女友加班发自拍,男友用几行代码发现惊天秘密...爬取小程序:不能爬小程序,叫什么会爬虫解密当代女性胸围:我半夜爬了严选的女性文胸数据,发现了惊天秘密制作签名软件:牛逼!用Python为她设计专属签名软件!识别车牌:如何用 Python 识别车牌?追女神:用Python助女神发朋友圈下载知乎美女图片:Python 抓取知乎几千张小姐姐图片是什么体验?炒股赚钱:一份代码帮我赚了10万写小游戏:不到 150 行代码写一个 Python 版的贪吃蛇抠图无烦恼:Python装逼指南——五行代码实现批量抠图跟踪房价数据:看我如何抓取最新房价数据跟女友恶作剧:女友电脑私存撕葱帅照,我用python偷梁换柱...自动抢红包:强大!用 60 行代码自动抢微信红包下载B站视频:使用 Python 下载 B 站视频更多精彩可以关注我的专栏:我是@无欢不散,看到这里的朋友请帮忙点个赞,也可以关注 @无欢不散 不迷路。

⑼ python中更优雅的记录日志

在以往我们使用日志,更多的是使用 python 自带的 logging 模块,它可以设置错误等级、输出方式等。

但使用方式相对比较复杂,想要更好的使用需要如 log4net 一样单独配置,这在 python 中感觉不是很优雅。

下面介绍一个 python 库: loguru 。 guru 是印度语中大师的意思, loguru 直译就是“日志大师”。

如图 logging 一样, loguru 也有定义日志等级。不同的日志等级,输出效果也不一样(默认的等级由低到高是 DEBUG 、 INFO 、 WARNING 、 ERROR 、 CRITICAL ,也可以自己使用 level 函数定义)。

类似 logging 中的 logger.addHandler ,loguru统一使用 add 函数来管理格式、文件输出、过滤等操作,它提供了许多参数来实现 logger.addHandler 中的配置更加简单方便。

其中 sink 是最重要的参数,可以传入不同的数据类型。传入文件路径、文件句柄、 sys.stderr 、甚至 logging 模块的 Handler 如 FileHandler 、 StreamHandler 等,这样就可以快速实现自定义的 Handler 配置。

通过给 remove 方法传递 add 方法返回的对象, 可以删除 add 方法添加的 sink ,这里的 remove 并不是删除 test2.log 文件,而是停止向该文件输出日志,需要需要继续记录日志则需要重新 add 日志文件。

用 rotation 、 retention 、 compression 进行日志窗口、更新、压缩管理。

支持控制台输出添加颜色, 除了基础色, loguru 甚至允许16进制、RGB格式的颜色值和加粗、下划线等样式。

使用装饰器 @logger.catch 可以和 logging 一样使用 logger.exception 函数来记录异常信息。

使用 exception 方法输出的异常信息包含堆栈信息和当前变量的值,方便问题定位。

使用 serialize 可以将日志转换为 JSON 格式, enqueue 可以保证多线程、多进程安全。

修改时间格式。

⑽ 多进程环境python logging打印日志混乱问题

解决办法如下:

多么痛的领悟,困扰了这么久的问题其实就是一个参数配置错了。
fileMode:表示日志文件的打开方式。w-直接写,使用这个配置当系统重启的时候日志会清空,一个进程打开后其他进程是无法使用的;a-尾部追加,大家都可以打开往文件结尾进行追加写入。

本人主语言是java,转到python后日志这块踩了几个坑。再说说另外一个坑,就是异常堆栈的打印问题,在java中logger是可以使用error直接打印出来的。在python中error跟其他日志记录方法没太大差别,是无法打印异常堆栈的,打印堆栈请使用 logger.exception("异常说明", e) 。

热点内容
qj压缩机 发布:2024-05-08 08:10:13 浏览:840
dhcp服务器可以分配什么参数 发布:2024-05-08 08:07:36 浏览:958
跨象限编程 发布:2024-05-08 07:58:37 浏览:61
java多对一 发布:2024-05-08 07:58:33 浏览:641
苹果怎么创建文件夹 发布:2024-05-08 07:53:34 浏览:916
html连接sql数据库 发布:2024-05-08 07:53:28 浏览:736
网易云盘无法上传 发布:2024-05-08 07:48:42 浏览:597
python浮点数取整 发布:2024-05-08 07:15:07 浏览:137
二手汽车解压程序 发布:2024-05-08 07:14:13 浏览:514
android和php最佳实践 发布:2024-05-08 07:10:07 浏览:852