3

Python的Logging使用

 2 years ago
source link: https://dawnki.github.io/2018/06/10/logging%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Logging日志模块

Python 2.7
Logging 0.5.1.2

Logging日志模块主要有这四部分组成

部分 描述

logger 提供日志接口,在python代码中嵌入,进行配置或发送日志信息

handler 将日志记录按照代码进行存储,如存入文件或者socket中

filter 过滤日志记录后交给handler

formatter 指定日志记录的输出格式

日志输出屏幕

import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=logging.DEBUG)
logging.debug('debug msg')
logging.info('info msg')

直接嵌入在目标代码中,将日志消息发送至屏幕,无需配置handler

日志输出文件

python代码实现

import logging
import logging.handlers
LOG_FILE = 'xxxx.log'
handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024) # 实例化handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S') # 实例化formatter
handler.setFormatter(formatter) # 为handler添加formatter
logger = logging.getLogger('example') # 名为example的logger,如果无参则获取root的logger
logger.addHandler(handler) # 为logger添加handler
logger.setLevel(logging.DEBUG) # 设置日志等级
# 使用StreamHandler输出到屏幕
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(formatter)
logger.addHandler(sh)
logger.info('test') # 会同时输出到文件和屏幕

配置文件实现

### logger部分
# 如果name为loggers里面keys的值,则调用对应的配置,如果name没有则调用默认(root)的配置
# name 中用点 . 表示继承关系
# 可以有多个,以逗号隔开
[loggers]
keys=root,xxxlogger
# 实现logger对应的配置信息
# 必须是 logger_name name为loggers中key的值
# level 日志级别,级别有 DEBUG,INFO,WARNING,ERROR,CRITICAL
# handlers 日志处理器,可以有多个 以逗号隔开
# qualname logger的名称,通过logging.getLogger(name)获取,这里的name便是qualname
# 如果获取的logger 名称不存在,则调用默认(root)logger
# propagate 是否继承符类的配置信息,0:否 1:是
[logger_root]
level=debug
handlers=consoleHandler
qualname=root
[logger_xxxlogger]
level=INFO
handlers=consoleHandler,fHandler
qualname=xxxlogger
propagete=0
### handler部分
# 定义handler
[handlers]
keys=consoleHandler,fHandler
# handlers的具体配置实现
# 必须是 handler_name name为handlers中key的值
# class为logging包里面的handler处理器,如果调用其他包的记得补全名字
# formatter 日志输入格式
# args handler相关参数
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,) # 此处务必有','不然会炸
[handler_fHandler]
class=FileHandler
level=INFO
formatter=simpleFormatter
args=('xxxxError.txt','a')
### formatter部分
# 定义日志输出格式
[formatters]
keys=simpleFormatter
[formatter_simpleFormatter]
format=%(levelname)s - %(name)s - %(asctime)s - %(module)s.%(funcName)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

日志的配置通常使用配置文件实现。

import logging
import logging.config
logging.config.fileConfig('./logging.conf')
logger = logging.getLogger('xxxlogger')
logger.info('hello')

通过fileConfig读取文件配置即可,当然也可以使用 logging.config.dictConfig() ,可以以字典形式读取,十分适合json格式配置的文件.

CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
如果设定了日志级别时,输出消息会输出大于等于该级别的日志,小于的级别会省略

常用的Handlers

名称 参数列表 描述

logging.StreamHandler StreamHandler([strm]) strm参数是一个文件对象。使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象输出信息。

logging.FileHandler FileHandler(filename[,mode]) 和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。filename是文件名,必须指定一个文件名。mode是文件的打开方式。默认是’a’,即追加。

logging.handlers.RotatingFileHandler RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]) 这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大。backupCount用于指定保留的备份文件的个数,如果超出个数会删除旧文件。

logging.handlers.TimedRotatingFileHandler TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) 这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。

logging.handlers.SocketHandler

TCP协议发送日志

logging.handlers.DatagramHandler

UDP协议发送日志

logging.handlers.HTTPHandler

HTTP协议发送日志

logging.handlers.SMTPHandler

将日志通过SMTP协议发送邮件

常用的Forrmatters

参数 含义

%(name)s Logger的名字

%(levelno)s 数字形式的日志级别

%(levelname)s 文本形式的日志级别

%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有

%(filename)s 调用日志输出函数的模块的文件名

%(module)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 用户输出的消息


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK