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

Jua*_*ano 3 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())
Run Code Online (Sandbox Code Playgroud)

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

谢谢 :)

小智 5

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

  1. 使包含目录成为可写组.

    $ chgrp loggroup logdir
    $ chmod g+w logdir
    
    Run Code Online (Sandbox Code Playgroud)
  2. setgid位置1 logdir.这使得新文件logdir始终归该组所有.否则,新文件归创建者组所有.

    $ chmod g+s logdir
    
    Run Code Online (Sandbox Code Playgroud)
  3. 确保所有日志记录用户都属于loggroup.

    $ usermod -a -G loggroup myuser
    
    Run Code Online (Sandbox Code Playgroud)
  4. 确保所有写入过程都具有正确的umask,以便他们可以使新创建的文件成为可写的.

    $ umask 0002
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在,该loggroup组的所有成员都可以在其中创建文件logdir并覆盖彼此的文件.