python logging 不输出控制台_解决Python logging模块无法正常输出日志的问题

2023-11-06

废话少说,先上代码

File:logger.conf

[formatters]

keys=default

[formatter_default]

format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

class=logging.Formatter

[handlers]

keys=console, error_file

[handler_console]

class=logging.StreamHandler

formatter=default

args=tuple()

[handler_error_file]

class=logging.FileHandler

level=INFO

formatter=default

args=("logger.log", "a")

[loggers]

keys=root

[logger_root]

level=DEBUG

formatter=default

handlers=console,error_file

File:logger.py

#!/bin/env python

import logging

from logging.config import logging

class Test(object):

"""docstring for Test"""

def __init__(self):

logging.config.fileConfig("logger.conf")

self.logger = logging.getLogger(__name__)

def test_func(self):

self.logger.error('test_func function')

class Worker(object):

"""docstring for Worker"""

def __init__(self):

logging.config.fileConfig("logger.conf")

self.logger = logging.getLogger(__name__)

data_logger = logging.getLogger('data')

handler = logging.FileHandler('./data.log')

fmt = logging.Formatter('%(asctime)s|%(message)s')

handler.setFormatter(fmt)

data_logger.addHandler(handler)

data_logger.setLevel(logging.DEBUG)

self.data_logger = data_logger

def test_logger(self):

self.data_logger.error("test_logger function")

instance = Test()

self.data_logger.error("test_logger output")

instance.test_func()

def main():

worker = Worker()

worker.test_logger()

if __name__ == '__main__':

main()

问题一:测试过程中,只能打印出test_logger function一条语句

问题二:明明只在data_logger中打印出语句,但是logger的日志中也出现了相关的日志。

问题一解决方案:

利用python -m pdb logger.py 语句对脚本进行调试发现,在执行instance = Test()语句后,通过print '\n'.join(['%s:%s' % item for item in self.data_logger.__dict__.items()])调试语句看到data_logger的disable属性值由0变成了True,此时logger的对应属性也发生了相同的变化。这种变化导致了logger对象停止记录日志。

参考python logging模块的相关手册发现

“The fileConfig()function takes a default parameter, disable_existing_loggers, which defaults to True for reasons of backward compatibility. This may or may not be what you want, since it will cause any loggers existing before the fileConfig()call to be disabled unless they (or an ancestor) are explicitly named in the configuration.”

的说明,即调用fileconfig()函数会将之前存在的所有logger禁用。

在python 2.7版本该fileConfig()函数添加了一个参数,logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True),可以显式的将disable_existing_loggers设置为FALSE来避免将原有的logger禁用。

将上述代码中的Test类中的logging.config.fileConfig函数改成logging.config.fileConfig("./logger.conf", disable_existing_loggers=0)就可以解决问题。

不过该代码中由于位于同一程序内,可以直接用logging.getLogger(LOGGOR_NAME)函数引用同一个logger,不用再调用logging.config.fileConfig函数重新加载一遍了。

问题二解决方案:

logger对象有个属性propagate,如果这个属性为True,就会将要输出的信息推送给该logger的所有上级logger,这些上级logger所对应的handlers就会把接收到的信息打印到关联的日志中。logger.conf配置文件中配置了相关的root logger的属性,这个root logger就是默认的logger日志。

修改后的如下:

File:logger.conf

[formatters]

keys=default, data

[formatter_default]

format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

class=logging.Formatter

[formatter_data]

format=%(asctime)s|%(message)s

class=logging.Formatter

[handlers]

keys=console, error_file, data_file

[handler_console]

class=logging.StreamHandler

formatter=default

args=tuple()

[handler_error_file]

class=logging.FileHandler

level=INFO

formatter=default

args=("logger.log", "a")

[handler_data_file]

class=logging.FileHandler

level=INFO

formatter=data

args=("data_new.log", "a")

[loggers]

keys=root, data

[logger_root]

level=DEBUG

handlers=console,error_file

[logger_data]

level=DEBUG

handlers=data_file

