logging: 本番で使えるログ出力

print 卒業。ログレベルとファイル出力で運用に備える。

logging
標準のログ出力モジュール。
ログレベル
DEBUG < INFO < WARNING < ERROR < CRITICAL
ハンドラ
ログの出力先を決める。

ロギング基礎

飛行機のフライトレコーダー (Flight Recorder)

ロギングは「フライトレコーダー」です。飛行機(アプリ)が順調に飛んでいる記録も、トラブルで墜落した時の原因究明に必要なデータも、全て記録します。print() は乗客への機内アナウンスのようなもので、記録には残りませんが、ロギングはブラックボックスとして全てを保存します。

開発中のデバッグには `print()` を使いがちですが、実運用では `logging` を使います。「いつ」「どこで」「何が」起きたのかをレベル別(INFO, ERRORなど)に管理でき、ファイルへの保存や外部サービスへの送信も簡単だからです。

Basic Logging
import logging
# 基本設定
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s'
)
logger = logging.getLogger(__name__)
# ログ出力
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')
Bad
# ❌ Bad: print でデバッグ
def process():
print("Processing started")
print(f"Value: {value}")
print("Done")
Good
# ✅ Good: logging を使う
def process():
logger.info("Processing started")
logger.debug(f"Value: {value}")
logger.info("Done")

高度な設定

File Output, Structured Logging
# ファイル出力
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='%(asctime)s %(name)s %(levelname)s %(message)s'
)
# ハンドラを使った設定
handler = logging.FileHandler('app.log')
handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s %(message)s'
))
logger.addHandler(handler)
# 構造化ログ(JSON)
import structlog
structlog.configure(
processors=[structlog.processors.JSONRenderer()]
)
log = structlog.get_logger()
log.info("user_login", user_id=123, ip="192.168.1.1")
Tip: 本番環境では structlog で JSON 形式がおすすめ。

合格ライン

ログレベルを使い分けられる
ファイル出力を設定できる

演習課題

課題1: ログレベル
DEBUG, INFO, WARNING, ERROR を使い分けてください。
課題2: ファイル出力
ログをファイルに出力する設定を行ってください。