2

トルネードを使用して Web サービスを構築し、昼夜を問わずサービスを提供しています。次のコマンドを使用してサービスを開始しました。

nohup python my_service.py &

サービス ログは に書き込むことができますnohup.out。ただし、ファイルは時間の経過とともに大きくなります。より便利に管理するにはどうすればよいか知りたいです。つまり、適切な名前とサイズのログ ファイルを自動生成する方法を使用していますか? そのような:

service_log_1.txt
service_log_2.txt
service_log_3.txt
...

ありがとう。

4

4 に答える 4

3

はいあります。cron-job を有効にすると、ファイルが切り捨てられます (のような方法で "cat /dev/null > nohup.out")。このジョブを実行する必要がある頻度は、プロセスが生成する出力の量によって異なります。

しかし、ジョブの出力を完全に必要としない場合 (とにかくゴミかもしれませんが、それに答えることができるのはあなただけです) nohup.out、最初からファイルへの書き込みを防ぐことができます。現在、次のような方法でプロセスを開始します。

nohup command &

これを

nohup command 2>/dev/null 1>/dev/null &

ファイル nohup.out は作成されません。

プロセスの出力がファイルに送信される理由は次のとおりです。

通常、すべてのプロセス (つまり、コマンドラインから入力するコマンド。例外はありますが、ここでは関係ありません) は端末に接続されます。デフォルトでは (これは Unix がこれを処理する方法です)、これはテキストを表示できるものであり、シリアル回線を介してホストに接続されます。コマンドを入力して、プロセスから入力した端末のスイッチをオフにすると、端末が失われたため、プロセスも終了します。シリアル通信では、技術者は伝統的に電話通信 (その由来) の言葉を使用していたため、通信の終了は「中断」や「終了」ではなく「ハングアップ」と呼ばれていました。したがって、プログラムは「ハングアップ」で終了し、これを防ぐためのプログラムは「nohup」、つまり「ハングアップ時に終了しない」プログラムでした。

しかし、そのような孤立したプロセスには書き込む端末がない可能性が高いため、 nohup はファイル nohup.out を「画面の置き換え」として使用し、通常は画面に表示される出力をそこにリダイレクトします。nohp.out は作成されませんが、コマンドの出力がまったくない場合。

于 2013-05-16T10:20:23.877 に答える
1

使用しているライブラリによって出力が生成されていて、それを制御できない場合は、プログラムの起動時に標準出力をファイルにリダイレクトできます。その後、定期的にファイルを閉じて再度開くことで、ファイルが永久に大きくなるのを防ぐことができます。ファイルの名前にタイムスタンプを使用できるため、常に異なります。何かのようなもの:

import sys
import datetime
current_stdout = None
def reset_stdout():
    global current_stdout
    if current_stdout:
        current_stdout.close()
    sys.stdout = open(
        "{}.log".format(
            datetime.datetime.now().strftime('%Y%m%d%H%M%S')
            ),
        "w")
    current_stdout = sys.stdout
reset_stdout()

# Then call this every day.. week ..
reset_stdout()

ファイルのサイズに応じてファイルをリセットしたい場合は、次のようにして定期的にサイズを監視できます。

if current_stdout.tell() > 1000000:
    reset_stdout()

ただし、送信する出力を制御できる場合は、ログライブラリを使用することを強くお勧めします。出力でできることには多くの柔軟性があります。ログに送信されたメッセージは、ハンドラと呼ばれるオブジェクトによって処理できます。ライブラリに含まれるハンドラーの 1 つは、 RotatingFileHandlerと呼ばれます。ドキュメントから:

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)

「maxBytes 値と backupCount 値を使用して、ファイルが所定のサイズでロールオーバーできるようにすることができます。サイズを超えそうになると、ファイルは閉じられ、出力用に新しいファイルがサイレント モードで開かれます。ロールオーバーは、現在のログ ファイルが長さはほぼ maxBytes です。maxBytes がゼロの場合、ロールオーバーは発生しません。」

したがって、次のようなものを使用してすべてのロギングを行うことができます。

import logging
import logging.handlers
# Create a logger
log = logging.getLogger('example')
# Set the level of the logger. By doing this all the messages with a "level" of INFO or higher will be 
# sent to the log
log.setLevel(logging.INFO)
# Create the handler and set 20 files to rotate and a maximum size of 1MB
handler = logging.handlers.RotatingFileHandler('log',maxBytes = 1000000,backupCount=20)
# Now attach the handler to the logger object
log.addHandler(handler)

# Now you can send your output like:
log.info('text text text text text text text text text')
log.info(....
于 2013-05-17T15:02:37.957 に答える