【问题标题】:Python logging to same file, different usersPython记录到同一个文件,不同的用户
【发布时间】:2012-10-18 09:47:32
【问题描述】:

我正在使用 python 的日志记录模块。

在单元测试的情况下(我们使用 py.test),每次启动测试时,一些日志信息都会进入某个文件。在集成服务器中,每次有人推送代码(我们也使用 git :) 我们运行测试。

问题是,一旦用户 A 创建了文件,当用户 B 尝试运行测试时,测试将失败,因为用户 B 无权在同一文件上写入。

到目前为止,我们已经手动更改了文件权限,但看起来像是一个肮脏的解决方案。此外,我们虽然为每个用​​户创建一个日志文件,但同样感觉不对。

我们的测试记录代码是

logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
    datefmt='%m-%d %H:%M',
    filename='/tmp/py.test.log',
    filemode='w')
log.setLevel(logging.DEBUG)
log.addHandler(logging.StreamHandler())

有没有办法避免这个问题?也许使用 filemode = 'a' 可以做到,但假设我每次都想要一个新文件(老实说,这是一个真正的问题,但我仍然想正确地做这件事)

谢谢:)

【问题讨论】:

  • 如何将用户名添加到文件名中,以便每个用户获得自己的单独副本?
  • @MarcB 正如我在问题“我们虽然为每个用​​户创建一个日志文件,但同样感觉不对”中所说的那样。我只是想知道我们是否可以为每个人使用相同的日志。
  • 每次测试增加日志文件名?
  • 请参阅Logging to a single file from multiple processes 虽然单个文件在您的情况下似乎没有用,除非您登录到多个目的地
  • @AlexL 再次,正如我在“我们虽然为每个用​​户创建一个日志文件,但再次感觉不对”的问题上所说的那样。创建不同的日志文件以某种方式被丢弃。

标签: python linux logging file-permissions


【解决方案1】:

听起来日志记录进程正试图在另一个用户拥有的现有文件之上进行写入。下面是允许组loggroup 访问目录logdir 的过程。

  1. 使包含目录组可写。

    $ chgrp loggroup logdir
    $ chmod g+w logdir
    
  2. logdir 上设置setgid 位。这使得logdir 中的新文件始终归该组所有。否则,新文件归创建者组所有。

    $ chmod g+s logdir
    
  3. 确保所有登录用户都属于loggroup

    $ usermod -a -G loggroup myuser
    
  4. 确保所有写入进程都具有正确的 umask,以便它们可以使新创建的文件可组写入。

    $ umask 0002
    
  5. 现在loggroup 组的所有成员都可以在logdir 中创建文件并覆盖彼此的文件。

【讨论】:

  • 感谢您的想法,但正如我在问题“到目前为止,我们已经手动更改了文件权限,但看起来像一个肮脏的解决方案。我们还考虑为每个用户创建一个日志文件,但同样,感觉不对”所以是的,我们已经更改了文件权限,我只是想知道是否可以直接从代码中执行某些操作(我并不是说从 python 执行这些命令)。感谢您的回答。
【解决方案2】:

您可以使用 git 哈希作为文件名的一部分。那么如果日志中有奇怪的消息,你就会知道是哪个版本导致的。

另一种可能性是从不同的目录甚至在 chroot 中运行测试。

更改权限或删除文件也可能有效,但如果测试由两个或更多用户同时运行,您仍然会得到一个混乱的日志文件。

如果您不关心内容,也可以制作一个不记录任何内容的记录器,或者记录到数据库或...确实正确/最佳答案取决于具体情况

【讨论】:

  • 最好的一点是,如果两个用户同时运行测试,文件看起来会很奇怪,至少可以这么说。
【解决方案3】:
import os
os.chmod("/some/location/file.type", 0777)

我猜你可以对创建的文件执行此操作。其中 0777 是八进制的权限。您可以将其更改为您想要的任何内容。

【讨论】:

  • 这不起作用,因为日志记录模块似乎在程序完成之前并未实际写入文件,因此任何 chmod 调用都将导致找不到文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多