我正在使用Python日志记录工具WatchedFileHndler, 该处理程序监视日志文件是否已更改(logrotate 等),并在发生更改时重新打开该文件。
我的进程以 root 身份运行。
每次 WatchedFileHndler 重新创建文件时,我都需要通过 WatchedFileHandler 更改新创建的文件的文件所有者。
我怎样才能做到这一点?
谢谢
最佳答案
本文档中提供了一些有关如何在使用简单文件处理程序时将所有权应用于日志文件的建议:
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
论证。它对我有用。
关于Python日志记录,更改文件所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28096351/