Pythonにはloggingというロギング機能があって、ファイルへのログ出力ができる(Pythonでログローテーションする)。通常はstr型の文字列などをファイルに出力できるが、importしたモジュールなどで標準出力されたメッセージをログファイルに出力しておきたいことがある。今回は、標準出力をログファイルに出力する方法をまとめておく。
環境
サンプルデータの標準出力
まずはPandasのDataFrameを作成してinfo(DataFrame情報)とdescribe(記述統計)を標準出力してみる。
1 2 3 4 5 6 7 8 9 10 11 12 | 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をログファイルに出力してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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したモジュールで標準出力されるメッセージなどもログファイルに出力できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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を使わずにログファイルに出力できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 件のコメント:
コメントを投稿