Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

    • 第二章:字符串和文本

    • 第三章:数字日期和时间

    • 第四章:迭代器与生成器

    • 第五章:文件与IO

    • 第六章:数据编码和处理

    • 第七章:函数

    • 第八章:类与对象

    • 第九章:元编程

    • 第十章:模块与包

    • 第十一章:网络与Web编程

    • 第十二章:并发编程

    • 第十三章:脚本编程与系统管理

      • 通过重定向-管道-文件接受输入
      • 终止程序并给出错误信息
      • 解析命令行选项
      • 运行时弹出密码输入提示
      • 获取终端的大小
      • 执行外部命令并获取它的输出
      • 复制或者移动文件和目录
      • 创建和解压归档文件
      • 通过文件名查找文件
      • 读取配置文件
      • 给简单脚本增加日志功能
        • 问题
        • 解决方案
        • 讨论
      • 给函数库增加日志功能
      • 实现一个计时器
      • 限制内存和CPU的使用量
      • 启动一个WEB浏览器
    • 第十四章:测试、调试和异常

    • 第十五章:C语言扩展

  • Python基础

  • Python
  • 《Python Cookbook》第三版
  • 第十三章:脚本编程与系统管理
weibw
2022-01-18

给简单脚本增加日志功能

# 问题

你希望在脚本和程序中将诊断信息写入日志文件。

# 解决方案

打印日志最简单方式是使用 logging 模块。例如:

import logging

def main():
    # Configure the logging system
    logging.basicConfig(
        filename='app.log',
        level=logging.ERROR
    )

    # Variables (to make the calls that follow work)
    hostname = 'www.python.org'
    item = 'spam'
    filename = 'data.csv'
    mode = 'r'

    # Example logging calls (insert into your program)
    logging.critical('Host %s unknown', hostname)
    logging.error("Couldn't find %r", item)
    logging.warning('Feature is deprecated')
    logging.info('Opening file %r, mode=%r', filename, mode)
    logging.debug('Got here')

if __name__ == '__main__':
    main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

上面五个日志调用(critical(), error(), warning(), info(), debug())以降序方式表示不同的严重级别。 basicConfig() 的 level 参数是一个过滤器。 所有级别低于此级别的日志消息都会被忽略掉。 每个logging操作的参数是一个消息字符串,后面再跟一个或多个参数。 构造最终的日志消息的时候我们使用了%操作符来格式化消息字符串。

运行这个程序后,在文件 app.log 中的内容应该是下面这样:

CRITICAL:root:Host www.python.org unknown
ERROR:root:Could not find 'spam'
1
2

如果你想改变输出等级,你可以修改 basicConfig() 调用中的参数。例如:

logging.basicConfig(
     filename='app.log',
     level=logging.WARNING,
     format='%(levelname)s:%(asctime)s:%(message)s')
1
2
3
4

最后输出变成如下:

CRITICAL:2012-11-20 12:27:13,595:Host www.python.org unknown
ERROR:2012-11-20 12:27:13,595:Could not find 'spam'
WARNING:2012-11-20 12:27:13,595:Feature is deprecated
1
2
3

上面的日志配置都是硬编码到程序中的。如果你想使用配置文件, 可以像下面这样修改 basicConfig() 调用:

import logging
import logging.config

def main():
    # Configure the logging system
    logging.config.fileConfig('logconfig.ini')
    ...
1
2
3
4
5
6
7

创建一个下面这样的文件,名字叫 logconfig.ini :

[loggers]
keys=root

[handlers]
keys=defaultHandler

[formatters]
keys=defaultFormatter

[logger_root]
level=INFO
handlers=defaultHandler
qualname=root

[handler_defaultHandler]
class=FileHandler
formatter=defaultFormatter
args=('app.log', 'a')

[formatter_defaultFormatter]
format=%(levelname)s:%(name)s:%(message)s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

如果你想修改配置,可以直接编辑文件logconfig.ini即可。

# 讨论

尽管对于 logging 模块而已有很多更高级的配置选项, 不过这里的方案对于简单的程序和脚本已经足够了。 只想在调用日志操作前先执行下basicConfig()函数方法,你的程序就能产生日志输出了。

如果你想要你的日志消息写到标准错误中,而不是日志文件中,调用 basicConfig() 时不传文件名参数即可。例如:

logging.basicConfig(level=logging.INFO)
1

basicConfig() 在程序中只能被执行一次。如果你稍后想改变日志配置, 就需要先获取 root logger ,然后直接修改它。例如:

logging.getLogger().level = logging.DEBUG
1

需要强调的是本节只是演示了 logging 模块的一些基本用法。 它可以做更多更高级的定制。 关于日志定制化一个很好的资源是 Logging Cookbook (opens new window)

编辑 (opens new window)
上次更新: 2023/10/13, 17:39:25
读取配置文件
给函数库增加日志功能

← 读取配置文件 给函数库增加日志功能→

最近更新
01
牛客网非技术快速入门SQL练习题
03-08
02
其他日常SQL题
03-07
03
用户与权限管理
03-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式