我正在使用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'可以做到这一点,但我们假设我每次都想要一个新文件(说实话,这是一个真正的问题更多的好奇心,我仍然想做正确的事)
谢谢:)
答案 0 :(得分:5)
听起来,日志记录过程正试图在另一个用户拥有的现有文件之上编写。以下是允许组loggroup
对目录logdir
进行组访问的过程。
使包含目录成为可写组。
$ chgrp loggroup logdir
$ chmod g+w logdir
在logdir
上设置 setgid 位。这使得logdir
中的新文件始终归该组所有。否则,新文件归创建者组所有。
$ chmod g+s logdir
确保所有日志记录用户都属于loggroup
。
$ usermod -a -G loggroup myuser
确保所有写入过程都具有正确的umask,以便他们可以使新创建的文件成为可写的。
$ umask 0002
现在loggroup
群组的所有成员都可以在logdir
中创建文件并覆盖彼此的文件。
答案 1 :(得分:0)
您可以将git哈希用作文件名的一部分。然后,如果日志中有奇怪的消息,您就知道哪个版本导致了它。
另一种可能性是从不同的目录或甚至chroot中运行测试。
更改权限或删除文件也可能有效,但如果测试由两个或多个用户同时运行,您仍然会收到一个混乱的日志文件。
如果你不关心内容,你也可以制作一个不记录任何内容的记录器,或者记录到数据库或......真正的/最佳答案取决于具体情况
答案 2 :(得分:-2)
import os
os.chmod("/some/location/file.type", 0777)
我猜你可以为创建的文件执行此操作。其中0777是octa中的权限。你可以把它改成你想要的任何东西。