本文出处:https://www.cnblogs.com/goodhacker/p/3355660.html#undefined

  python的标准库里的日志系统从Python2.3开始支持。只要import logging这个模块即可使用。如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用:

 1 import logging
2
3 # 创建一个logger
4 logger = logging.getLogger('mylogger')
5 logger.setLevel(logging.DEBUG)
6
7 # 创建一个handler,用于写入日志文件
8 fh = logging.FileHandler('test.log')
9 fh.setLevel(logging.DEBUG)
10
11 # 再创建一个handler,用于输出到控制台
12 ch = logging.StreamHandler()
13 ch.setLevel(logging.DEBUG)
14
15 # 定义handler的输出格式
16 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
17 fh.setFormatter(formatter)
18 ch.setFormatter(formatter)
19
20 # 给logger添加handler
21 logger.addHandler(fh)
22 logger.addHandler(ch)
23
24 # 记录一条日志
25 logger.info('foorbar')

  结合上面的例子,我们说下几个最常使用的API:

  logging.getLogger([name])

  返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。

  Logger.setLevel(lvl)

  设置logger的level, level有以下几个级别:

    

  级别高低顺序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

  如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出  

1     logger.debug("foobar")    # 不输出
2 logger.info("foobar") # 输出
3 logger.warning("foobar") # 输出
4 logger.error("foobar") # 输出
5 logger.critical("foobar") # 输出

  Logger.addHandler(hdlr)

  通过handler对象可以把日志内容写到不同的地方。比如简单的StreamHandler就是把日志写到类似文件的地方。python提供了十几种实用handler,比较常用有:

1 StreamHandler: 输出到控制台
2 FileHandler: 输出到文件
3 BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。
4 SocketHandler 用TCP网络连接写LOG
5 DatagramHandler 用UDP网络连接写LOG
6 SMTPHandler 把LOG写成EMAIL邮寄出去

  logging.basicConfig([**kwargs])* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,设置默认的格式。* 这些函数: logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical() 如果调用的时候发现root logger没有任何handler,会自动调用basicConfig添加一个handler* 如果root logger已有handler,这个函数不做任何事情使用basicConfig来配置root logger的输出格式和level:

1 import logging
2 logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
3 logging.debug('This message should appear on the console')

  logger对象直接提供日志接口。formatter描述日志的格式。handler把日志写到不同的地方,你可以把日志保存成本地文件,也可以每个小时写一个日志文件,还可以把日志通过socket传到别的机器上。

  从最简单的formatter对象来看。formatter指定的是每一条日志记录的抬头信息,也就是你可以指定日志记录的时间格式、进程号、文件名、函数名等信息。可以用这个方法来创建一个formatter对象:

logging.Formatter.__init__( fmt=None, datefmt=None)

  fmt参数指定进程号、文件名、函数名等信息是否出现以及格式, datefmt为日期时间格式,默认的日期格式精确到微秒,例如‘2003-07-08 16:49:45,896’。fmt中可以指定多个字段,每个字段的格式为“%(<dictionary key>)s”, 例如你想打印时间、日志级别、日志信息可以用下面的format:

'%(asctime)s - %(levelname)s - %(message)s'

  所有的可以使用的字段如下表:

  在记录爬虫系统日志的时候需要定义记录日志的级别,级别越高表示打出来的日志越详细。我们可以用一个字典来设置不同级别对应的不同日志信息:

1 #用字典保存日志级别
2 format_dict = {
3 1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
4 2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
5 3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
6 4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
7 5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
8 }

  将本文开始的代码封装在一个类中

 1 #开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
2 class Logger():
3 def __init__(self, logname, loglevel, logger):
4 '''
5 指定保存日志的文件路径,日志级别,以及调用文件
6 将日志存入到指定的文件中
7 '''
8
9 # 创建一个logger
10 self.logger = logging.getLogger(logger)
11 self.logger.setLevel(logging.DEBUG)
12
13 # 创建一个handler,用于写入日志文件
14 fh = logging.FileHandler(logname)
15 fh.setLevel(logging.DEBUG)
16
17 # 再创建一个handler,用于输出到控制台
18 ch = logging.StreamHandler()
19 ch.setLevel(logging.DEBUG)
20
21 # 定义handler的输出格式
22 #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
23 formatter = format_dict[int(loglevel)]
24 fh.setFormatter(formatter)
25 ch.setFormatter(formatter)
26
27 # 给logger添加handler
28 self.logger.addHandler(fh)
29 self.logger.addHandler(ch)
30
31
32 def getlog(self):
33 return self.logger

再通过以下方式调用,便是一个简单的日志系统了

logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()

python 标准日志模块loging 及日志系统实例的更多相关文章

  1. Python标准库模块之heapq – 堆构造

    Python标准库模块之heapq – 堆构造 读前福利:几百本经典书籍https://www.johngo689.com/2158/ 原文链接:https://www.johngo689.com/2 ...

  2. Python入门之logging日志模块以及多进程日志

    本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...

  3. logging日志模块详细,日志模块的配置字典,第三方模块的下载与使用

    logging日志模块详细 简介 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么 了,但是当我需要看大量的地方或者在一个文件中查看的时 ...

  4. 【python标准库模块一】时间模块time学习

    本文介绍python的标准库模块time的常见用法 时间模块time 导入时间模块 import time 得到时间戳,这是统计从1970年1月1日0点0分到现在经过了多少秒,一般用于加减法一起用,比 ...

  5. python标准日志模块logging及日志系统设计

    最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下. python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发 ...

  6. 解决多个py模块调用同一个python的logging模块,打印日志冲突问题

    前期对python中的logging模块进行了封装,这样自动化测试框架中的多个测试脚本(py)就可以使用同一个封装后的日志系统,这样各脚本中只需要引用一下即可,方面快捷.那么当我使用unittest框 ...

  7. 【python标准库模块五】Xml模块学习

    Xml模块 xml本身是一种格式规范,是一种包含了数据以及数据说明的文本格式规范.在json没有兴起之前各行各业进行数据交换的时候用的就是这个.目前在金融行业也在广泛在运用. 举个简单的例子,xml是 ...

  8. 【python标准库模块四】Json模块和Pickle模块学习

    Json模块 原来有个eval函数能能够从字符串中提取出对应的数据类型,比如"{"name":"zhangsan"}",可以提取出一个字典. ...

  9. 【python标准库模块三】Os模块和Sys模块学习

    Os模块 导入os模块 import os 获取当前工作目录 os.getcwd() 切换目录,跟linux中的cd一样 os.chdir("文件夹名") 递归生成文件夹 os.m ...

随机推荐

  1. Oracle ddl 和 dml 操作

      ddl 操作 窗口设置用户权限的方法  Oracle的数据类型  按住Ctrl点击表名 ,可以鼠标操作  插入的数据需要满足创建表的检查  主表clazz删除数据从表设置级联也会一同删除 有约束也 ...

  2. Docker学习系列(一)-CentOS7下安装Docker

    CentOS7下Docker的安装 一.操作系统要求 CentOS 7 64位 Kernel 3.10+ 本机系统信息 二.卸载旧版本 如果之前安排过旧版本的Docker,先卸载掉旧版Docker以及 ...

  3. js节点操作实例

    写了一个简单的小例子来引用js实例 1. 初步节点操作: 2.兼容性节点操作: 3.节点的类型,名字: 4.使用setAttribute设置属性 5.节点复制操作: 6.删除和替换节点 如有错误,还望 ...

  4. 基于 HTML5 Canvas 的 Web SCADA 组态电机控制面板

    前言 HT For Web 提供完整的基于 HTML5 图形界面组件库.您可以轻松构建现代化的,跨桌面和移动终端的企业应用,无需担忧跨平台兼容性,及触屏手势交互等棘手问题.也可用于快速创建和部署,高度 ...

  5. 获取当前目录下所有php文件内的函数名

    $dir = dirname(__FILE__); $files = scandir($dir); foreach($files as $name){ if($name == '.' || $name ...

  6. php之微型博客的创建

    一,微型博客的开发思路 微型博客的创建,确定无疑我们会用到PHP和mysql之间的增添删改查,首先来看一下思维导图: 搭建好计算机里的apache php 和mysql的联动功能,打开phpmyadm ...

  7. spark or sparkstreaming的内存泄露问题?

    关于sparkstreaming的无法正常产生数据---->到崩溃---->到数据读写极为缓慢(或块丢失?)问题 前两阶段请看我的博客:https://www.cnblogs.com/wa ...

  8. 柱体内温度分布图 MATLAB

    对于下底面和侧面绝热,上底面温度与半径平方成正比的柱体,绘制柱体内温度分布图. 这里给出两种尝试:1.散点图:2.切片云图 1. 散点图仿真 首先使用解析算法求的场解值的解析表达,其次求解Bessel ...

  9. 20155207 2016-2017-2 《Java程序设计》第十周学习总结

    20155207 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 狭义的网络编程范畴 ...

  10. 20155319 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile、myod

    20155319 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile.myod 测试2-gcc测试 1.用gcc 进行预处理,编译,汇编,链接vi输入的代码 2.生 ...