2

cron とモジュールを使用する Python スクリプトを使用した非常に単純なテスト セットアップがありますloggingが、ログ イベントが発生すると cron が奇妙な動作をします。

crontab

* * * * * ~/test.py >> ~/test.log

~/test.py

#!/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'

~/test.log

cron の実行後、ログには次の 2 つのメッセージが入力されます。

Properly printed, to file
Still running, though

cron エラー電子メール

また、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

明示的なエラーではないようです。そうしないと、最終的な「まだ実行中です...」というメッセージが に出力されません~/test.logよね?

cron やロギングがこれを行うのはなぜですか? また、回避策はありますか?

4

1 に答える 1

9

によって設定されたデフォルトの構成では、basicConfig()ログ メッセージは に記録されstderr、cron はstderrファイルハンドルへの出力を電子メールに値するものとして解釈します。結局のところ、リダイレクトしていません。

logging.basicConfig()ドキュメントを参照してください:

StreamHandlerデフォルトで を作成しFormatter、それをルート ロガーに追加することにより、ロギング システムの基本的な設定を行います。

およびStreamHandlerドキュメント

ストリームが指定されている場合、インスタンスはそれをログ出力に使用します。それ以外の場合は、sys.stderr使用されます。

回避策は、ストリーム ハンドラを設定しないか、別のストリームを選択するか、ログに記録するファイル名を選択することです。

logging.basicConfig(level=logging.DEBUG, filename='/some/file/to/log/to')

また

logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)

にログを記録することによりstdout、ログ情報を同じ出力ストリームに書き込みますprint()

別の回避策は、次の場所にリダイレクトstderrすることstdoutです。

* * * * * ~/test.py >> ~/test.log 2>&1
于 2013-05-23T23:50:52.453 に答える