首页 > Python中logging.config配置文件解读

Python中logging.config配置文件解读

Python中logging.config配置文件解读





下面的函数用于配置logging模块,它们位于logging.config模块中。你可以使用这些函数来配置,也可以在logging或是logging.handlers中声明它们来配置。

logging.config.dictConfig(config)

   从dictionary中获取logging配置

logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True)

   从指定的fname的配置文件中读取logging配置文件,文件格式参见

   https://docs.python.org/2/library/logging.config.html#logging-config-fileformat

   该函数可以在应用程序中多次调用

logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT)

在指定端口启动socket server并侦听新配置

logging.config.stopListening()

    关闭先前正在侦听的server



Configuration file format

被fileConfiguration()所理解的配置文件格式基于configparser功能。配置文件必须包含[loggers], [handlers]和[formatters],它们分别代表日志文件中定义的每种类型的实体。对这3种实体,后面有一个单独的section来定义该实体如何配置。

因此,[loggers]节中名为log01的logger,相关的配置文件细节在[logger_log01]节中定义。类似地,[handlers]节中名为

hand01的handler将在[handler_hand01]节中声明,[formatters]节中的form01将在[formatter_form01]声明。root logger配置必须在[logger_root]节声明。

注意:fileConfig() API比dictConfig()旧,并不包含logging某些方面的功能。建议以后尽量使用dictConfig API。

配置文件的例子如下:

[loggers]

keys=root,log02,log03,log04,log05,log06,log07





[handlers]

keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09





[formatters]

keys=form01,form02,form03,form04,form05,form06,form07,form08,form09





root logger必须指定一个级别和handlers列表。示例如下:

[logger_root]

level=NOTSET

handlers=hand01

其中level可以是DEBUG, INFO, WARNING, ERROR, CRITICAL or NOTSET之一,仅对root logger来说,NOTSET意味着所有的log message

都会记录。对非root的logger,强制要求一些额外信息,比如

[logger_parser]

level=DEBUG

handlers=hand01

propagate=1

qualname=compiler.parser

当一个非root的logger中level被配置为NOSET,它将通过上一级的logger来确定当前logger的有效级别。propagete为1表示message必须传播到上一级logger中,为0表示不传。qualname表示该logger的层级channel名称,这就是说,应用程序使用该名称可以得到该logger对象。

handler类型很多,主要有StreamHandler,FileHandler,NullHandler,SysLogHandler,HTTPHandler等,详见

https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers





handler节对应的配置示例如下:

[handler_hand01]

class=StreamHandler

level=NOTSET

formatter=form01

args=(sys.stdout,)





class表示该handler在logging包命名空间中的类名,level表示logger的级别,NONSET表示要记录所有日志。

formatter表示该handler的formatter的键名,假如空白的话,就使用默认值logging._defaultFormatter。假如formatter指定了该名字,必须在对应的section声明。args字段是handler类的构造函数的变量列表,参考相关handler构造函数,或者下面的例子,去观察通常的元素是如何构造的。比如:

[handler_hand02]

class=FileHandler

level=DEBUG

formatter=form02

args=('python.log', 'w')





下面是formatter的配置

[formatter_form01]

format=F1 %(asctime)s %(levelname)s %(message)s

datefmt=

class=logging.Formatter

format字段是全局格式字符串,datefmt是strftime()兼容的date/time格式字符串,为空时使用默认的ISO8601格式,比如2003-01-23 00:29:50,411,class字段表示formatter的类名,





日志级别如下:

Level Numeric value

CRITICAL 50

ERROR 40

WARNING 30

INFO 20

DEBUG 10

NOTSET 0





logging.handlers解读



logging模块中定义了这3个handler:StreamHandler, FileHandler and NullHandler

其它的handler都在logging.handler中定义,一并说明如下:

StreamHandler

该类位于logging包,将logging output输出到流中,比如sys.stdout,sys.stderr或任何支持write()和flush()方法的类文件对象

class logging.StreamHandler(stream=None)

假如指定了stream名称,日志将输出到流实例中,否则,日志输出到sys.stderr



FileHandler

该类位于logging包,将logging output输出到磁盘文件中,文件默认无限增长

class logging.FileHandler(filename, mode='a', encoding=None, delay=False)

打开指定的文件并记录日志,假如mode没有设置,默认使用'a'表示追加日志到文件中。





NullHandler

该对象什么也不处理





WatchedFileHandler

一个FileHandler实例,监视日志文件的变化,假如文件变化了,它会关闭并重新打开,不建议在Windows下使用

文件的变化可以发生,当应用程序使用newsyslog和logrotate来实现日志文件的回滚时。这个handle是在Unix/Linux下面,监视文件是否改变。(一个文件认为改变了,假如它的device厚实inode已经改变),将旧的文件关闭,这个流打开。

class logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]])

指定的文件被打开,用来记录日志,假如mode未指示,默认使用a





RotatingFileHandler

支持磁盘文件的回滚

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)

你可以使用 maxBytes和backupCount值去让日志文件在预设大小时回滚。只要日志文件在长度上接近maxBytes时,就会关闭旧日志文件,打开一个新的日志文件,实现回滚。假如maxBytes或backupCount为0,回滚不会发生。假如backupCount非零,系统会备份旧文件,文件名后加‘.1’, ‘.2’ 。比如,日志文件名为app.log,backupCount为5,将会得到app.log, app.log.1, app.log.2, 直到app.log.5这6个文件。写入日志的文件总是app.log,当这个文件填满时,就关闭它并重命名为app.log.1, 假如还存在app.log.1, app.log.2等文件,就逐一改名为app.log.2, app.log.3等等。





TimedRotatingFileHandler

支持在指定时间段内回滚日志

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

回滚基于when和interval设置,when指定interval的类型,参见下表,大小写不敏感,默认按小时回滚

Value Type of interval

'S' Seconds

'M' Minutes

'H' Hours

'D' Days

'W0'-'W6' Weekday (0=Monday)

'midnight' Roll over at midnight

回滚扩展名使用strftime format %Y-%m-%d_%H-%M-%S或其头部子字符串,当使用基于weekday的回滚时,W0表示周一,……,W6表示周日,interval的值不会用到

backupCount表示备份数,当日志很多时,新日志会覆盖旧日志,删除逻辑使用interval值去决定删除哪些日志文件

utc为true,表示使用UTC时间,否则使用本地时间





SocketHandler

通过网络套接字输出日志,SocketHandler类的基类使用TCP socket

class logging.handlers.SocketHandler(host, port)

向指定地址和端口的远程主机发送日志





DatagramHandler

继承自基类SocketHandler类,使用UDP socket发送日志message

class logging.handlers.DatagramHandler(host, port)





SysLogHandler

发送日志到远程或是本地unix syslog

class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)





NTEventLogHandler

发送日志消息到本地Windows NT, Windows 2000 or Windows XP event log

class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')





SMTPHandler

通过SMTP将日志消息发送到email address





MemoryHandler

支持将日志message缓存到内存中,周期性刷新日志到target handler

class logging.handlers.BufferingHandler(capacity)

class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None)





HTTPHandler

使用GET或是POST,将日志message发送到web server

class logging.handlers.HTTPHandler(host, url, method='GET')





参考文献

[1].https://docs.python.org/2/library/logging.config.html#module-logging.config

[2].https://docs.python.org/2/library/logging.html#module-logging

更多相关:

  • ELK:(ELK 由 ElasticSearch 、 Logstash 和 Kiabana 三个开源工具组成),Elasticsearch用于存储日志信息,Logstash用于收集日志,Kibana用于图形化展示。上一节我们介绍了如何使用docker-compose搭建ELK日志分析系统。传送门:传说中的ELK日志分析系统,手把手教你...

  • 欢迎关注头条号:老顾聊技术精品原创技术分享,知识的组装工目录前言常用日志组件什么是日志门面和日志实现常见的日志框架日志使用@slf4j注解日志的配置logback-spring配置总结前言日志是我们系统必备的功能之一,可以帮助我们开发人员定位系统的异常、错误以及运行流程的重要的工具。今天老顾就来介绍一下Spring boot的默认的l...

  • glog简介 glog是著名的google开源C++日志库glog(https://github.com/google/glog)的golang版本,glog是一个轻量级的日志库,上手简单不需要配置文件并且稳定高效,可以自定义控制的内容比较少。  glog主要有以下几个特点:  1. glog有四种日志等级INFO < WARING...

  • 应用场景 该配置文件用于ATS用作反向代理模式,访问日志被server域名分隔。比如,我想将sohu和ifeng的域名的日志分别记在两个不同的日志文件中,其它的日志统一记在默认的日志文件中。 配置 为了将不同源站的HTTP transaction记录在不同的日志文件中,你必须在log_hosts.config中列举出每...

  • 缘起 近来因为公司项目需要,阅读了一部分ATS logging system的源码实现,越发觉得logs_xml.config文件的配置非常重要,而我目前只是实践了一点它的皮毛。为此,根据自己的理解,翻译了官网的这篇文档,以作备忘。 logs_xml.config文件定义了自定义日志文件格式,过滤器和处理选项。文件格式采用x...

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • nan 是not a number ,inf是无穷大 numpy.nan_to_num(x): 使用0代替数组x中的nan元素,使用有限的数字代替inf元素...

  • 简介 Simple Reference  基础CUDA示例,适用于初学者, 反映了运用CUDA和CUDA runtime APIs的一些基本概念.Utilities Reference  演示如何查询设备能力和衡量GPU/CPU 带宽的实例程序。Graphics Reference  图形化示例展现的是 CUDA, OpenGL,...

  • 在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。...

  • 我在调研ATS 4.2.3挂载SSD的过程中,遇到很多坑,特此详细记录我摸索的主要过程,以便大家以后避免之。 基本思路可以完全照搬参考文献[2][3] 下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区。 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL...

  • 该博文整理一些在使用stl编程过程中遇到的小经验: 1.在多线程环境下面打印调试,如何使用cout及时刷新到屏幕上? 在C中我们经常这样使用: printf("Hello World "); fflush(stdout); 如果使用stl,我们可以这样使用: cout << "Hello World" << endl <...