我正在使用python日志工具的WatchedFileHndler, 此处理程序监视日志文件是否已更改(logrotate等)并在更改时重新打开该文件。
我的流程以root身份运行。
每次WatchedFileHndler重新创建文件时,我都需要通过WatchedFileHandler更改新创建文件的文件所有者。
我该怎么做?
由于
答案 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)