qualname=data

propagate=0

File:logger.py

#!/bin/env python

import logging

from logging.config import logging

class Test(object):

"""docstring for Test"""

def __init__(self):

self.logger = logging.getLogger(__name__)

def test_func(self):

self.logger.error('test_func function')

class Worker(object):

"""docstring for Worker"""

def __init__(self):

logging.config.fileConfig("logger.conf")

self.logger = logging.getLogger(__name__)

self.data_logger = logging.getLogger('data')

def test_logger(self):

self.data_logger.error("test_logger function")

instance = Test()

self.data_logger.error("test_logger output")

instance.test_func()

def main():

worker = Worker()

worker.test_logger()

if __name__ == '__main__':

main()

以上这篇解决Python logging模块无法正常输出日志的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2020-02-18

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python logging 不输出控制台_解决Python logging模块无法正常输出日志的问题 的相关文章

  • 电赛备战心酸历程!!!

    辛辛苦苦备战电赛两个月 然后电赛延期了
  • 时间序列-预测(Forcasting):时间序列预测算法总结

    一 背景介绍 绝大部分行业场景 尤其是互联网 量化行业 每天都会产生大量的数据 金融领域股票价格随时间的走势 电商行业每日的销售额 旅游行业随着节假日周期变化的机票酒店价格等 我们称这种不同时间收到的 描述一个或多种特征随着时间发生变化的数
  • 主题:java并发编程-Executor框架

    http www iteye com topic 366591
  • 【Opencv读取中文路径图像】

    Opencv读取中文路径图像 if img0 None uipath unicode path utf8 img data np fromfile path np uint8 img0 cv2 imdecode img data 1
  • Python~OS模块--将文件保存到指定路径

    需求 写爬虫时 想将爬取下来的文件保存到指定的路径 环境 Python3 7 注意 windows下 用于区分系统路径 在python里面是转义符 os listdir 返回指定目录下的所有目录和文件名 os mkdir 创建指定路径下目录
  • 一维条码解码

    一维条码是一种能用于信息编码和信息自动识别的标准符号 是由一组宽度不同的黑白符号按一定规则交替排列编码组成的图形符号可用于表示一定的信息 它是对物品进行代号标识需要依赖数据库或通讯网络才能发挥最大的作用 常见的码制 条码符号类型 有EAN
  • Nacos踩坑记录之The IPv4 address(“nacos.xxxx.local“) is incorrect

    版本 spring cloud alibaba 2021 1 项目构建工具 gradle nacos server 2 0 3 1 问题 昨天早上上班来了之后 运营的同事着急的过来说生产环境登不上了 我赶紧打开日志看了之后 就发现了这样的报
  • C语言期末大作业-运动会管理系统 包含源码和设计文档

    C语言 运动会管理系统 源码和3000多字的设计文档非常详细 代码注释非常详细 部分功能测试截图如下 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 60281
  • 多线程练习-基于 AtomicInteger 实现多线程自增同一个变量

    Atomic原子类有很多的类型 由于有原子性 所以实例化的变量在多线程中不会有线程安全问题 感兴趣的可以搜索 题目 基于 AtomicInteger 实现多线程自增同一个变量 代码及其注释 基于 AtomicInteger 实现多线程自增同
  • 蓝桥杯C++算法训练-拿金币(动态规划)

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • FPGA基本算术运算

    FPGA基本算术运算 FPGA基本算术运算 1 有符号数与无符号数 2 浮点数及定点数 I 定点数的加减法 II 定点数的乘除法 3 仿真验证 i 加减法验证 ii 乘除法验证 FPGA基本算术运算 FPGA相对于MCU有并行计算 算法效率
  • 生成对抗网络(GAN) 手写数字图像生成

    生成式对抗网络 GAN 简介 生成式对抗网络的框架主要有两个模型 一个是生成模型 Generator 记为为 G 是用来生成数据 通过大量的样本学习 生成一些能够以假乱真的数据样本 第二个是辨别模型 Discriminator 记为D 主要
  • CCF 2014年9月第一题--相邻数对(java)

    package com hsx ccf import java util Scanner public class Ccf20140901 public static void main String args SuppressWarnin
  • 注解和反射

    一 注解 1 什么是注解 注解说白了就是对程序做出解释 与我们在方法 类上的注释没有区别 但是注解可以被其他程序所读取 进行信息处理 否则与注释没有太大的区别 2 内置注解 内置注解就是我们的jdk所带的一些注解 常用的三个注解 Overr
  • 基于支持向量机SVM的图像多分类,SVM的详细原理

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例 SVM图像多分类 代码 结果分析 展望 参考 支持向量机SVM的详细原理 SVM的定义 支持向量机 support vector machines SVM 是一种二
  • 软件模拟IIC驱动OLED 附源码

    软件模拟IIC驱动OLED 附源码 前言 CSDN上有很多的关于模拟IIC驱动的代码 都讲解的特别好 但对于想短时间理解并使用IIC的同学们而言是很枯燥困难的 所以我想由果到因 从写好的代码开始讲解IIC 希望可以帮助大家短时间掌握使用II
  • Springcloud连接nacos集群,nacos地址配置为nginx,报错:requst nacos server failed

    先说下版本 Spring cloud Hoxton SR12 spring cloud alibaba 2 2 9 RELEASE spring boot 2 3 12 RELEASE Linux Centos7 nacos server
  • 惠普Hp 战66 g3 amdR7-4800U,USB接口以及type-C速率/功能

    https h30471 www3 hp com t5 bi ji ben dian nao zhan66 san dai AMD14ying cun ban quan gong nengusbtypec jie kou zhi chi n
  • 【用户增长】找到用户增长的根本动因

    找到用户增长的根本动因 1 没有痛点的用户增长是不持久的 近几年创业的人越来越多 在这些创业失败的案例中 不乏一些 UI 设计非常漂亮的产品 但最终却因为用户增长做不起来而导致创业失败 这些产品失败的最主要原因就是没有找对痛点 没有需求也就

