【python】多个文件共用日志系统的重复打印问题
先写一个最简单的log文件: test_logging5.py
#coding:utf-8
import logging logging.debug('logger debug message')
logging.info('logger info message')
logging.warning('logger warning message')
logging.error('logger error message')
logging.critical('logger critical message')
控制台输出结果:
WARNING:root:logger warning message
ERROR:root:logger error message
CRITICAL:root:logger critical message
再写个复杂点的,有名字的log文件:test_logging4.py
#coding:utf-8
import logging logger1 = logging.getLogger('mylogger')
logger1.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('./log/test.log')
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
# 定义handler的输出格式formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter) logger1.addHandler(fh)
logger1.addHandler(ch) logger1.debug('logger1 debug message')
logger1.info('logger1 info message')
logger1.warning('logger1 warning message')
logger1.error('logger1 error message')
logger1.critical('logger1 critical message')
文件和控制台的输出结果:
2015-12-30 02:25:53,866 - mylogger - DEBUG - logger1 debug message
2015-12-30 02:25:53,866 - mylogger - INFO - logger1 info message
2015-12-30 02:25:53,866 - mylogger - WARNING - logger1 warning message
2015-12-30 02:25:53,866 - mylogger - ERROR - logger1 error message
2015-12-30 02:25:53,866 - mylogger - CRITICAL - logger1 critical message
恩,看着也挺正常的。
接着,我们把test_logging4.py中加上一句 import test_logging5.py
#coding:utf-8
import logging
import test_logging5 logger1 = logging.getLogger('mylogger')
logger1.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('./log/test.log')
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
# 定义handler的输出格式formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter) logger1.addHandler(fh)
logger1.addHandler(ch) logger1.debug('logger1 debug message')
logger1.info('logger1 info message')
logger1.warning('logger1 warning message')
logger1.error('logger1 error message')
logger1.critical('logger1 critical message')
文件中的结果跟上面的一样,但是控制台中的结果变成了:
WARNING:root:logger warning message
ERROR:root:logger error message
CRITICAL:root:logger critical message
2015-12-30 02:44:53,224 - mylogger - DEBUG - logger1 debug message
DEBUG:mylogger:logger1 debug message
2015-12-30 02:44:53,225 - mylogger - INFO - logger1 info message
INFO:mylogger:logger1 info message
2015-12-30 02:44:53,225 - mylogger - WARNING - logger1 warning message
WARNING:mylogger:logger1 warning message
2015-12-30 02:44:53,225 - mylogger - ERROR - logger1 error message
ERROR:mylogger:logger1 error message
2015-12-30 02:44:53,225 - mylogger - CRITICAL - logger1 critical message
CRITICAL:mylogger:logger1 critical message
分析一下:
最前面的那3条是test_logging5.py执行后的结果
但是,后面mylogger的打印却出现了两次,分别以我们设置的格式和默认的root格式打印了一遍。
这说明不同文件间的log系统是相互影响的,在test_logging5.py中我们用到了默认的log,在test_logging4.py中就会认为有root log的存在,并由于日志间的继承关系导致root和mylogger都各自打印一遍日志。简言之,就是先打开的文件中对log的设置,后打开的文件都会受到影响。
那么,我们想让mylogger的内容只打印一遍怎么办呢?
方法是,把test_logging5.py中的logger加个名字,不要用默认的root logger。
把test_logging5.py改成
#coding:utf-8
import logging logger2 = logging.getLogger('mylogger2')
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger2.addHandler(ch) logger2.debug('logger debug message')
logger2.info('logger info message')
logger2.warning('logger warning message')
logger2.error('logger error message')
logger2.critical('logger critical message')
之后再运行test_logging4.py。结果就成了:
2015-12-30 03:06:30,566 - mylogger2 - WARNING - logger warning message
2015-12-30 03:06:30,566 - mylogger2 - ERROR - logger error message
2015-12-30 03:06:30,566 - mylogger2 - CRITICAL - logger critical message
2015-12-30 03:06:30,566 - mylogger - DEBUG - logger1 debug message
2015-12-30 03:06:30,566 - mylogger - INFO - logger1 info message
2015-12-30 03:06:30,567 - mylogger - WARNING - logger1 warning message
2015-12-30 03:06:30,567 - mylogger - ERROR - logger1 error message
2015-12-30 03:06:30,567 - mylogger - CRITICAL - logger1 critical message
看,符合预期了~
建议:在有多个相互关联的文件都需要用到python的日志系统时,不要用默认的root logger。因为所有的名称都会继承root导致重复打印。用logger时一定要起名字!!
【python】多个文件共用日志系统的重复打印问题的更多相关文章
- logbook日志系统
python中替代logging的日志系统. 不过比之前的logging难理解. 先上打印到屏幕上的代码和存到日志文件中的代码: #!/usr/bin/env python3 # -*- coding ...
- elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
前言 刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击:老大的叮嘱.强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题.排查问题等, ...
- Python logging日志系统
写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...
- python学习笔记(日志系统实现)
博主今天在自己的接口自动化框架中添加了日志系统 基于python自带的logging库.包括日志主函数.生成日志文件: # -*- coding: utf-8 -*- # 日志系统 # 时间:2017 ...
- python 标准日志模块loging 及日志系统实例
本文出处:https://www.cnblogs.com/goodhacker/p/3355660.html#undefined python的标准库里的日志系统从Python2.3开始支持.只要im ...
- 【python】日志系统
来源: http://blog.csdn.net/wykgf/article/details/11576721 http://www.jb51.net/article/42626.htm http:/ ...
- Python同时向控制台和文件输出日志logging的方法 Python logging模块详解
Python同时向控制台和文件输出日志logging的方法http://www.jb51.net/article/66756.htm 1 #-*- coding:utf-8 -*- 2 import ...
- 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据
很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...
- Python脚本日志系统
Python通过logging模块提供日志功能,关于logging模块的使用网络上已经有很多详细的资料,这里要分享的是怎样在实际工程中使用日志功能. 假设要开发一个自动化脚本工具,工程结构如下,Com ...
随机推荐
- SRM13 T3 花六游鸟小(结论题)
哇这题是真的喵,HR智商太高辣 这题的难点就是看了题解之后怎么证明题解里的结论... 结论①:深度大于logm的点肯定能达到最大值 证明:显然一个西瓜的属性里0数量一半1数量一半我们取到的1数量最少, ...
- 获取 exception 对象的字符串形式(接口服务返回给调用者)
工具类: package com.taotao.common.utils; import java.io.PrintWriter; import java.io.StringWriter; publi ...
- Japan POJ - 3067 转化思维 转化为求逆序对
Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Jap ...
- mysql的IFNULL()函数FLOOR(),ROUND()函数
用法说明 1 IFNULL(expr1,expr2) 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2. IFNULL()返回一个数字或字符串值,取决于它被 ...
- devDependencies 和 dependencise 的区别
在使用 npm install 安装模块或者插件的时候,在命令中可以添加俩种参数把他们写入到 pakeage.json 文件里面去: --save ( 简写 -S ) --save-dev ( 简写 ...
- 数学:GCD
求最大公约数利用辗转相除法: long long gcd(long long a,long long b) { ) return a; else return gcd(b,a%b); } 求最小公倍数 ...
- UIImageView属性---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/C ...
- Vue 使用中的小技巧(山东数漫江湖)
在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心 ...
- python 实现二叉树相关算法
一.构建与遍历二叉树 基本性质 1)在二叉树的第i层上最多有2i-1 个节点 .(i>=1)2)二叉树中如果深度为k,那么最多有2k-1个节点.(k>=1)3)在完全二叉树中,具有n个节点 ...
- Unix/Linux Command Reference