先写一个最简单的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】多个文件共用日志系统的重复打印问题的更多相关文章

  1. logbook日志系统

    python中替代logging的日志系统. 不过比之前的logging难理解. 先上打印到屏幕上的代码和存到日志文件中的代码: #!/usr/bin/env python3 # -*- coding ...

  2. elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统

    前言 刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击:老大的叮嘱.强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题.排查问题等, ...

  3. Python logging日志系统

    写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...

  4. python学习笔记(日志系统实现)

    博主今天在自己的接口自动化框架中添加了日志系统 基于python自带的logging库.包括日志主函数.生成日志文件: # -*- coding: utf-8 -*- # 日志系统 # 时间:2017 ...

  5. python 标准日志模块loging 及日志系统实例

    本文出处:https://www.cnblogs.com/goodhacker/p/3355660.html#undefined python的标准库里的日志系统从Python2.3开始支持.只要im ...

  6. 【python】日志系统

    来源: http://blog.csdn.net/wykgf/article/details/11576721 http://www.jb51.net/article/42626.htm http:/ ...

  7. Python同时向控制台和文件输出日志logging的方法 Python logging模块详解

    Python同时向控制台和文件输出日志logging的方法http://www.jb51.net/article/66756.htm 1 #-*- coding:utf-8 -*- 2 import ...

  8. 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

    很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...

  9. Python脚本日志系统

    Python通过logging模块提供日志功能,关于logging模块的使用网络上已经有很多详细的资料,这里要分享的是怎样在实际工程中使用日志功能. 假设要开发一个自动化脚本工具,工程结构如下,Com ...

随机推荐

  1. [Ahoi2005]COMMON 约数研究 【欧拉线性筛的应用】

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 2939  Solved: 2169 [Submi ...

  2. bzoj4822: [Cqoi2017]老C的任务(扫描线+BIT/线段树)

    裸题... 依旧是写了BIT和线段树两种(才不是写完线段树后才想起来可以写BIT呢 怎么卡常数都挺大...QAQ ccz和yy的写法好快哇%%% BIT: #include<iostream&g ...

  3. ContestHunter暑假欢乐赛 SRM 04

    逃了一场SRM(躺 A题可以看成0点到1点,有p的几率从0到1,1-p几率不动,求0到1的期望步数.很显然概率是不降序列数/n!,然后列个方程E[0] = E[0] * (1 - p) + 1,解得E ...

  4. 【DP】【P2340】奶牛会展

    传送门 Description 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行了面试,确定了每头奶牛的智商和情商. 贝西有权选择让哪些奶牛参加展览.由于负的智商或 ...

  5. 剑桥offer(51~60)

    51.题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { ...

  6. 我们自己写的solr查询的代码作为search项目中的dao

    我们自己写的solr查询的代码作为search项目中的dao,但是启动时会报错: 其实就是说 searchServiceImpl 中我们 Autowired 的 SearchDao 类 spring ...

  7. Java的switch是否支持String作为参数,还支持哪些类型?

    在Java5以前,switch(expr)中,exper只能是byte,short,char,int类型. 从Java5开始,java中引入了枚举类型,即enum类型. 从Java7开始,exper还 ...

  8. FreeRTOS - 中断使用注意

    原文地址:http://www.cnblogs.com/god-of-death/p/6886823.html 注意点: 1.首先要将中断的嵌套全部设置为抢占优先级. 2.将freertos系统内核中 ...

  9. Rsync+inotify自动同步数据

    一.简介 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足. 首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传 ...

  10. JSX 的基本语法规则

    JSX 的基本语法规则:遇到 HTML 标签(以 < 开头),就用 HTML 规则解析:遇到代码块(以 { 开头),就用 JavaScript 规则解析