Python-logging日志简单实例

  • 概要
  • 基本组件
  • logger
  • handle
  • 实例展示
  • 日志初始化


概要

logging是Python中用于记录日志的基本工具。通过log的分析,可以方便用户了解系统或软件、应用的运行情况。本篇文章简单记录了基本控制台打印和写入日志文件的操作。

基本组件

logger

logger是进行log日志最主要的组件,提供应用程序代码直接使用的接口,一般来说,所有的输出以及写入都使用logger。

简单实例化

test_logger = logging.getLogger('test')

test_logger是实例化后的logger名,可直接调用,logging.getLogger的参数test是此次实例化的标识名,每次实例化需要不同的参数名,才可保证不同的logger之间的正常使用。

设置log等级

设置等级之后,在打印日志的时候只对高于设置等级的日志进行输出打印。

test_logger.setLevel(logging.DEBUG)

日志等级

描述

DEBUG

最详细的日志信息,典型应用场景是 问题诊断

INFO

信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作

WARNING

当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的

ERROR

由于一个更严重的问题导致某些功能不能正常运行时记录的信息

CRITICAL

当发生严重错误,导致应用程序不能继续运行时记录的信息

加载handle

test_logger.addHandler(test_handler)

handle是处理组件下面会有介绍,加载handle的目的主要是配置logger,对打印的数据进行规范。

打印

test_logger.debug("这是一条Debug日志") # 注意此等级因为低于info等级所以即使写了也不打印输出
test_logger.info("这是一条Info日志")

handle

handle一般是logging的一个处理数据格式和一些管理设定的组件,用于将日志记录发送到指定的目的位置(一般指文件。

基本操作

实例化用logging.FileHandler创建,带入文档名,编码设定等参数。

test_handler= logging.FileHandler('位置及文件名', encoding='utf-8')
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.addHandler(logging.FileHandler(os.path.join('logs', log_name)))

设置日志等级,这里设置的等级是优先于logger设定的日志等级。

StreamHandler能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象)。FileHandler并且可以设置文件流输入到.log文件内

test_handler.setLevel(logging.INFO)

设置日志格式

test_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

实例展示

日志初始化

#logger初始化
logger1 = logging.getLogger('1')
logger2 = logging.getLogger('2')

#设置logger初始等级
logger1 .setLevel(logging.DEBUG) #高于debug等级的日志才打印
logger2 .setLevel(logging.Info) #高于info等级的日志才打印

# handle初始化及配置
handler1 = logging.FileHandler('log1.log', encoding='utf-8') #相对路径
handler1 .setLevel(logging.INFO)  #设置handle日志等级
handler1 .setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) #设置handle的基本日志格式
handler2 = handler1 .FileHandler('D:/pycharm/log/log2.log', encoding='utf-8') #绝对路径 
handler2.setLevel(logging.WARNING)
handler2.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

# 加载handle
logger1 .addHandler(handler1 )
logger2 .addHandler(handler2)

# 日志写入文件
logger1.info("我是logger1写入.log文件的一条Info日志")
logger2.warning("我是logger2写入.log文件的一条Warning日志")

# 若只需打印到控制台可以直接调用logging
logging.debug("我是被打印到控制台的一条debug日志")