Pythonにはloggingというロギング機能があって、ファイルへのログ出力ができる(Pythonでログローテーションする)。通常はstr型の文字列などをファイルに出力できるが、importしたモジュールなどで標準出力されたメッセージをログファイルに出力しておきたいことがある。今回は、標準出力をログファイルに出力する方法をまとめておく。
環境
サンプルデータの標準出力
まずはPandasのDataFrameを作成してinfo(DataFrame情報)とdescribe(記述統計)を標準出力してみる。
import numpy as np import pandas as pd N = 100 x = np.random.rand(N) y = np.random.rand(N) z = np.random.rand(N) df = pd.DataFrame({'x': x, 'y': y, 'z': z}) df.info() print('----------------') print(df.describe())
標準出力をログファイルへ出力
次はinfoとdescribeをログファイルに出力してみる。
from logging import getLogger, FileHandler import numpy as np import pandas as pd N = 100 x = np.random.rand(N) y = np.random.rand(N) z = np.random.rand(N) df = pd.DataFrame({'x': x, 'y': y, 'z': z}) logger = getLogger(__name__) handler = FileHandler(filename='test.log') basicConfig(handlers=[handler], level='INFO') logger.info(df.info()) logger.info('---------------') logger.info(df.describe())
describeの結果は出力されているがinfoの結果はNoneになっている。これはinfoの結果は標準出力されるため。以下のようにredirect_stdoutで標準出力の出力先を一時的にバッファに変え、バッファの内容をログファイルに出力することでinfoの結果をログファイルに出力できる。このようにすることで、importしたモジュールで標準出力されるメッセージなどもログファイルに出力できる。
from logging import getLogger, FileHandler import io from contextlib import redirect_stdout import numpy as np import pandas as pd N = 100 x = np.random.rand(N) y = np.random.rand(N) z = np.random.rand(N) df = pd.DataFrame({'x': x, 'y': y, 'z': z}) logger = getLogger(__name__) handler = FileHandler(filename='test.log') basicConfig(handlers=[handler], level='INFO') buf = io.StringIO() with redirect_stdout(buf): df.info() logger.info(buf.getvalue())
ちなみに、infoメソッドにはbufというキーワード引数ががあり、これを使うとredirect_stdoutを使わずにログファイルに出力できる。
from logging import getLogger, FileHandler import io import numpy as np import pandas as pd N = 100 x = np.random.rand(N) y = np.random.rand(N) z = np.random.rand(N) df = pd.DataFrame({'x': x, 'y': y, 'z': z}) logger = getLogger(__name__) handler = FileHandler(filename='test.log') basicConfig(handlers=[handler], level='INFO') buf = io.StringIO() df.info(buf=buf) logger.info(buf.getvalue())
0 件のコメント:
コメントを投稿