在unit testing(我们使用py.test)的情况下,每次testing启动时,一些日志信息会传送到某个文件。 在集成服务器中,每次有人推送代码(我们也使用git :)我们运行testing。
问题是,一旦文件被创build,用户A在用户B尝试运行testing时,testing将失败,因为用户B没有权限在同一个文件上写入。
到目前为止,我们已经手动更改了文件权限,但看起来像一个肮脏的解决scheme。 另外我们也为每个用户创build一个日志文件,但是又一次感觉不对。
我们在testing中的日志代码是
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'可以做到这一点,但是让我们假设我每次都需要一个新文件(说实话,这是一个真正的问题更好奇,我仍然想要做的正确)
谢谢 :)
这听起来像日志记录过程试图写在另一个用户拥有的现有文件的顶部。 以下是允许组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
创建文件并覆盖彼此的文件。
你可以使用git散列作为文件名的一部分。 那么如果日志里有怪异的消息,就知道是哪个版本造成的。
另一种可能是从一个不同的目录甚至是一个chroot运行测试。
更改权限或删除文件也可能有效,但是如果测试是由两个或更多用户同时运行的话,您仍然会得到一个混乱的日志文件。
如果你不关心内容,或者登录到数据库,或者…确实正确/最好的答案取决于情况,你也可以制作一个不记录任何内容的记录器
import os os.chmod("/some/location/file.type", 0777)
你可以为我创建的文件做这个。 其中0777是八进制的权限。 你可以改变它到任何你想要的。