基础入门_Python-模块和包.运维开发中日志模块logging的最佳实践?

简单介绍:

说明: 此模块儿提供了文件,HTTP GET/POST,SMTP,SOCKET等方式实现日志记录,甚至可以自动实现具体的日志记录方式

快速安装:

pip install --upgrade logging

处理流程:

日志级别:

属性名称 属性说明
logging.NOTSET 默认为0
logging.DEBUG 调试为10
logging.INFO 一般为20
logging.WARN 警告为30
logging.ERROR 错误为40
logging.CRITICAL 严重为50
logging._levelNames 日志级别字典

快速配置:

logging.basicConfig(**kwargs) -> None

说明: 快速配置root logger对象,支持filename,filemode,format,datefmt,level,stream,由于是针对于root logger对象设置,所以获取日志对象时候必须logging.getLogger(‘‘)的name字段留空

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

说明: 快速配置日志对象,所有的对象配置都可以通过配置文件指定,而且还支持灵活选择处理方式[loggers]

; 定义多个日志对象
keys=root, error
[handlers]
; 定义多个处理对象
keys=root, error
[formatters]
; 定义多个格式对象
keys=root, error
[logger_root]
level=NOTSET
; 处理类,可以有多个,逗号隔开
handlers=root
; logger名称,如果不设置则默认root
qualname=root
; 不继承父类的log信息
propagate=0
[logger_error]
level=INFO
; 保证错误信息也在终端打印
handlers=error, root
qualname=error
propagate=0
[handler_root]
; 处理类,可以有多个,逗号隔开
class=StreamHandler
; 参数元素,可以有多个逗号隔开
args=(sys.stdout,)
; 日志级别,NOTSET接受任何级别日志
; 设置处理对象的格式
formatter=root
[handler_error]
class=logging.handlers.TimedRotatingFileHandler
args=(‘./logs/error.log‘, ‘d‘, 1, 7)
formatter=error
[formatter_root]
; 设置格式对象格式
format=%(asctime)s - %(levelname)s - %(message)s
; 设置日期格式
datefmt=
[formatter_error]
format=%(asctime)s - %(levelname)s - %(filename)s - %(lineno)s - %(message)s
datefmt=

说明: 默认解析按照ini格式解析,配置文件必须包含[logger],[handlers],[formatters]三个节点,分别表示日志对象,处理对象和格式对象

日志对象:

创建对象

说明: 日志对象可以添加多个处理对象

logging.getLogger(name=None) -> logger

说明: 快速创建一个日志对象,如果没有指定name则返回root logger对象,name支持.连接结合过滤对象使用

对象方法

l.addHandler(handler) -> None

说明: 为日志对象添加处理对象

l.debug(msg, *args, **kwargs, exc_info=true) -> None

说明: 使用调试模式写日志,*args,**kwargs会自动替换msg中替换字符串,exc_info为true时会记录异常信息

l.info(msg, *args, **kwargs, exc_info=true) -> None

说明: 使用默认模式写日志,*args,**kwargs会自动替换msg中替换字符串,exc_info为true时会记录异常信息

l.warning(msg, *args, **kwargs, exc_info=true) -> None

说明: 使用警告模式写日志,*args,**kwargs会自动替换msg中替换字符串,exc_info为true时会记录异常信息

l.error(msg, *args, **kwargs, exc_info=true) -> None

说明: 使用错误模式写日志,*args,**kwargs会自动替换msg中替换字符串,exc_info为true时会记录异常信息

l.critical(msg, *args, **kwargs, exc_info=true) -> None

说明: 使用严重模式写日志,*args,**kwargs会自动替换msg中替换字符串,exc_info为true时会记录异常信息

处理对象:

说明: logging模块默认只提供了基础的流处理类(StreamHandler)和文件处理类(FileHandler),如果要使用扩展处理类,需要import logging.handlers导入扩展处理类,才可以使用.

创建对象

说明: 日志对象可以添加多个处理对象,每个处理对象又可以添加多个过滤对象,这样日志就会经过过滤器

logging.StreamHandler(stream=None) -> StreamHandler

说明: 创建一个流处理对象,参数stream可以是任何文件对象,默认是sys.stderr

logging.FileHandler(filename, mode=‘a‘, encoding=None, delay=0) -> FileHandler

