Zac*_*ung 2 python cron logging
我有一个非常简单的测试设置,使用cron和使用该logging模块的Python脚本,而cron在遇到日志记录事件时表现得很奇怪.
* * * * * ~/test.py >> ~/test.log
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/env python
import logging
logging.basicConfig(level=logging.DEBUG)
print 'Properly printed, to file'
logging.debug("Does not get printed, get's e-mailed as an error")
print 'Still running, though'
Run Code Online (Sandbox Code Playgroud)
运行cron之后,将使用以下两条消息填充日志:
Properly printed, to file
Still running, though
Run Code Online (Sandbox Code Playgroud)
在cron运行之后,我收到一条通知我有新邮件:
From tomcat6@local Thu May 23 16:35:01 2013
Date: Thu, 23 May 2013 16:35:01 -0700
From: root@local (Cron Daemon)
To: tomcat6@local
Subject: Cron <tomcat6@local> ~/test.py >> ~/test.log
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/usr/local/tomcat6>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=tomcat6>
X-Cron-Env: <USER=tomcat6>
DEBUG:root:Does not get printed, get's e-mailed as an error
Run Code Online (Sandbox Code Playgroud)
看起来这不是一个明确的错误,否则最终的"仍在运行..."消息将不会被打印出来~/test.log,对吧?
为什么cron和/或日志记录这样做,是否有解决方法?
由basicConfig()日志消息设置的默认配置stderr,并且cron将任何输出解释为stderr文件句柄作为电子邮件值得; 毕竟,你不会重定向它.
通过创建
StreamHandler带有默认值Formatter并将其添加到根记录器的日志系统的基本配置,
如果指定了stream,则实例将使用它来记录输出; 否则,
sys.stderr将被使用.
解决方法是不设置流处理程序,或选择不同的流,或选择要记录的文件名:
logging.basicConfig(level=logging.DEBUG, filename='/some/file/to/log/to')
Run Code Online (Sandbox Code Playgroud)
要么
logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
Run Code Online (Sandbox Code Playgroud)
通过登录,stdout您可以将记录信息写入同一输出流print().
另一种解决方法是重定向stderr到stdout:
* * * * * ~/test.py >> ~/test.log 2>&1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |