首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否需要跨python项目中的模块共享记录器实例?

是否需要跨python项目中的模块共享记录器实例?
EN

Stack Overflow用户
提问于 2017-07-13 02:19:57
回答 1查看 347关注 0票数 1

我有一个特定于我的项目的通用记录器实例。它会自动创建和附加2个处理程序(StreamHandlerTimedRotatingFileHandler),这些处理程序具有不同的格式等预先配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logging_formatters = {
    'fmt': "%(asctime)s [%(levelname)8s:%(process)05d] [%(module)10s:%(lineno)03d] (%(name)s) %(message)s",
    'datefmt': "%Y-%m-%d %H:%M:%S"
}
def get_logger(
        application_name=None,
        filename=None,
        *args,
        **kwargs
):
    if not isinstance(application_name, str):
        raise ValueError("Logger class expects a string type application name")

    if filename is None:
        filename = application_name

    if not filename.endswith(".log"):
        filename = filename.split('.')[0] + ".log"

    log_path = kwargs.get('log_path')
    service_name = kwargs.get('service_name', '')
    console_level = kwargs.get('console_level', logging.INFO)
    file_level = kwargs.get('file_level', logging.DEBUG)

    logger = logging.getLogger(application_name)
    if len(logger.handlers) > 0:
        return logger
    # Create 2 handlers, and add them to the logger created
    # ...
    # ...
    # ...

现在,假设我的烧瓶项目结构类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/
- app.py
- settings.py
- dir1/
    - __init__.py
    - mod1.py
- dir2/
    - __init__.py
    - mod2.py

我使用python app.py启动服务器。app.py本身导入dir1.mod1dir2.mod2模块。每个模块都创建自己的记录器实例,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logger = log_package.get_logger(
    application_name='{}.{}'.format(settings.APPLICATION_NAME, __name__),
    filename=settings.LOG_FILE_NAME,
    service_name=settings.SERVICE_NAME,
)

如果是app.py,它是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logger = log_package.get_logger(
    application_name='{}.{}'.format(settings.APPLICATION_NAME, 'run'),
    filename=settings.LOG_FILE_NAME,
    service_name=settings.SERVICE_NAME,
)

现在,我面临的问题是:TimedRotatingFileHandler对所有子模块(即dir1.mod1dir2.mod2等)都很好地工作。但是,来自app.py的日志并没有被滚到新文件中。该特定实例正在将日志写入与服务启动时相同的文件。就像。如果我在2017-07-11上启动服务,那么app.py将继续将日志写入LOG_FILE_NAME.log.2017-07-11,而其他模块则每天滚动(when=midnight),而新的日志将被写入LOG_FILE_NAME.log

TimedRotatingFileHandler不为特定文件工作的原因是什么?我对目录中的所有文件运行了lsof命令,这是输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  23795 ubuntu    4w   REG  202,1  2680401 150244 /path/to/LOG_FILE_NAME.2017-07-12
python  23795 ubuntu   33w   REG  202,1   397074 150256 /path/to/LOG_FILE_NAME.log

是否需要跨python项目中的模块共享记录器实例?我认为这不应该是必需的,因为日志模块本身就是线程安全。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 07:33:39

TimedRotatingHandler实例不应该写入LOG_FILE_NAME.log以外的文件--其他文件(如LOG_FILE_NAME.2017-07-12 )将在滚动时创建,并且不应被打开。

您应该确保为给定的文件名在流程中只有一个TimedRotatingFileHandler实例--如果有两个不同的处理程序实例同时引用相同的文件名,则可能会出现意外的行为(如果一个实例翻转,它将更改它使用的文件,但另一个实例仍然具有对旧文件的引用,并继续写入该文件)。

您可能应该只将处理程序附加到根记录器,而不是单独的模块记录器,而其他记录器将在默认条件下(记录器的默认propagate设置未更改)拾取这些处理程序。

更新: %(name)s总是给出用于日志记录调用的记录器的名称,即使当处理程序附加到祖先记录器时也是如此。如果propagate被设置为记录器的False,那么祖先记录器中的处理程序就不会被使用-所以您应该将propagate留给它的默认值True

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45077809

