Python: Logging模块实例详解

Logging 模块

import logging

Quick Start

导入模块后直接logging.waring()logging.error()简单粗暴地调用即可。默认的levelDEBUG,所以warning会打印出信息,info级别更低,不会输出信息。如果你不知道level等参数的意义请后面解释,淡定,继续往下看。

如果不特别配置,logging模块将日志打印到屏幕上(stdout)。

#!/usr/local/bin/python
# -*- coding:utf-8 -*-
import logging
logging.warning('Watch out!')  # print message to console
logging.info('I told you so')  # will not print anything

Log写入文件

更常见的情形是把信息记录在log文件里。需要用logging.basicConfig()设置文件名以及level等参数,常见的level见下表。

Level

Value

Usage

CRITICAL

50

严重错误,表明程序已不能继续运行了

ERROR

40

严重的问题,程序已不能执行一些功能了

WARNING

30

有意外,将来可能发生问题,但依然可用

INFO

20

证明事情按预期工作

DEBUG

10

详细信息,调试问题时会感兴趣。

如果设置levelINFO,那么DEBUG级别的信息就不会输出。常见的函数接口有debug(), info(), warning(), error() and critical(),分别对应log不同严重级别的信息。

注意把下面代码写入脚本(直接在terminal里不会生成文件),比如test_log.py

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG,filemode='w')
# filemode = 'w' 每次运行,重写log
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
cat example.log
DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

改变Log输出格式

通过format参数,可以定制写入log文件的格式。

import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')

DEBUG:This message should appear on the console INFO:So should this WARNING:And this, too

记录时间

通过datafmt参数,可以格式化输出log的时间。

import logging
logging.basicConfig(format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

07/16/2016 12:10:35 AM is when this event was logged.

更丰富的Log控制

上面的代码大部分是利用默认配置,其实我们自定义更多。比如把输出到terminallog.txt文件里。

首先理解几个概念是有用的。

  • Logger 记录器,暴露了应用程序代码能直接使用的接口。
  • Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
  • Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter 格式化器,指明了最终输出中日志记录的布局。

首先,创建一个logger,记录器,然后给其添加不同的handler,输出到不同的渠道,比如下面这个例子就会生成log.txt文件,并同时输出在terminal里。

import logging
# create logger with name
# if not specified, it will be root
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# create a handler, write to log.txt
# logging.FileHandler(self, filename, mode='a', encoding=None, delay=0)
# A handler class which writes formatted logging records to disk files.
fh = logging.FileHandler('log.txt')
fh.setLevel(logging.DEBUG)

# create another handler, for stdout in terminal
# A handler class which writes logging records to a stream
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)

# set formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)

# add handler to logger
logger.addHandler(fh)
logger.addHandler(sh)

# log it
logger.debug('Debug')
logger.info('Info')
2016-07-18 21:43:14,648 - my_logger - DEBUG - Debug
2016-07-18 21:43:14,650 - my_logger - INFO - Info

Ref:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师历程

sql必会基础3

对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查...

732
来自专栏安恒网络空间安全讲武堂

2017 LCTF WriteUp 4篇

周末刚刚结束的LCTF,我们队一共做出了4道web,一道misc还有一道问卷调查(好气啊没抢到一血换pwnhub邀请码),感谢吃饭去大佬带飞~ 前言 对本渣渣...

4568
来自专栏抠抠空间

MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁

浏览目录: 1.视图 2.触发器 3.存储过程 4.函数 5.事物 6.数据库锁 7.数据库备份 1.视图 视图:是一个虚拟表,其内容由查询定义。同真实的表...

3297
来自专栏令仔很忙

VB红皮书敲实例过程中遇到的问题

红皮书中的五个例子已经打完了,并且能够成功的运行,在敲实例的过程中遇到了一些问题,但都解决掉了。

461
来自专栏KaliArch

Python实现翻译小工具

利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面。

16710
来自专栏实战docker

pinpoint插件开发之二:从零开始新建一个插件

在上一章《pinpoint插件开发之一:牛刀小试,调整gson插件》我们初步体验了pinpoint插件的构建和使用,本章我们从零开始创建一个全新插件,体验完整的...

5586
来自专栏MySQL内核

MySQL InnoDB引擎表空间(tablespace)

现在的MySQL版本已经可以实现自动扩展表空间,其中innodb_file_per_table默认是开启的,表示为每一张新建的表创建表空间,这样可以避免ibda...

2134
来自专栏塔奇克马敲代码

Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法

1155
来自专栏猛牛哥的博客

OD常用断点

1252
来自专栏Python攻城狮

MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)

PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式。

843

扫码关注云+社区