python logging introduction

1 minute read

python 日志使用的简单说明

一个简单例子

import logging

# 创建一个日志句柄
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# 创建一个文件日志的句柄
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)

# 创建一个控制台输出的日志句柄
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)

# 创建一个格式化器并赋值给句柄
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)

# 将句柄赋值给日志对象
logger.addHandler(ch)
logger.addHandler(fh)

# 使用日志对象
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

使用basicConfig

上面的例子中关于日志对象的配置可以使用basicConfig方法来简化,下面是第二个例子

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='spam.log',
                    filemode='w')

ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)

logger = logging.getLogger('simple_example2')

logger.addHandler(ch)

logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

上面的例子中没有创建文件日志句柄,但是缺省情况下日志中高于等于DEBUG级别的消息都会被存入到文件spam.log中. 实际上是有一个缺省句柄的配置.

而新创建的流日志句柄则是ERROR级别的,并且没有任何的formatter. 程序执行的结果就是在控制台的标准输出上为

error message
critical message

在生成的日志文件spam.log中为

10-11 15:03 simple_example2 DEBUG    debug message
10-11 15:03 simple_example2 INFO     info message
10-11 15:03 simple_example2 WARNING  warn message
10-11 15:03 simple_example2 ERROR    error message
10-11 15:03 simple_example2 CRITICAL critical message

使用配置文件

配置文件的格式有三种, ini文件, dict式样的json文件, yaml格式的文件. 逻辑思路都是一样的只是文件的格式不同.

YAML格式的配置文件样本, logging_conf_example.yaml

version: 1

disable_existing_loggers: False

formatters:
  simple:   
    format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
  console:
    format: "%(name)-12s: %(levelname)-8s %(message)s"

handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: console
    stream: ext://sys.stdout
  debugfile:
    class: logging.handlers.RotatingFileHandler
    level: INFO
    formatter: simple
    filename: spam.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
    
loggers:
  root:
    level: DEBUG
    handlers: [debugfile,console]
    propagate: no

使用配置文件,需要使用yaml先载入配置文件为字典

import logging
import logging.config
import yaml

logging.config.dictConfig(yaml.load(open('logging_conf_example.yaml', 'r')))

logger = logging.getLogger('example')

logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

在子模块中使用logger

import logging

logger = logging.getLogger('example')

def foo():
    logger.info('Hi, foo')

class Bar(object):
    def bar(self):
        logger.info('Hi, bar')

下面是使用子模块的代码

import logging
import logging.config
import yaml
import module_example

logging.config.dictConfig(yaml.load(open('logging_conf_example.yaml', 'r')))

module_example.foo()
bar = module_example.Bar()
bar.bar()

说明 在import module_example时我们在子模块中创建了logger,但是名为example的logger还没有定义.直到使用dictConfig后.

Leave a Comment

Your email address will not be published. Required fields are marked *

Loading...