Python logging模块日志存储位置踩坑
问题描述
项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题。
代码结构如下:
db.py
run.py
其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码。两个文件中都有使用Python自带的logging模块,来记录日志。其中前者将日志存入到db_xxx.log下,后者存入run_xxx.log下。
两者logging相关代码为:
# db.py
import logging
import time
dt = time.time()
logging.basicConfig(filename='db_' + str(dt) + '.log', level=logging.INFO)
# run.py
import logging
import time
dt = time.time()
logging.basicConfig(filename='run_' + str(dt) + '.log', level=logging.INFO)
同时,在run.py中会调用db.py的函数,例如:
# db.py
class DB():
def __init__(self):
xxxx
def select(self):
logging.info('log from db.py')
# run.py
from db import DB
if __name__ == '__main__':
db = DB()
db.select()
logging.info('log from run.py')
实际运行起来,发现所有的日志都只会存在 db_xxx.log 中,同时并不会产生 run_xxx.log 文件。
排错
猜测
依照上面的结果,猜测run.py文件中,引入的db.py中也有logging的设置,但只会有一个生效。
验证 1
写两个py文件first.py和second.py,在second中引用first的函数,看最终日志的输出文件名及顺序。
内容分别为:
# first.py
import logging
class TEST():
def __init__(self, log_type, dt):
dt = str(dt)
logging.basicConfig(filename='./log/' + log_type + '_' + dt + '.txt', level=logging.INFO)
def test_log(self):
logging.info('log from first.py')
# second.py
from first import TEST
import time
dt = time.time()
import logging
logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO)
logging.info('log from second')
test = TEST('db', dt)
test.test_log()
# 结果
➜ log_dir_test python second.py
➜ log_dir_test ls log
second.txt
➜ log_dir_test cat log/second.txt
INFO:root:log from second
INFO:root:log from first.py
可以看到,文件名为 second.txt,即采用了 second.py 的logging设置。同时,日志输出的顺序也是先输出 second 再是 first。
验证 2
此时尝试将second.py的语句顺序做一个调整,调整为下面:
# second.py
from first import TEST
import time
dt = time.time()
test = TEST('db', dt)
test.test_log()
import logging
logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO)
logging.info('log from second')
# result
➜ log_dir_test cat log/db_1561088221.83.txt
INFO:root:log from first.py
INFO:root:log from second
可以看到结果存储到了 db_xxx.txt 中,即采用了 first.py 的logging设置。
验证 3
再对second.py做调整:
# second.py
from first import TEST
import time
dt = time.time()
test = TEST('db', dt)
import logging
logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO)
logging.info('log from second')
test.test_log()
# result
➜ log_dir_test cat log/db_1561088393.36.txt
INFO:root:log from second
INFO:root:log from first.py
采用了first.py的设置
验证 4
继续调整second.py:
# second.py
from first import TEST
import time
import logging
logging.basicConfig(filename='./log/' + 'second.txt', level=logging.INFO)
dt = time.time()
test = TEST('db', dt)
logging.info('log from second')
test.test_log()
# result
➜ log_dir_test cat log/second.txt
INFO:root:log from second
INFO:root:log from first.py
采用了 second.py 的设置
共性
可以发现,两个文件的logging设置,在second.py的顺序,影响了second.py的logging设置。即:
- 当 first.py 的logging设置在前的时候,采用first.py的设置
- 反正,采用second.py的设置
- 只采用其中一个设置
解释
起初觉得奇怪,现在想想还是比较容易理解的。
假如 second.py 中已经设置了logging,后面引用了first.py的函数,first.py中又设置了logging。若此时又采用 first.py的设置,那后续如果second.py中又使用了logging.xxx怎么办?也就是说,Python会觉得混乱,不知所措……
解决办法
如果还是想达到 db.py 操作都存储到 db 相关目录下,run日志存储到run目录下怎么办?似乎没太好的解决办法;不优雅的处理方式,可以采用文件操作……比方说使用with open(xx) as f去操作,这样的话,比较繁琐。
更好的办法是什么?就是现在Python的这种机制。即 run.py 相关日志都存储到 run 目录下,即使调用了 db.py 的函数,日志也存储到 run 目录下。这样可以保证 run.py 的日志是全的,且时间顺序是正确的,减少了排错的成本。
Python logging模块日志存储位置踩坑的更多相关文章
- python logging模块日志回滚TimedRotatingFileHandler
# coding=utf-8 import logging import time import os import logging.handlers import re def logger(app ...
- python logging模块日志回滚RotatingFileHandler
# coding=utf-8 import logging import time import os import logging.handlers def logger(appname,roots ...
- python logging模块日志输出
import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = ...
- Python logging模块无法正常输出日志
废话少说,先上代码 File:logger.conf [formatters] keys=default [formatter_default] format=%(asctime)s - %(name ...
- (转)python logging模块
python logging模块 原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python ...
- python logging模块使用总结
目录 logging模块 日志级别 logging.basicConfig()函数中的具体参数含义 format参数用到的格式化信息 使用logging打印日志到标准输出 使用logging.base ...
- 0x01 Python logging模块
目录 Python logging 模块 前言 logging模块提供的特性 logging模块的设计过程 logger的继承 logger在逻辑上的继承结构 logging.basicConfig( ...
- python logging模块可能会令人困惑的地方
python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...
- python logging模块使用
近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import loggi ...
随机推荐
- Django之form主键
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- yum localinstall 解决本地 rpm 包的依赖问题
yum localinstall 解决本地 rpm 包的依赖问题 本文原始地址:https://sitoi.cn/posts/13384.html 使用命令: sudo rpm -ivh xxx.rp ...
- jmeter压测学习2-linux运行jmeter环境
前言 使用jmeter做压测的时候,在windows上不太稳定,所有一直在linux服务器上使用jmeter做压力测试. 本篇记录下linux上搭建jmeter环境,以及运行jmeter脚本,查看报告 ...
- jmeter APP接口压力测试
第一步:获取开发文档,了解接口地址和参数名 第二步:jmeter中添加需要测试的接口 a.设计APP的接口框架: b.http请求默认值设置如下: c.接口中应需要用到sign字段,加密字符串与时间戳 ...
- 安全组与网络ACL
通过配置网络ACL和安全组策略,保障VPC内的弹性云服务器安全使用. 安全组对弹性云服务器进行防护:设置不同安全组访问规则实现系统访问控制 网络ACL对子网进行防护:可实现网络区域访问控制
- 201671010404+陈润菊 实验十四 团队项目评审课程&学习总结
个人学习总结博客 这个作业属于哪个课程 软件工程任教教师 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11093584.html 作业学习目标 (1 ...
- li的inline-block出现间隙原因,解决方案
<style type="text/css"> body{ margin:0 0; padding:0 0; font-size: 14; text-decoratio ...
- PWA-让前端网页媲美原生APP的用户体验
一.背景 从2018年到现在,作为号称下一代web应用模型的PWA,逐渐成为了一个各大前端厂商争先恐后进行涉足,布局的一个新的技术, 其主要的对标物Native app,作为现在最主流的mobile端 ...
- Spark SQL中的Catalyst 的工作机制
Spark SQL中的Catalyst 的工作机制 答:不管是SQL.Hive SQL还是DataFrame.Dataset触发Action Job的时候,都会经过解析变成unresolved的逻 ...
- hdu3974-Assign the task-(dfs+线段树)
题意:有n个人,有上下级关系,有m个操作,有两种操作1.把一个任务分给某个人,他的下属也会停下手中工作和他一起做:2.查询某个人的当前任务是什么? 解题:n-1个关系,总有一个人没有上级,以他为根节点 ...