Python记录到同一个文件,不同的用户

时间:2012-10-29 03:32:03

标签: python linux logging file-permissions

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

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

问题是,当用户B尝试运行测试时,用户A创建文件后,测试将失败,因为用户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'可以做到这一点,但我们假设我每次都想要一个新文件(说实话,这是一个真正的问题更多的好奇心,我仍然想做正确的事)

谢谢:)

3 个答案:

答案 0 :(得分:5)

听起来,日志记录过程正试图在另一个用户拥有的现有文件之上编写。以下是允许组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中创建文件并覆盖彼此的文件。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:-2)

import os
os.chmod("/some/location/file.type", 0777)

我猜你可以为创建的文件执行此操作。其中0777是octa中的权限。你可以把它改成你想要的任何东西。