Python 日志输出

Python 日志输出Python 日志输出

大家好,又见面了,我是你们的朋友全栈君。

脚本案例:

import logging

logging =logging.getLogger()
logger.setLevel(logging.INFO)
consoleHandler =logging.StreamHandler()
logger.addHandler(consoleHandler)
logger.info("aa")
logger.error("error")

日志级别

日志级别有如下几种。当获取根Logger的时候,默认级别为NOTSET,这样会显示所有输出。当获取非根Logger的时候,根Logger的默认级别是WARNING,非根Logger会继承这个级别,只有WARNING以上的日志才会输出。

级别

数值

CRITICAL

50

ERROR

40

WARNING

30

INFO

20

DEBUG

10

NOTSET

0

日志对象

日志对象通过模块的getLogger(name)函数获得,可以向该函数传递一个名称。如果不传递名字的话,就会获取根Logger。

日志对象常用方法如下。

方法名

作用

setLevel(lvl)

设置日志级别

isEnabledFor(lvl)

检查某级别的日志是否启用

getEffectiveLevel()

获取实际的日志级别

debug/warning/info/error(msg, *args, **kwargs)

输出对应级别的日志

log(lvl, msg, *args, **kwargs)

输出指定级别的日志

addFilter(filt)/removeFilter(filt)

添加或删除指定的过滤器

addHandler(hdlr)/removeHandler(hdlr)

添加或删除指定的处理器

Handler对象

日志对象用于输出日志,而Handler对象用于指定日志向哪里输出(文件、终端等等)。Handler列表可以参考Handler类型

常用的Handler有以下几种:

  • StreamHandler, 用于向标准输入输出流等输出日志。
  • FileHandler,用于向文件输出日志。
  • NullHandler,什么也不输出。
  • RotatingFileHandler,向文件输出日志,如果文件到达指定大小,创建新文件并继续输出日志。

还有好多种Handler,可以向HTTP服务器发送日志、向系统日志管理器写入日志、向指定电子邮箱发送日志等Handler。这里就不介绍了。如果有相关需求请参考相应文档。

Formatter对象

Formatter对象用于格式化日志输出。格式化字符串使用传统的%形式来格式化日志,可以参考官方文档了解更多信息。

过滤器对象

过滤器对象用于过滤日志的输出。

LogRecord对象

LogRecord对象基本上和我们没多大关系,简单地说,我们输出的每一条日志,就是一个LogRecord对象。它有日志系统自动创建和使用。如果我们留心一下日志模块的方法,会发现有很多地方都要接受LogRecord参数。LogRecord有很多属性信息,对日志打印有帮助,可以参考16.6.6. LogRecord Objects下面的属性和格式化符的对照表。例如%(asctime)s会生成人类可读的时间戳,%(lineno)d返回当前行号等等。

模块级别函数

日志模块还包含了一些模块级别的函数。简单不完整列举如下:

函数名

作用

getLogger(name=None)

获取对应名称的Logger,如果不指定名称会返回根Logger

debug/info等函数

在根Logger上打印对应级别的日志信息

disable(lvl)

禁用某级别的日志打印

basicConfig(关键字参数)

这个函数可以快速设置日志的级别、格式、Handler、Formatter等

使用日志

前面都是纸面上的介绍,下面来真正使用日志模块来打印日志。下面的代码所用知识,前面都已介绍过。运行代码之后,可以验证日志同时在终端输出和文件中输出。

import logging

# 创建Logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# 创建Handler

# 终端Handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)

# 文件Handler
fileHandler = logging.FileHandler('log.log', mode='w', encoding='UTF-8')
fileHandler.setLevel(logging.NOTSET)

# Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)

# 添加到Logger中
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

# 打印日志
logger.debug('debug 信息')
logger.info('info 信息')
logger.warning('warn 信息')
logger.error('error 信息')
logger.critical('critical 信息')
logger.debug('%s 是自定义信息' % '这些东西')

运行结果。

