我编写了一个 Python 应用程序,我使用分发安装在所需的机器上。
我现在通过创建 FileHandler 添加了一些最小的日志记录基础设施:
logging.FileHandler('/var/log/something.log')
问题是,并非在所有机器上我都可以默认写入 /var/log。此外,在持续集成服务器上运行我的测试时,它会尝试访问 /var/log/something.log。
如何避免对日志位置进行硬编码?您如何优雅地处理日志文件的位置?
这里有一些其他的想法。
将 shell 中的日志信息设置为变量,在配置文件中读取。这种方法的一个额外优点是您不会在文件中公开敏感信息(如加密或远程密钥)。您可以通过部署脚本(例如,安装程序或通过 puppet/chef)组合环境变量的设置。
如果您的最终客户端可以访问 Internet,那么像loggly这样的外部记录器也可以工作。如果访问受到限制,您可以创建自己的中央记录器;并将您的应用程序记录到系统日志工具中。如果您的日志记录需求不大 - 您可以使用sentry;这主要用于错误日志记录,但也可以用于任何其他日志。
通过 UDP 使用系统日志记录器。发送 UDP 数据包不需要特殊权限,您可以将它们发送到 localhost(如果它有 udp 侦听器)或远程主机。
如果您对 syslog 不熟悉,请查看免费版本的 syslog-ng,它有各种有用的小工具可以用来记录您的日志。
本地存储的日志文件难以管理,可能会填满分区等。如果所有内容都转到您可以轻松监控和清理的集中式服务器 - 或者如果它填满或死亡,没什么大不了的。Syslog 消息只会发送到 UDP-bitbucket,直到您的日志服务器再次接受消息。(显然,对于像金融交易这样的事情,你会想要一些更有弹性的东西)
但是对于记录错误和通常的“一切正常的警报”,syslog 非常棒,由 python stdlib 本质上支持,并且在每个操作系统上都支持。(我忘了windows是否有本地系统日志支持,但肯定有windows的开源系统日志服务器)
你无法避免这一点;名字必须写在某个地方。但是您可以将所有配置数据放在一个文件或一个文件夹中,并对其相对位置进行硬编码。
另一种选择是将其作为用户输入。我相信这不是你的意思。