接続ログを記録する

loggingライブラリ

Pythonではloggingライブラリが標準ライブラリモジュールとして提供されています。ここではloggingを使ってサーバーに接続したクライアントの接続ログを記録してみます。

シンプルなログ

まずはloggingライブラリのサンプルです。

simplelog.py


# 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にロギング機能をつけたものです。

servsample2.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を参考にしてください。


トップページ