LoginSignup
0
0

More than 1 year has passed since last update.

pythonでログのファイル出力とコンソール出力を両方できるようにする。 mshmura

Last updated at Posted at 2021-12-04

目的

  • ファイル出力とコンソール出力の両方のログを出力できるようにする。
  • ファイル出力については、エラーレベル以上のみ出力されたファイルも作る。

注意点

ログについては最近勉強を始めたばかりなので、ここ少しおかしいなとか、もっと効率的に書けるなというところがあれば、コメントいただければ幸いです。

ライブラリのインポート

from logging import ERROR, Formatter, getLogger, StreamHandler,FileHandler,DEBUG

ログの出力形式を設定

formatter=Formatter('[%(levelname)s] %(asctime)s - %(message)s(%(filename)s)')
logger = getLogger(__name__)

コンソール表示用ハンドラーの生成

stream_handler = StreamHandler()

テキストファイル出力用ハンドラーの生成

デバッグレベルとエラーレベルに分ける。

file_handler = FileHandler('log.txt')
error_handler = FileHandler('log_error.txt')

各ハンドラーのレベルとフォーマットの設定

stream_handler.setLevel(ERROR)
stream_handler.setFormatter(formatter)
file_handler.setLevel(DEBUG)
file_handler.setFormatter(formatter)
error_handler.setLevel(ERROR)
error_handler.setFormatter(formatter)

ロガーのレベル設定とハンドラー追加

logger.setLevel(DEBUG)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.addHandler(error_handler)

実行ファイル

test_funcという関数内で、文字列+数字をしてエラーを発生させる。

log_practice.py
## ファイル出力とコンソール出力の両方のログを出力できるようにする。
## ファイル出力については、更にエラーのみの出力ファイルに分ける。

from logging import ERROR, Formatter, getLogger, StreamHandler,FileHandler,DEBUG
## ログの出力形式を設定
formatter=Formatter('[%(levelname)s] %(asctime)s - %(message)s(%(filename)s)')
logger = getLogger(__name__)

## コンソール表示用
stream_handler = StreamHandler()
## テキスト出力用
file_handler = FileHandler('log.txt')
error_handler = FileHandler('log_error.txt')

## レベルと形式の設定
stream_handler.setLevel(ERROR)
stream_handler.setFormatter(formatter)

file_handler.setLevel(DEBUG)
file_handler.setFormatter(formatter)

error_handler.setLevel(ERROR)
error_handler.setFormatter(formatter)

logger.setLevel(DEBUG)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.addHandler(error_handler)

logger.debug('ロギング 開始')

def test_func(num):
    return num + 3
try:
    test_func("ss")
except Exception as e:
    logger.exception("test_func関数にてエラー発生。エラー内容は下記のとおり。")

logger.debug('ロギング 終了')

コンソール出力画面

[ERROR] 2021-12-04 22:01:43,877 - test_func関数にてエラー発生。エラー内容は下記のとおり。(logpractice.py)
Traceback (most recent call last):
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 35, in <module>
    test_func("ss")
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 33, in test_func
    return num + 3
TypeError: can only concatenate str (not "int") to str

ファイル出力

デバッグレベル以上を出力したファイル

log.txt
[DEBUG] 2021-12-04 22:01:43,876 - ロギング 開始(logpractice.py)
[ERROR] 2021-12-04 22:01:43,877 - test_func関数にてエラー発生。エラー内容は下記のとおり。(logpractice.py)
Traceback (most recent call last):
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 35, in <module>
    test_func("ss")
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 33, in test_func
    return num + 3
TypeError: can only concatenate str (not "int") to str
[DEBUG] 2021-12-04 22:01:43,881 - ロギング 終了(logpractice.py)

エラーレベル以上を出力したファイル

log_error.txt
[ERROR] 2021-12-04 22:01:43,877 - test_func関数にてエラー発生。エラー内容は下記のとおり。(logpractice.py)
Traceback (most recent call last):
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 35, in <module>
    test_func("ss")
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 33, in test_func
    return num + 3
TypeError: can only concatenate str (not "int") to str
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0