python - 在 Python 中为不同进程记录单独的文件

标签 python logging multiprocessing

我看到了一些关于在 Python 中使用多处理模块时将来自不同进程的日志放在一起的问题。我想做相反的事情,为不同的进程生成单独的日志文件,并且它们应该记录调用其他模块时发生的所有内容而不被破坏。在下面的示例中,我有一个主程序(main.py)和两个模块(module1.py 和 module2.py),我希望主记录器(mainlog)写入标准输出,它做得很好。我还想要每个进程都有一个单独的文件,包括来自 module1 和 module2 的日志记录。

main.py:

import logging
import multiprocessing as mpr
import module1
import sys

mainlog = logging.getLogger("main")
h = logging.StreamHandler(sys.stdout)
mainlog.addHandler(h)
logging.root.setLevel(logging.DEBUG)

for i in xrange(0,3):
    mainlog.info("Starting process ... %s", i)
    log = logging.getLogger("module1")
    h = logging.FileHandler("process_{0}.log".format(i))
    fmt = logging.Formatter(fmt="%(levelname)-10s:%(filename)-20s:%(message)s")
    h.setFormatter(fmt)
    log.addHandler(h)
    log.setLevel(logging.DEBUG)
    p = mpr.Process(target=module1.do_something, args=(i,))
    p.start()

模块1.py:

import logging
import module2

log = logging.getLogger("module1")

def do_something(i):

    for j in xrange(0,100):
        log.debug("do something. process %2s. iteration %2s", i,j)
        module2.multiply(j,2)

还有一个 module2.py:

import logging
log = logging.getLogger("module2")

def multiply(x,y):
    log.debug("... multiplying %s x %s = %s", x,y, x*y)
    return x*y

相反,我得到以下输出:

Starting process ... 0
Starting process ... 1
No handlers could be found for logger "module2"
Starting process ... 2
No handlers could be found for logger "module2"
No handlers could be found for logger "module2"

还有 3 个单独的日志文件(process_0.log,...),其中包含来自所有进程的消息,而不是仅一个。 module2.py 中没有记录任何内容。我做错了什么?

最佳答案

您需要在子进程中配置日志记录。它们从头开始,并且没有配置日志记录。您使用的是 Windows 吗?在 Windows 中,子进程几乎不会从父进程继承任何内容,而在 POSIX 上,fork() 语义可以允许继承某些内容。

关于python - 在 Python 中为不同进程记录单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241253/

相关文章:

python - 对列表中的 2 和 2 元素执行操作

python - `with` 语句 __enter__ 和 __exit__ 线程安全吗?

php - 记录从 start-stop-daemon 调用的 php 脚本的错误输出

azure - 使用azure databricks读取azure databricks日志json文件

r - 使用 R 配置 MKL

python - 如何避免 Pandas 直方图子图中的图标题和轴标题重叠?

python - 从站点获取数据,而这些数据在 Python 的主 HTML 文件中找不到

unix - log15 库将纪元时间从纳秒舍入到秒以进行日志记录

multithreading - 如何使用多进程或多线程客户端在 python 中获取工作进度条?

Python3 通过多处理并行化作业