随笔

python学习网 2017-10-31 22:58:01

Subprocess模块

logging模块

PYTHON的logging模块提供了标准的日志接口,可以通过他存储各种格式的日志,logging的日志有五个级别,分别为debug(), info(), warning(), error() and critical()

1、输出到屏幕

import logging
logging.debug("this is debug message")
logging.info("this is info message")
logging.warning("this is warning message")
logging.error("this is error message")
logging.critical("this is crital message")

默认的日志级别是warning,只会打印warning以及更高级别的日志

2、输出到文件

import logging

logging.basicConfig(filename = "log_test.log",level = logging.INFO)
logging.debug("this is debug message")
logging.info("this is info message")
logging.warning("this is warning message")
logging.error("this is error message")
logging.critical("this is crital message")

其中level = logging.INFO是把日志级别设置为info级别,小于这个级别的日志不会打印

注意:设置日志级别的时候要用大写,否则报错

下面把日志加上时间

import logging
logging.basicConfig(filename = "log_test.log",
                    level = "WARNING",
                    format = "%(asctime)s %(message)s",
                    datefmt = "%m/%d/%Y %I:%M:%S %p")
logging.warning("This is a warning message")

3、同时把日志输出到屏幕和文件

Python使用logging模块记录日志涉及四个主要类

logger提供了应用程序可以直接使用的接口

handler将(logger创建的)日志记录发送到合适的目的输出;

filter提供了细度设备来决定输出哪条日志记录;

formatter决定日志记录的最终输出格式。

  • logger

每个程序在输出信息之前都要获得一个Logger。Logger通常 与程序的模块名对应,比如聊天工具的图形界面模块可以这样获得它的Logger:
LOG=logging.getLogger(”chat.gui”)
核心模块可以这样:
LOG=logging.getLogger(”chat.kernel”)

注:以上的“chat.gui”和“chat.kernel”是自己起的名字,和模块名对应

Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高

Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter(基本不用)

Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler

可以设置的日志别:logger.debug、Logger.info、Logger.warning、Logger.error、Logger.critical

  • Handler

handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。

Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略

Handler.setFormatter():给这个handler选择一个格式

Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象(基本不用)

每个Logger可以附加多个Handler。

1.logging.StreamHandler

用于向控制台输出日志信息(输出到屏幕)

使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
StreamHandler([strm])
其中strm参数是一个文件对象。默认是sys.stderr

2.logging.FileHandler

用于向一个文件输出日志信息,Filehandler会帮你打开这个文件。

它的构造函数是:FileHandler(filename[,mode])

filename是文件名,必须指定一个文件名。
mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。

例子:

import logging
#创建一个日志
#文件最大10字节,指定保留的备份文件数3个
LOG = logging.getLogger('log_test')
LOG.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
fh = logging.FileHandler('log_info.log')
fh.setLevel(logging.WARNING)
ch_formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s',datefmt = '%m/%d/%Y-%I:%M:%S-%p')
fh_formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s',datefmt = '%m/%d/%Y %I:%M:%S %p')
ch.setFormatter(ch_formatter)
fh.setFormatter(fh_formatter)
LOG.addHandler(ch)
LOG.addHandler(fh)

LOG.debug('This is a debug message')
LOG.info('This is a info message')
LOG.warning('This is a warning message')
LOG.error('This is a error message')
LOG.critical('This is a critical message')

3.logging.handlers.RotatingFileHandler

用于管理文件大小,当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名文件继续输出。

比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler会自动把文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息

它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])

其中filename和mode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。

例子:

import logging
from logging import handlers
logger = logging.getLogger('TEST')
log_file = "timelog.log"
#文件最大10字节,指定保留的备份文件数3个
fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3,encoding='utf-8')
formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.warning("test1")
logger.warning("test2")
logger.warning("test3")
logger.warning("test4")
logger.warning("test5")
logger.warning("test6")

4.logging.handlers.TimedRotatingFileHandler

和RotatingFileHandler类似,但它没有通过判断大小来决定何时重新创建文件,而是每隔一段时间就会自动创建新的日志文件。

它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。

interval是时间间隔。

when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:

  • S 秒
  • M 分
  • H 小时
  • D 天
  • W 每星期(interval==0时代表星期一)
  • midnight 每天凌晨

例子:

import time
import logging
from logging import handlers
logger = logging.getLogger('TEST')
log_file = "timelog.log"#根据秒来分割文件,每隔5s生成新的日志文件,指定保留的备份文件数3个
fh = handlers.TimedRotatingFileHandler(filename=log_file,when='S',interval=5,backupCount=3,encoding='utf-8')
formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.warning("test1")
time.sleep(3)
logger.warning("test2")
time.sleep(2)
logger.warning("test3")
time.sleep(5)
logger.warning("test4")
time.sleep(10)
logger.warning("test5")
logger.warning("test6")
阅读(811) 评论(0)