说明: 同上,比较之上会自动帮你打开文件,创建一个文件处理对象

logging.RotatingFileHandler(filename, mode=‘a‘, maxBytes=0, backupCount=0, encoding=None, delay=0) -> RotatingFileHandler

说明: 同上但可轮询,当超出指定大小日志文件被重命名(末尾附加数字),创建新文件继续输出,maxBytes为0时表示无限大,backupCount表示备份文件数量

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

说明: 同上但可轮询,当超出指定时间日志文件被重命名(末尾附加时间),创建新文件继续输出,when可为s秒/m分/h时/d天/w星期,interval表示频率

logging.handlers.SocketHandler(host, port) -> SocketHandler

说明: 创建一个TCP处理对象,将日志发送到对应主机的端口

logging.handlers.DatagramHandler(host, port) -> DatagramHandler

说明: 创建一个UDP处理对象,将日志发送到对应主机的端口

logging.handlers.SysLogHandler(address=(‘localhost‘, 514), facility=1, socktype=None) -> SysLogHandler

说明: 创建一个本地处理对象,将日志通过syslogd写入Linux系统日志

logging.handlers.NTEventLogHandler(appname, dllname=None, logtype=‘Application‘) -> NTEventLogHandler

说明: 创建一个本地处理对象,将日志通过evetlog写入Windows事件日志

logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None)

说明: 创建一个邮件处理对象,将日志通过邮件发送到对应的的邮箱

logging.handlers.MemoryHandler(capacity, flushLevel=40, target=None) -> MemoryHandler

说明: 创建一个内存处理对象,将日志零时存储到内存定期刷新到target

logging.handlers.HTTPHandler(host, url, method=‘POST‘) -> HTTPHandler

说明: 创建一个HTTP处理对象,将日志通过http接口发送到对应服务器存储

对象方法

h.setLevel(level) -> None

说明: 为日志处理对象设置日志级别,一旦设置,只有当超出此级别的日志才会被处理

h.setFormatter(fmt) -> None

说明: 为日志处理对象设置格式对象,具体格式可参考格式对象相关信息

格式对象:

logging.Formatter(fmt=None, datefmt=None) -> Formatter

说明: 创建一个格式对象,fmt为日志信息格式,datafmt为时间格式,默认为"%Y-%m-%d %H:%M:%S"

特殊字段

字段名称 字段说明
%(name)s logger的名称
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的完整路径名,可能为空
%(filename)s 调用日志输出函数的完整文件名,可能为空
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出所在的代码行
%(created)f 当前时间,默认时间戳格式
%(relativeCreated)d 自从logger创建以来的毫秒数
%(asctime)s 字符串形式的当前时间,默认"年-月-日 小时:分钟:秒,毫秒"
%(thread)d 线程ID,可能没有
%(threadName)s 线程名,可能没有
%(process)d 进程ID,可能没有
%(message)s 用户输出的消息

过滤对象:

说明: 每个处理对象可以添加多个过滤对象,只要有一个过滤对象拒绝,日志信息就不会被处理

logging.Filter(name="") -> Filter

说明: 创建一个过滤器,日志对象的名字格式一般为a.b.c,当name为a.b时表示只有前缀为a.b的日志才会被处理,否则日志会被丢弃.

应用场景:



1. RotatingFileHandler和TimedRotatingFileHandler都是线程安全的,可用于多线程场景

2. 多进程场景官方推荐使用TCP/UDP传输日志,单台压测支持6000~9000条/s记录,还可以考虑使用python-logstash或pyzmq提供的日志句柄


#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# 51CTOBG: http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
# 说明: 导入公共模块
import logging
import logging.config
# 说明: 导入其它模块
if __name__ == ‘__main__‘:
    logging.config.fileConfig(‘logging.conf‘)
    root_logger = logging.getLogger(‘root‘)
    error_logger = logging.getLogger(‘error‘)
    root_logger.info(‘info message.‘)
    error_logger.error(‘error message.‘)


本文出自 “ζ自动化运维开发之路ζ” 博客,请务必保留此出处http://xmdevops.blog.51cto.com/11144840/1856763

时间: 2024-08-02 11:02:31

基础入门_Python-模块和包.运维开发中日志模块logging的最佳实践?的相关文章

基础入门_Python-模块和包.运维开发中chartdet编码检测的最佳实践?