2017-04-04 21:45:16,742 - root - DEBUG - debug 信息
2017-04-04 21:45:16,742 - root - INFO - info 信息
2017-04-04 21:45:16,742 - root - WARNING - warn 信息
2017-04-04 21:45:16,742 - root - ERROR - error 信息
2017-04-04 21:45:16,742 - root - CRITICAL - critical 信息
2017-04-04 21:45:16,742 - root - DEBUG - 这些东西 是自定义信息

外部配置

前面都是在代码中配置日志的输出,我们还可以将配置写到配置文件中,然后传递给日志模块。旧式程序会使用conf格式配置文件,不过这种配置文件比较传统,所以就不介绍了。

自Python 3.2起,引入了一种新的基于键值对的配置方式。这种新方式的优点是配置文件非常灵活,我们可以使用XML、YAML、JSON等格式存储配置,也可以从网络上接收序列化的Python对象当做配置对象。总之,想怎么来就怎么来。我们下面就介绍这种新方式。

具体的键值对需要参考官方文档。例如下面就是Python官方给出的一个YAML格式的配置文件。

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
loggers:
  main:
    level: DEBUG
    handlers: [console]
    propagate: no
root:
  level: DEBUG
  handlers: [console]

然后引入logging.config模块,并将配置文件传递给logging.config模块的dictConfig方法。这样就做好了日志打印的准备工作了。

import logging.config

logging.config.dictConfig('config.yaml')

logger = logging.getLogger('fuck')
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105973.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国内免费高匿IP代理软件

    国内免费高匿IP代理软件免费IP代理软件能快速获取代理ip资源,智能验证,一键设置取消代理。免费IP代理软件1.支持免费IP代理2.普通代理3.高匿代理4.Http代理5.Https代理6.自动验证无效代理7.一键设置取消代理8.导出到文本或Excel9.绿色免费软件。511遇见免费IP代理媒体预览https://www.bilibili.com/video/BV1ty4y1V72ehttps://v.youku.com/v_show/id_XNTE5MzgyMTU

    2022年6月16日
    128
  • 山西计算机中考操作题,2017山西中考物理实验操作试题发布

    山西计算机中考操作题,2017山西中考物理实验操作试题发布一、2017年山西省中考物理命题依据《义务教育物理课程标准(2011年版)》是2017年山西中考物理试题的唯一命题依据.二、2017年山西省中考物理命题原则1.总原则(1)内容:强化学科核心内容,弱化枝端末节内容.(2)结构:强化良好结构的知识,弱化零散的知识.(3)测查能力层次:强化概念、原理的理解与应用,及分析、综合等思维能力;弱化单纯的事实和内容记忆.(4)测查角度:强化学生理解了哪些,弱…

    2022年5月18日
    40
  • MyBatis-Plus用起来真的很舒服

    MyBatis-Plus用起来真的很舒服 阅读目录一、MyBatis-Plus1、简介2、使用SpringBoot快速使用MyBatis-Plus二、Mybatis-Plus常用操作1、配置日志2、简单认识一下常用注解3

    2022年7月1日
    28
  • 什么是SOA架构?为什么使用SOA架构?「建议收藏」

    什么是SOA架构?为什么使用SOA架构?「建议收藏」SOA架构简介面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互**SOA具有以下五个特征**1.可重用;2.松耦合;3.明确定义的接口;…

    2022年6月24日
    31
  • leetcode 三数之和_leetcode数组

    leetcode 三数之和_leetcode数组原题链接给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[] 提示:0 <= nums.length <= 300

    2022年8月9日
    2
  • 学习Oracle这一篇就够了

    学习Oracle这一篇就够了配套资料,免费下载链接:https://pan.baidu.com/s/1yjJY3IstA8aMQBPYhWNlCw提取码:qmpd复制这段内容后打开百度网盘手机App,操作更方便哦第一章数据库概述1.1、数据库的好处将数据持久化到本地提供结构化查询功能1.2、数据库的常见概念DB:数据库,存储数据的仓库DBMS:数据库管理系统,又称为数据库软件或者数据库产品,用于创建和管理数据库,常见的有MySQL、Oracle、SQLServerDBS:数据库系统,数据库系统是一个通称

    2022年10月8日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号