Python日志记录,更改文件所有者

时间:2015-01-22 18:41:57

标签: python logging

我正在使用python日志工具的WatchedFileHndler, 此处理程序监视日志文件是否已更改(logrotate等)并在更改时重新打开该文件。

我的流程以root身份运行。

每次WatchedFileHndler重新创建文件时,我都需要通过WatchedFileHandler更改新创建文件的文件所有者。

我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

在本文档中使用简单文件处理程序时,有一些有关如何将所有权应用于日志文件的建议:

https://docs.python.org/3.5/howto/logging-cookbook.html#customizing-handlers-with-dictconfig

我按照这种模式对TimedRotatingFileHandler做了类似的事情,所以我想它可以对WatchedFileHandler起作用,但是我没有专门尝试过这种类型。

首先,我创建了一个与文档中类似但不相同的函数:

def owned_file_handler(filename, owner=None, *args, **kwargs):
    '''
    We need this so we can set ownership of the log files.
    See: https://docs.python.org/3.5/howto/logging-cookbook.html#customizing-handlers-with-dictconfig
    '''
    if owner:
        if not os.path.exists(filename):
            open(filename, 'a').close()
        shutil.chown(filename, *owner)
    return logging.handlers.TimedRotatingFileHandler(filename, *args, **kwargs)

想法是完成我们需要做的工作,然后将所有其他参数传递给实际的处理程序。

这是我随后必须在字典中更改处理程序配置的方式:

         'file': {
+            '()': owned_file_handler,
+            'owner': ['www-data', 'root'],
             'level': 'INFO',
-            'class': 'logging.handlers.TimedRotatingFileHandler',
             'when': 'W0',
             'backupCount': 8,
             'filename': f'/var/log/django/django_{name}.log',
         },

我用自己的函数(将直接调用该类)的回调class替换了(),并添加了新的owner参数。它对我有用。

答案 1 :(得分:0)

实际上,几乎没有理由以root身份运行服务。这几乎总是一个安全问题。除此之外,Python的os模块提供了您所需的功能:

os.chown(path, uid, gid)

https://docs.python.org/2/library/os.html