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