下面我会为你详细讲解“Python日志模块logging的使用方法总结”的完整攻略。
1. logging模块的概述和常用组件
logging模块是Python的标准库之一,用于记录日志信息。它提供了非常丰富的设置选项,可以控制日志输出的格式、级别、处理方式等,可以让我们方便地记录和分析程序的运行状态。
- 日志级别
logging模块定义了7种日志级别,从高到低分别是:
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0
通过设置日志级别,我们可以控制日志输出的详细程度,只输出到指定级别或以上的日志。
- 日志记录器
为了方便对不同的模块或方法进行分类,logging模块提供了Logger类来实现不同的日志记录器。
- 日志处理器
除了将日志输出到控制台和文件之外,logging模块还提供了多种处理器,可以将日志输出到网络、邮件等位置。
2. logging模块的基本用法
使用logging模块记录日志主要分以下3个步骤:
- 创建Logger对象
通过Logger类创建一个记录器,可以指定记录器的名称、日志级别等属性。
import logging
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
- 创建Handler对象
在记录器中添加日志处理器,可以将日志输出到不同的设备上,例如输出到文件或者控制台。
# 创建一个文件Handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.INFO)
# 创建一个控制台Handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 添加Handler到Logger
logger.addHandler(fh)
logger.addHandler(ch)
- 记录日志
通过Logger对象调用debug()、info()、warning()、error()、critical()等函数记录日志。该类方法定义了不同级别的日志记录方法,开发者根据实际情况选择对应方法来记录日志。
# 记录日志
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
3. 示例一:控制台输出和文件输出
下面的示例代码包括如下几个部分:
- 为logging模块设置基础配置,包括控制台输出、文件输出、日志级别等设置
- 定义多个不同的记录器,分别将日志输出到不同的文件和控制台
- 调用多个记录器来记录不同级别的日志信息
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-15s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='myapp.log',
filemode='a')
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(name)-15s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
logger1 = logging.getLogger('example1')
logger1.setLevel(logging.WARNING)
logger2 = logging.getLogger('example2')
logger2.setLevel(logging.DEBUG)
logger1.debug('this is a debug message for logger1')
logger1.info('this is a info message for logger1')
logger1.warning('this is a warning message for logger1')
logger2.error('this is an error message for logger2')
logger2.critical('this is a critical message for logger2')
4. 示例二:使用自定义日志类
通过继承logging.Logger类和logging.Handler类,我们可以自定义日志类,来实现更加细粒度的日志输出和处理。
下面的示例代码演示了如何创建一个自定义日志类,并重载emit()方法实现输出日志到文件时增加进程ID的功能:
import os
import logging
import logging.handlers
import threading
class MyLogger(logging.Logger):
def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
rv = logging.LogRecord(name, level, fn, lno, msg, args, exc_info, func, sinfo)
if extra is not None:
for key in extra:
if (key in ["processName", "threadName"]) and isinstance(extra[key], str):
setattr(rv, key, extra[key])
rv.processID = os.getpid()
return rv
class MyHandler(logging.handlers.RotatingFileHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def emit(self, record):
record.message = "[PID:{0}] {1}".format(record.processID, record.getMessage())
super().emit(record)
logger = MyLogger(name='test')
logger.setLevel(logging.INFO)
fh = MyHandler(filename='test.log', maxBytes=10*1024*1024, backupCount=5, encoding='utf-8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] [%(name)s] %(message)s'))
logger.addHandler(fh)
logger.debug('this is a debug message')
logger.info('this is a info message')
logger.warning('this is a warning message')
logger.error('this is an error message')
logger.critical('this is a critical message')
以上就是关于“Python日志模块logging的使用方法总结”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python日志模块logging的使用方法总结 - Python技术站