简单介绍: 说明: 此模块主要用来实现字符串/文件编码检测 快速安装: pip install --upgrade chardet 常用方法: chardet.detect(aBuf) -> dict 说明: 检测字符串编码,返回一个字典包含confidence编码匹配准确率,encoding最终检测的编码,当aBuf为空时可能encoding为None,所以最好判断一下 最佳实践: 1. FirmwareUpload会自动对接OA系统及对应SVN服务器,自动定期读取最新OA发布的固件程序及Re

基础入门_Python-模块和包.运维开发中watchdog事件监视的最佳实践?

简单介绍: 说明:  此模块是一个跨平台的PY库和SHELL工具,可以监视文件系统事件(增加/删除/修改) 快速安装: pip install --upgrade watchdog 日志记录: event_handler = LoggingEventHandler() -> event_handler 说明: 创建一个日志处理句柄,其实LoggingEventHandler是继承自FileSystemEventHandler类,只是重写了增删查改的回调函数,直接调用logging模块写到对应lo

基础入门_Python-模块和包.运维开发中inspect自省模块的最佳实践?

简单介绍: 说明: 此模块提供了一系列自省函数,可获取模块/类/方法/函数/traceback/帧对象/代码对象的信息 快速安装: 内置模块 测试相关: inspect.ismodule(object) -> True/False 说明: 判断object是否为模块 inspect.isclass(object) -> True/False 说明: 判断object是否为类 inspect.ismethod(object) -> True/False 说明: 判断object是否为方法

基础入门_Python-模块和包.运维开发中内建模块getopt的最佳实践?

简单介绍: 此模块提供命令行选项解析,目前支持短格式和长格式选项 快速安装: 说明:  内建模块无需安装 解析方法: getopt(args, shortopts, longopts = []) -> (opts, args) 说明: args为要解析的参数序列,常为sys.argv[1:],shortopts为单字符选项定义串,如果某个选项需要一个参数,响应字母后面必须有一个冒号,longopts为长格式的选项名序列,可以包含多个字符,序列元素必须包含--前缀,如果此长选项需要参数则其名应包含

基础入门_Python-模块和包.运维开发中__import__动态导入最佳实践?

常规导入: import module_name[,module1,...]  from module_name import [*|child[,child1,...] from module_name import [*|child[,child1,...] as alias_name 注意: 导入语句可出现在程序任意位置,自定义包要实现from module_name import *的效果则此模块必须在__init__.py实现__all__ = ['module_1', 'module

基础入门_Python-内建函数.运维开发中eval内建函数的最佳实践?

简单介绍: 说明: 在指定命名空间中计算参数字符串的有效表达式,并返回一个对象, Help on built-in function eval in module __builtin__: eval(...)     eval(source[, globals[, locals]]) -> value          Evaluate the source in the context of globals and locals.     The source may be a string 

关于金刚经在运维开发中的实践

参考 姚秦 鸠摩罗什 <金刚般若波罗蜜经> 梁 昭明太子 <金刚经>三十二品 唐 六祖惠能 六祖讲<金刚经> 关于金刚经 金刚经(<金刚般若波罗蜜经>,又译<佛说能断金刚般若波罗蜜多经>,简称<金刚经>)的核心思想,其实就是一句话:菩萨于法,应无所住,行于布施.简单概况下就是不着相(应无所住而生其心),行布施,能做到这点就算觉悟了 ,也算自觉了,成就阿罗汉果了.再后面就是觉他及觉行圆满了,据说只有佛祖释迦牟尼(姓乔达摩,名悉达多)一人

Python运维开发基础

Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建开发环境 4.习题 Python简介 尽管我是学计算机出身的,但是我对Python的认识是在毕业后.Python是我喜欢的语言,简洁,优美,容易使用.重要的一点是他是开源的项目. 官方网站 https://www.python.org 学习网站 http://www.okpython.com 对于简

Python运维开发基础01-语法基础【转】

开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶,Python网页编程,Python项目实战 Python开发基础分为语法基础篇,文件基础篇,函数基础篇,模块基础篇 语法基础篇中,我着重希望训练同学的是作为开发应该具备的一种逻辑思路. 文件基础篇中,我们需要练习的是如何将数据永久性的存储在硬盘上,提供读,写. 函数基础篇中,我重点是要引导同学们构