Pythonではloggingライブラリが標準ライブラリモジュールとして提供されています。ここではloggingを使ってサーバーに接続したクライアントの接続ログを記録してみます。
まずはloggingライブラリのサンプルです。
# File: simplelog.py
#
# ログのとり方
# https://docs.python.org/ja/3.13/howto/logging.html#logging-basic-tutorial
#
import logging
logging.basicConfig(filename='simplelog.log', encoding='utf-8',
format='%(asctime)s [%(levelname)s] %(message)s',
level=logging.DEBUG)
logging.debug('デバッグメッセージ')
logging.info('インフォメーション')
logging.warning('警告')
logging.error('エラー')
メソッドbasicConfig()は、名前の通りに基本的なログの設定を行います。 ここでは記録をログファイルにsimplelog.logに書き込みます。そのときのファイルのエンコーディングは明示的にutf-8にしています。 ログのフォーマットは “時間 [ログのレベル] ログに書き込むメッセージ” ということを明示的に指定しています。 ログの出力レベルはDEBUGに指定しています。simplelog.logの内容は次のようになります。
logging.basicConfig(filename='simplelog.log', encoding='utf-8',
format='%(asctime)s [%(levelname)s] %(message)s',
level=logging.DEBUG)
simplelog.logに出力された内容は以下の通りです。
2025-06-05 22:07:29,441 [DEBUG] デバッグメッセージ
2025-06-05 22:07:29,441 [INFO] インフォメーション
2025-06-05 22:07:29,441 [WARNING] 警告
2025-06-05 22:07:29,441 [ERROR] エラー
秒のあとのカンマ以下はミリ秒を意味しています。このサンプルコードでは処理は1ミリ秒にも満たない時間で終了してしまっているので、カンマ以下の数字も同じになっています。
下のコードはシンプルなサーバー・クライアント通信のページで紹介したservsample.pyにロギング機能をつけたものです。
# File: servsample2.py
#
# エコーサーバー
# https://docs.python.org/ja/3/library/socket.html
#
import socket
import logging
#
# ログを取るための設定
#
logging.basicConfig(filename='servlog.log', encoding='utf-8',
format='%(asctime)s [%(levelname)s] %(message)s',
level=logging.INFO)
logging.info('Server Start')
HOST = '0.0.0.0'# すべてのIPアドレスからの接続を許す
PORT = 54321 # ポート番号 / ダイナミック・ポートの領域を利用
# with構文を使って処理を閉じる書き方
# ソケットでTCP/IPを開く
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT)) # ソケットをポートにバインド
s.listen(1) # 接続開始
conn, addr = s.accept() # 接続待ち
with conn:
logging.info('Connection ' + str(addr)) # 接続元情報をロギング
while True: # 無限ループ
data = conn.recv(1024)
if not data: break
conn.sendall(data)
logging.info('Server Finish')ここにtelnetからサーバーに接続して、タイプし、終了(telnetのプロンプトでquitをする)します。するとログへの出力は次のようになります。
2025-06-05 22:14:02,243 [INFO] Server Start
2025-06-05 22:14:27,078 [INFO] Connection ('127.0.0.1', 34034)
2025-06-05 22:14:43,345 [INFO] Server Finish
DEBUGレベルでクライアントから送られたデータをログに記録するように改造してみよう。
ログのレベルの違いで出力が違いますが、筆者はおおよそ次のような判断で利用しています。
loggingライブラリのノウハウはPython公式ページのLogging HOWTOを参考にしてください。