随机推荐

  • mysql内存使用分析(一)

    author skate time 2012 02 16 mysql内存使用分析 从内存的使用方式来说 MySQL数据库的内存使用主要分为以下两类 1 线程独享内存 2 全局共享内存 1 线程独享内存 在MySQL 中 线程独享内存主要用于
  • ledcode----丢失的数字

    目录 题目截图 题目接口 第一种解法 思路 第二种解法 差值法 思路 第三种解法 位运算异或法 关于异或操作符的预备知识 思路 例子 输入数组 0 1 3 根据题目要求消失的数字就是2 n 3 结语 题目截图 题目接口 int missin
  • React事件处理机制

    1 react事件并没有绑定到dom节点上而是绑定到了document 然后由统一的事件处理程序来处理 同时基于浏览器的事件冒泡机制 所有节点的事件会在document上触发 2 原生事件阻止冒泡会阻止合成事件的触发 合成事件的阻止冒泡不会
  • 虚拟机VMware Tools安装步骤

    Vmware tools是虚拟机中一款超级增强工具 可以让我们更加方便使用虚拟机 能实现主机与虚拟机之间的文件共享 这篇文章主要介绍了虚拟机VMware Tools安装步骤 需要的朋友可以参考下 本人安装VMware Tools 的需求是
  • 多线程抽取数据库数据

    记录一次多线成抽取数据的方案 public void static main String args 每页大小 int pageSize 100 总记录数 int totalCount ProductDAO countAll 计算一共有多少
  • java中Date日期类型的大小比较

    1 通过Date提供的compareTo 进行比较 java util Date类实现了Comparable接口 可以直接调用Date的compareTo 方法来比较大小 String beginTime 2018 07 28 14 42
  • Vue框架--Ruoyi解析

    Ruoyi是一个基于Vue js和Spring Boot的开源企业级快速开发平台 它提供了一套完整的前后端分离的解决方案 下面对Ruoyi的主要特点和架构进行解析 8大流程 前端技术栈 Ruoyi使用了Vue js作为前端框架 采用了Ele
  • android组件悬浮,Android 滑动组件悬浮固定在顶部

    要想实现的效果是如下 场景 有些时候是内容中间的组件当滑动至顶部的时候固定显示在顶部 实现的思路 1 目标组件 button 有两套 放在顶部和内容中间 2 当内容中间的组件滑动至顶部栏位置时控制显示 隐藏顶部和中间的组件 涉及到组件获取在
  • c++json nlohmann 和 poco json 使用,boost

    C 使用nlohmann json 最好用的c json库是 nlohmann C 使用nlohmann json wphkadn的博客 CSDN博客 把变量写成json容易 可是把json变成变量就要复杂一点 不过对于nlohmann一点
  • adb devices 出现????

    1 ubantu下adb 的安装 1 安装 sudo apt get install android tools adb 2 查看是否安装成功 adb v 有信息表示成功 2 配置 2 1查找设备 1 看adb 是否识别安卓设备 插入usb
  • iOS设备自动登录汕大校园网认证 一次设置永久免登录

    介绍 本文将介绍如何在苹果设备 Mac iPad iPhone 上使用捷径 Shortcuts 来使设备每次连接校园网WiFi后自动使用校园网账号登录 以及一键查询流量情况 当然 你也可以创建快捷方式在桌面以便掉线时一键重连 无须再前往浏览
  • 八道练习题教你轻松学会运用Unity中的协程用法

    携程 协程是什么 协程有什么用 为什么要用携程 练习题与讲解 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 要点总结 协程是什么 简单来说 协程就是Unity官方提供的一个类似于C 中多线程的功能 可以在组件中使用 即继承
  • Java-钉钉订阅事件

    文章目录 背景 什么是钉钉订阅事件 钉钉订阅事件的应用场景 整体思路 查看钉钉文档 什么是钉钉回调 钉钉回调具体实操 创建自己的应用 钉钉回调 开发过程中遇到的问题 总结 背景 最近需要做一个业务 钉钉组织架构下添加人员之后 要对该人员的数
  • 班级排名

    import java util Arrays import java util LinkedList import java util List import java util Scanner public class Main pub
  • 【C++入门到精通】C++入门—缺省参数、函数重载

    目录 前言 一 缺省参数 1 缺省参数的概念 2 缺省参数分类 全缺省参数 半缺省参数 二 函数重载 1 函数重载的概念 2 函数重载类型 参数类型不同 参数个数不同 参数类型顺序不同 C 支持函数重载的原理 名字修饰 name Mangl
  • CDH 1、CDH简介

    1 Apache Hadoop 不足之处 版本管理混乱 部署过程繁琐 升级过程复杂 兼容性差 安全性低 2 Hadoop 发行版 Apache Hadoop Cloudera s Distribution Including Apache
  • 将单个字节数据读取到一个float类型的数据中---的几种方法

    从串口读取传感器值的时候总是一个一个字节 高八位低八位 需要拼接成一个float或者int的时候 这些方法有用处 1 联合体方式 union float f unsigned char x 4 data data x 0 0xA2 data
  • Eslint如何不忽略node_modules里检测(vue+webpack项目)

    背景 我们项目里的业务组件是以单独的仓库子模块的形式 通过安装包的形式install到主项目里node modules里的 主项目是开启了eslint检测的 但是发现对node modules里的内容是不起作用的 但因为公司的质量检测组要扫
  • Chrome利器之FireShot:网页长截图工具

    首先对于很多写博客写文章的笔友来说 难免少不了一些网页截图或者gif图之类的 现在这里讲的是一个便捷的谷歌浏览器长截图插件 FireShot FireShot功能特点 可以截取整个页面 可见部分和选定区域 并且支持拖动加载截图 非常方便 下
  • python logging 不输出控制台_解决Python logging模块无法正常输出日志的问题

    废话少说 先上代码 File logger conf formatters keys default formatter default format asctime s name s levelname s message s class