• 2017.07.24 Python网络爬虫之logging模块


    1.Logging模块,顾名思义就是针对日志的,到目前为止,所有的程序标准输出(输出到屏幕)都是使用print函数,Logging模块可以代替print函数的功能,并将标准输出输入到日志文件中保存起来,而且利用logging模块可以部分替代debug的功能,给程序排错

    2.logging模块有6个级别:(也可以自定义级别),这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来,发出的信息级别低于定义的级别则忽略,如果未定义级别,默认定义的级别是WARNING

    NOTSET值为0

    DEBUG值为10

    INFO值为20

    WARNING值为30

    ERROR值为40

    CRITICAL值为50

     3.使用logging最简单的方法就是logging.basicConfig:logging.basicConfig([**kwargs])

    这个函数可用的参数有:

    filename:用指定的文件名创建FileHandler,这样的日志会被存储在指定的文件中

    filemode:文件打开方式,在指定了filename是使用这个参数,默认值为‘a’还可指定为‘w’

    format:指定handler使用的日志显示格式,format参数可能用到的格式化串,如下:

    %(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:用户输出的信息

    datefmt:指定日期时间的格式,最常用的几个格式化如下:

    %Y:年份的长格式,如1999

    %y:年份的短格式,如99
    %m:月份,01-12

    %d:日期,01-31

    %H:小时,0-23

    %w:星期,0-6,星期天是0

    %M:分钟,00-59

    %S:秒,00-59

    level:设置rootlogger的日志级别

    stream:用指定的sream创建StreamHandler,可以指定输出到sys.stderr.,sys.stdout或者文件,默认为sys.stderr,若同时列出了filename和stream两个参数,stream会被忽略

    编写一个最基本的日志模块应用程序testLogging.py:

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-

    import logging

    class TestLogging(object):
    def __init__(self):
    logFormat='%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s'
    logFileName='./testLog.txt'

    logging.basicConfig(level=logging.INFO,format=logFormat,filename=logFileName,filemode='w')

    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')

    if __name__ == '__main__':
    tl=TestLogging()

    刚开始执行错误,竟然就是因为这话:
    logFormat='%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s'
    多了一个空格,我去..............

    执行结果:

    4.编写一个自定义模块myLog:

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-

    import logging
    import getpass
    import sys

    class MyLog(object):
    def __init__(self):
    """这个类用于创建一个自用的log"""
    user=getpass.getuser()
    self.logger=logging.getLogger(user)
    self.logger.setLevel(logging.DEBUG)
    logFile=sys.argv[0][0:-3]+'.log' #日志文件名
    formatter=logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s')

    """日志显示到屏幕上并输出到日志文件夹内"""
    logHand=logging.FileHandler(logFile)
    logHand.setFormatter(formatter)
    logHand.setLevel(logging.ERROR) #只有错误才会被记录到logfile中

    logHandSt=logging.StreamHandler()
    logHandSt.setFormatter(formatter)

    self.logger.addHandler(logHand)
    self.logger.addHandler(logHandSt)

    """日志的5个级别对应以下的5个函数"""
    def debug(self,msg):
    self.logger.debug(msg)

    def info(self,msg):
    self.logger.info(msg)

    def warn(self,msg):
    self.logger.warn(msg)

    def error(self,msg):
    self.logger.error(msg)

    def critical(self,msg):
    self.logger.critical(msg)


    if __name__ == '__main__':
    mylog=MyLog()
    mylog.debug("我是一个debug")
    mylog.info("我是一个info")
    mylog.warn("我是一个warn")
    mylog.error("我是一个error")
    mylog.critical("我是一个critical")

    执行结果如下:

    代码详解:

    (1)getpass.getuser():显示当前登录系统用户名;

    (2)sys.argv[0][0:-3]+'.log':文件名取程序名的[0:-3],也就是myLog

    (3)logging.FileHandler:logging模块自带的三个handler之一。继承自StreamHandler。将日志信息输出到磁盘文件上。

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

    (4)logging.StreamHandler():流handler——包含在logging模块中的三个handler之一。

    能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象)。

    只有一个参数:class logging.StreamHandler(stream=None)

    5.编写一个testMyLog.py,在程序中导入myLog.py作为模块使用:

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-


    from myLog import MyLog

    if __name__ == '__main__':
    ml=MyLog()
    ml.debug('我是一个 debug message')
    ml.info('我是一个 info message')
    ml.warn('我是一个 warn message')
    ml.error('我是一个 error message')
    ml.critical('我是一个 critical message')
    执行结果:

    学习logging模块参考博客:http://blog.csdn.net/fxjtoday/article/details/6307285

     

  • 相关阅读:
    python模拟shell
    10.LIKE 操作符
    9.TOP 子句--mysql limit
    8.INSERT INTO 语句 UPDATE 语句
    7.ORDER BY 子句
    6.AND & OR 运算符
    5.WHERE 子句
    4.SELECT DISTINCT 语句
    3.SELECT 语句
    2.sql分类
  • 原文地址:https://www.cnblogs.com/hqutcy/p/7231038.html
Copyright © 2020-2023  润新知