Python日志记录器文件权限

8

Ubuntu服务器16.04.5 LTS

我有一个使用以下代码创建日志文件的Python脚本:

today = datetime.today()
datem = datetime(today.year, today.month, today.day)
logger = logging.getLogger('processImport')
hdlr = logging.FileHandler('{0}myLog_{1}-{2}-{3}.log'.format(myLogFileLocation, datem.year, datem.month, datem.day))
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr) 
logger.setLevel(logging.INFO)

使用以下方式保存日志项:

logger.info(logMessage)

我有一个cron任务,定期通过执行Python文件使用os.remove(fullFilePath)删除 一段时间后的旧日志文件。

但是,当这个cron任务执行时,我遇到了权限错误。

OSError: [Errno 13] Permission denied: PathToTheFile\theLogFileName.log

当我检查文件的权限时,它们被设置为:

-rw-r--r-- 1 www-data www-data etc etc

请问我需要做什么才能让 cron job 有权限删除日志文件呢?

谢谢。


1
我猜你需要 (+w) 文件权限,以及父目录上的 (+x) 权限。 - Mayank Porwal
2个回答

10

文件夹写入权限存在问题,需要改变权限来解决。

建议尝试以下方法:

log_dir = '/abs/path/of/directory'

os.chmod(log_dir, 0777)   # for Python2
os.chmod(log_dir, 0o777)  # for Python3

请告诉我它的进展。

请注意,Python3现在需要在八进制数字前加上0o前缀,而不仅仅是0。参见这里:使用八进制数时出现无效标记。否则,您将收到以下错误:

SyntaxError: 无效的标记


谢谢,问题解决了。它是由于父文件夹的权限问题造成的。我直接从终端用 chmod 777 DirName 更改了这些权限,而不是使用 Python(昨天我尝试过,但出现了权限错误)。 - Doug
4
这个想法很糟糕,因为权限太宽松了。现在每个人都有权限在那里创建和删除文件。除了销毁日志文件来隐藏黑客攻击尝试外,还可以用符号链接替换它们,并让守护程序将内容写入用户无权访问的其他文件中。 - Goswin von Brederlow
4
在Python 3中,如果模式为八进制,需要在前面加上0o前缀:os.chmod(log_dir, 0o777) - Agnes Kis
1
使用0o777设置文件权限为读/写/执行,适用于所有人(用户、组和其他人)。如果该文件不是可执行文件,则使用0o666。这将仅为每个人提供读/写权限,省略了可执行部分。 - Gabriel Staples

0
也许你需要更改你的进程 umask
>>> import os
>>> from pathlib import Path
>>> Path('default').touch()
>>> os.umask(0o000)
2
>>> Path('changed').touch()
>>> exit()

$ ls -lah
drwxrwxrwt 1 root      root      4.0K Oct 13 22:07 .
drwxr-xr-x 1 root      root      4.0K Oct 13 21:48 ..
-rw-rw-rw- 1  urs       urs      0 Oct 13 22:07 changed
-rw-rw-r-- 1  urs       urs      0 Oct 13 22:07 default

阅读也:{{link1:python logging.handlers.RotatingFileHandler允许创建一个组可写的日志文件吗?}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接