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



原文地址:https://www.cnblogs.com/kongzhagen/p/6286742.html