复制
相关文章
【Rust问答】跨模块如何共享变量
我有一个cli程序, 我在main函数中拿到用户传递的参数token, 然后我在lib.rs里面的好多函数都要用到这个参数token, 我想通过参数传递的方式好像有点繁琐, 请问各位大佬有没有优雅的方
MikeLoveRust
2019/12/17
1.1K0
python email模块的使用实例
在使用python过程中,需要用的email模块来进行邮件的发送和接收,包含自定义邮件的中文、主题、日期、附件等信息,以下是我使用email模块来发送一个测试报告相关信息的邮件的例子:
py3study
2020/01/07
7650
Python判断列表中是否有某个项
这个算法比较巧妙:遍历列表,把列表中的每一项与匹配项进行比较,如果不相等就把下标为i的列表的值赋值给下标为k的列表,因为初始时k=i=0,意思就是取出当前项再赋值给当前项,假设有列表[1,2,3],匹配项val是2,则循环第一次后1的位置不变,当i=1,k=1时,也就是列表元素为2时,lt[i]!=val为false,进入下一次循环,此时k=1,i=2,lt[2]!=val (备注:lt[2]=2)满足条件,则执行lt[k]=lt[i],3会覆盖2的位置,列表就变成了[1,3,3],循环完毕,返回k值,再使用字符串截取lt[:k],截取从0位置开始,截取长度为k的闭区间长度的字符串,所以为1,3
程序员小新
2021/12/29
2.3K0
Python: collections模块实例透析Collections模块
Collections模块 collections模块提供了一些python内置数据类型的扩展,比如OrderedDict,defaultdict,namedtuple,deque,counter等,简单实用,非常值得学习了解。 import collections 1. OrderedDict 顾名思义,有顺序的词典,次序不再是随机的。普通的dict不记录插入的顺序,遍历其值的时候是随机的,相反,OrderedDict记录插入的顺序,在迭代的时候可以看出差异。 遍历 print 'Regular dict
用户2183996
2018/06/21
7290
Python: Logging模块实例详解
Logging 模块 import logging Quick Start 导入模块后直接logging.waring(),logging.error()简单粗暴地调用即可。默认的level是DEBUG,所以warning会打印出信息,info级别更低,不会输出信息。如果你不知道level等参数的意义请后面解释,淡定,继续往下看。 如果不特别配置,logging模块将日志打印到屏幕上(stdout)。 #!/usr/local/bin/python # -*- coding:utf-8 -*- import
用户2183996
2018/06/21
9290
Python: os模块实例详解
import os 操作文件 # I use jupyter notebook to create some file !touch foo.txt !echo Hello > foo.txt !cat foo.txt Hello # rename file os.rename('foo.txt','bar.txt') !cat bar.txt Hello # remove file os.remove('bar.txt') 改变目录 # current dir print os.getcwd() # cu
用户2183996
2018/06/28
8470
Python: json模块实例详解
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
用户2183996
2018/06/21
1.9K0
解决python3项目中无法使用supervisor的问题
在我的Dockerfile中这样安装 # 安装项目所需的第三方 RUN python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt \ && python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple \ gunicorn \ && python3 -m pip install git+https
简单、
2018/07/17
1.2K0
Python 按键记录器脚本
按键记录器,就你在电脑上的每个按键,都会被记录下来,可以进行操作追踪,当然了,你在网站上输入的用户名密码等敏感信息也会被记录下来。用 Python 实现这个可以说非常简单,不过这玩意请不要用在别人的电脑上,哈哈。
程序员皮克
2021/12/25
9670
高通SDX12:跨子系统数据共享实例分享
SVN英文全称software version number,直译软件版本号,通常为两位数字,取值也必须是0~9的数字,而且99这个值是被保留的。高通平台的SVN号通常存储在Modem镜像中,X12项目也不例外,一般是modem在初始化时读取预编译就已经定义好的SVN号,并且同时从nv中读取到svn号,进行对比,若不一致,则将新svn号写入nv,这样就可以确保svn号能够一直随版本更新,且能够与imei号组成16位的IMEISV,在注网时通过空口上报给网络侧。 通常各通信模组厂商有一套自己定义的规则,用于定义软件版本号和SVN之间的对应关系,如取软件全版本号末两位作为SVN号,后续将以此为例;但通信模组通常会被用于MIFI、CPE、工业网关、工业路由器等场景,由于通信模组本身就是多核,CPU处理性能较强,尤其是高速通信模组,如高通SDX12、SDX55、SDX62、SDX65等平台,其处理能力优越,完全可以作为独立的处理器使用,无需再借助于host设备,这就催生了OpenCPU的方案,很多MIFI、CPE等厂商会直接基于上述平台进行二次开发,并且重新制定自己的版本号、SVN号规则。 但通常SDK仅会给第三方厂商开放boot、system、user等分区,boot分区存储kernel镜像,客户可以集成外设驱动和应用,如wifi、phy等;system是文件系统,客户可以增加自己的应用,删除一些不必要的应用,如网络管理相关、webui、网关配置等;user是客户存储客制化数据的分区,如客户的wifi配置、lan侧管理参数、客制化信息等。客户可以对这三个镜像或分区进行二次开发。
四儿家的小祖宗
2022/11/15
1.3K0
高通SDX12:跨子系统数据共享实例分享
Cookie跨域名共享
具体的Samesite内容可以参考 阮一峰的:http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
biaoblog.cn 个人博客
2022/08/11
8680
Cookie跨域名共享
Python torch 模块,randperm() 实例源码
torch.randperm(n, *, out=None, dtype=torch.int64, layout=torch.strided, device=None , requires_grad=False) → LongTensor返回整数从0到n-1的随机排列。Parameters: n (int) 上限整数(不包含)Example:>>> torch.randperm(4)tensor([2, 1, 0, 3])
狼啸风云
2021/03/30
8020
python中MySQLdb模块用法实例
MySQLdb提供了connect方法用来和数据库建立连接,接收数个参数,返回连接对象:
用户2936342
2018/08/27
7200
python中zipfile模块实例化解
文章内容由--“脚本之家“--提供,在此感谢脚本之家的贡献,该网站网址为:https://www.jb51.net/
py3study
2020/01/15
1.7K0
python中zipfile模块实例化解
多War项目中静态文件的共享方案
在互联网产品中,一般会有多个项目(Jar、WAR)组成一个产品线。这些WAR项目,因为使用相同的前端架构(jQuery、easyui等),在各个项目中都会存在这些组件的代码,以及其他各个项目中都要用到的公共资源文件。
程序猿讲故事
2019/09/27
9950
多War项目中静态文件的共享方案
点击加载更多

相似问题

如何在Python模块之间共享记录器实例?

21

跨多个文件共享Python记录器

12

为共享模块定义python记录器

10

模块之间的Python共享记录器配置

12

Ruby -在模块/类之间共享记录器实例

92
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文