3

我正在使用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' 可以做到,但假设我每次都想要一个新文件(老实说,这是一个真正的问题,但我仍然想做正确的事)

谢谢 :)

4

3 回答 3

5

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

  1. 使包含目录组可写。

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

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

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

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

于 2012-10-29T05:26:45.537 回答
0

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

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

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

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

于 2012-10-29T03:45:10.677 回答
-2
import os
os.chmod("/some/location/file.type", 0777)

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

于 2015-05-16T18:21:16.747 回答