• python标准库-日志logging


    1、模块级别

    默认情况下logging模块将日志打印到了标准输出,且只显示了级别大于等于warning的日志信息,所以它的默认级别是warning.

    日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # __author__ ='kong'
    import logging
    import time
    # 日志的输出级别 print logging.NOTSET print logging.DEBUG
    print logging.INFO print logging.WARNING print logging.ERROR print logging.CRITICAL time.sleep(1) logging.debug("debug message") # 默认的日志输出级别 logging.warn("warn message") logging.error("error message") logging.critical("critical message")

      输出

     2、logging.basicConfi([**kwargs])

      语法:

    def basicConfig(**kwargs):
        """
        Do basic configuration for the logging system.
    
        This function does nothing if the root logger already has handlers
        configured. It is a convenience method intended for use by simple scripts
        to do one-shot configuration of the logging package.
    
        The default behaviour is to create a StreamHandler which writes to
        sys.stderr, set a formatter using the BASIC_FORMAT format string, and
        add the handler to the root logger.
    
        A number of optional keyword arguments may be specified, which can alter
        the default behaviour.
    
        filename  Specifies that a FileHandler be created, using the specified
                  filename, rather than a StreamHandler.
        filemode  Specifies the mode to open the file, if filename is specified
                  (if filemode is unspecified, it defaults to 'a').
        format    Use the specified format string for the handler.
        datefmt   Use the specified date/time format.
        level     Set the root logger level to the specified level.
        stream    Use the specified stream to initialize the StreamHandler. Note
                  that this argument is incompatible with 'filename' - if both
                  are present, 'stream' is ignored.
    
        Note that you could specify a stream created using open(filename, mode)
        rather than passing the filename and mode in. However, it should be
        remembered that StreamHandler does not close its stream (since it may be
        using sys.stdout or sys.stderr), whereas FileHandler closes its stream
        when the handler is closed.
        """

      logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为.

    可用的参数:
    filename: 用指定的文件名创建FileHandler,这样日志会被存储在指定的文件中
    filemode:文件打开的方式,在指定了filename时使用,默认值为a
    format:指定handler使用的日志显示格式
    datefmt:指定日期时间格式
    level:设置rootlogger的日志级别
    stream:用指定的stream创建StreamHandler,可指定输出到sys.stderr,sys.stdout或者文件,默认sys.stderr

    format参数可能用到的格式化串:
    %(name)s:Logger的名字
    %(levelno)s:数字形式的日志级别
    %(levelname)s:文本形式的日志级别
    %(pathname)s:调用日志输出函数的模块的文件名
    %(module)s:调用日志输出函数的模块名
    %(funcName)s:调用日志输出函数的函数名
    %(lineno)d:调用日志输出函数的语句所在的代码行
    %(created)f:当前时间,用UNIX标准的表示 时间的浮点数表示
    %(relativeCreated)d:输出日志信息时,自Logger创建以来的毫秒数
    %(asctime)s:字符串形式的当前时间。默认格式2003-07-12 16:23:26,345
    %(thread)d:线程ID
    %(threadName)s:线程名
    %(process)d:进程ID
    %(message)s:用户输出的消息

    datefmt格式:
    %Y:年份的长格式,1999
    %y:年份的短格式,99
    %m:月份 01-12
    %d:日期,01-31
    %H:小时,0-23
    %M:分钟,00-59
    %S:秒,00-59


      基本用法示例代码:
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # __author__ ='kong'
    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.error("error message")
            logging.critical("critical message")
    
    if __name__ == '__main__':
        T = TestLogging()
    
    结果:
    2017-01-15 12:26:42,424 INFO     root       info message
    2017-01-15 12:26:42,424 ERROR    root       error message
    2017-01-15 12:26:42,424 CRITICAL root       critical message

      

      自定义模块myLog

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # __author__ ='kong'
    import logging
    import getpass
    import sys

    class MyLog(object):
    def __init__(self):
    # 为当前用户创建日志实例,设置默认日志级别
    user = getpass.getuser()
    self.logger = logging.getLogger(user)
    self.logger.setLevel(logging.DEBUG)
    Formatter = logging.Formatter('%(asctime) -12s %(levelname) -8s %(name) -10s %(message) -12s')
    """
    Initialize the formatter with specified format strings.

    Initialize the formatter either with the specified format string, or a
    default as described above. Allow for specialized date formatting with
    the optional datefmt argument (if omitted, you get the ISO8601 format).
    """
    # 创建文件句柄,设置日志格式、日志级别
    logFile = './' + sys.argv[0][0:3] + '.log'
    logHand = logging.FileHandler(logFile)
    logHand.setLevel(logging.ERROR) # 错误级别以上信息才会写到文件中
    logHand.setFormatter(Formatter)
    """
    Set the formatter for this handler.
    """
    # 创建stream句柄,设置日志格式
    logHandSt = logging.StreamHandler()
    logHandSt.setFormatter(Formatter)
    # 应用文件句柄和stream句柄,来处理日志
    self.logger.addHandler(logHand)
    self.logger.addHandler(logHandSt)
    logging.basicConfig()
    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__':
    T = MyLog()
    T.debug("debug message")
    T.info("info message")
    T.warn("warn message")
    T.error("error message")
    T.critical("crital message")

      

     详见:

    http://blog.csdn.net/zyz511919766/article/details/25136485/

    http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html

     示例参考:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    import logging.config
    import datetime
    import os
    
    # 基路径
    BaseDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    # 时间模块
    ToDay = datetime.date.today()
    YsDay = ToDay - datetime.timedelta(days=1)
    ToDay = ToDay.strftime('%Y-%m-%d')
    YsDay = YsDay.strftime('%Y-%m-%d')
    
    # 创建日志目录
    logdir = os.path.join(BaseDir,'log',ToDay)
    if not os.path.exists(logdir):os.makedirs(logdir)
    
    # 定义三种日志输出格式
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]'
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    
    def log_handle(logname='default'):
        LOG_PATH = os.path.join(logdir, logname + '.log')  # 日志文件名称
        LOGGING_DIC = {
            'version': 1,
            'disable_existing_loggers': False,
            'formatters': {
                'standard': {
                    'format': standard_format
                },
                'simple': {
                    'format': simple_format
                },
                'id_simple': {
                    'format': id_simple_format
                },
            },
            'filters': {},
            'handlers': {
                # 打印到终端的日志
                'console': {
                    'level': 'DEBUG',
                    'class': 'logging.StreamHandler',  # 打印到屏幕
                    'formatter': 'simple'
                },
                # 打印到文件的日志,收集info及以上的日志
                'collect': {
                    'level': 'DEBUG',
                    'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                    'formatter': 'simple',
                    'filename': LOG_PATH,  # 日志文件
                    'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
                    'backupCount': 5,
                    'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
                },
            },
            'loggers': {
                '': {
                    'handlers': ['console', 'collect'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                    'level': 'DEBUG',
                    'propagate': False,  # 向上(更高level的logger)传递
                },
            },
        }
        logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的 log 配置
        logger = logging.getLogger()  # 生成一个log实例
        return logger



  • 相关阅读:
    pdf-2-eps
    使用terminator
    自动删除源文件中的指定行--sed
    apt-get update只是更新源列表?
    LoadRunner学习
    计算一个人从出生到目前一共生活了多少天
    数组的求交集和并集
    获取北京和张北的天气
    重新梳理java入门
    java 基础
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/6286742.html
Copyright © 2020-2023  润新知