自作ロガーの最小要件
まず結論
自作ロガーの最初の目標は、高機能化ではなく「障害時に信じられること」です。最初の版で押さえたい要点は次のとおりです。
- 形式は UTF-8 の JSON Lines にする
- 1 レコード 1 行を崩さない
- 必須項目:
timestamp,level,category,message,fields,sessionId,processId - 基本は 1 プロセス 1 ファイル
- 低負荷なら同期書き込み、多めなら
single writer + bounded queue Error/Criticalとセッション開始・終了は同期 flush する- 回転と保持は v1 から入れる
- 保存先が使えないときに、黙って別の場所へ逃がさない
対象範囲を狭くする
対象はアプリケーション障害の切り分けに使う診断ログに絞ります。「いつ」「どの処理で」「何が起き」「そのときどんな文脈だったか」を後から追えることを優先します。
最低限必要な要件
1. 形式は UTF-8 JSON Lines
1 行が 1 レコードであれば、テキストとしても読みやすく、後でスクリプトやツールから解析しやすくなります。途中で書き込みが切れても、壊れたのがどの行かを切り分けやすい点も実務向きです。
2. 必須項目を固定する
7 つの必須項目: timestamp, level, category, message, fields, sessionId, processId。message だけの文字列ログにすると検索が困難になります。逆に項目を増やしすぎると呼び出し側の負担が増えます。
3. 1 プロセス 1 ファイルを基本にする
複数プロセスから同じファイルへ追記させる設計は、排他制御や部分書き込み、回転タイミング、異常終了時の扱いが一気に難しくなります。
4. 書き込み戦略は負荷で分ける
- ログ量が少ない → 同期書き込み(分かりやすく障害調査しやすい)
- ログ量が多い →
single writer + bounded queue - キューあふれ時の方針(古いログを捨てる/新しいログを落とす/警告を出す)を先に決める
5. flush 条件を決める
Error と Critical、セッション開始・終了のログは同期 flush します。普段の Info まで全部 flush すると遅くなります。
6. 回転と保持は v1 から
「後で入れればよい」と思われがちですが、運用に入ると急に困ります。少なくとも「無限に増え続けない」ことと「何本残すか」を決めておきます。
7. 保存失敗時に勝手な代替保存をしない
保存先が使えないときに黙って別の場所へ書くと、運用担当が「あるはずの場所」にログがないことで初動が遅れます。通知や標準エラー出力など、明示的に失敗を表に出してください。
よくある NG
message文字列にすべてを詰め込む- 複数プロセスで同じファイルを共有する
- flush 条件を決めずに全面非同期化する
- 回転と保持を後回しにする
- 保存失敗時に黙って別フォルダへ逃がす
- ネットワーク転送やローカル DB 保存まで v1 に入れる
結合テスト項目
logger はユニットテストだけでは安心できません。実ファイル・実スレッド・実プロセスでの結合テストが必要です。v1 で最低限通したい 6 本:
- 単一スレッドでの正常書き込み
- 複数スレッド同時書き込み(レコードが壊れないか)
Error/Criticalの flush(即時反映されるか)- 回転と保持(条件で切り替わり、上限を超えた古いファイルが削除されるか)
- 保存先異常時の失敗通知(ディレクトリ不在、権限不足、ディスクフル)
- 正常終了時の drain と最終 flush
追加で確認したい異常系
- 保存先ディレクトリが存在しないときの挙動
- 書き込み権限がないときの挙動
- ディスクフル時の通知や戻り値
- キューあふれ時の動作
- 改行混入で複数行に壊れないか
- 例外終了に近い経路でも必要な終了ログが残るか
まとめ
自作ロガーの最初の目標は、高機能化ではなく「障害時に信じられること」です。形式を UTF-8 JSON Lines に固定し、必須項目を絞り、1 プロセス 1 ファイルを基本にし、flush・回転・保持・失敗時挙動を早めに決めます。そして実ファイル・実スレッド・実プロセスを使う結合テストで確認します。実装を大きくする前に、最小構成と最低限のテストセットを先に固めましょう。
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
Windowsはなぜ今の形になったのか:開発者から見た歴代Windowsの進化
Windows 95からWindows 11までの変化を、見た目の年表ではなく、互換性、安定性、権限管理、ドライバ、Win32、.NET、セキュリティなどWindowsアプリ開発者の視点で整理します。
Windowsアプリ開発者のためのCPU設定入門:優先度・アフィニティ・Pコア/Eコア
Windowsアプリ開発者向けに、CPU優先度、アフィニティ、Pコア/Eコア、省電力設定、EcoQoS/Efficiency Modeの関係と、性能・応答性・発熱を測る考え方を整理します。
開発者の異常な愛情、または私は如何にして心配するのをやめてWindowsを愛するようになったか
Windowsは面倒くさい。けれど、その面倒くささは、現実の業務を背負ってきたOSだからこその面倒くささでもある。
PowerShell実用コマンド集 ── 日常作業でよく使う小さな機能を増やす
PowerShellで日常作業に使う実用コマンドとして、Measure-Object、Group-Object、Select-String、Compare-Object、Tee-Object、Start-Transcriptなどの使いどころを整理します。
PowerShellスクリプト応用 ── ログ調査・アーカイブ・レポート化を安全に自動化する
PowerShellスクリプトでログ調査、CSVレポート、古いログのアーカイブ、証跡保存、タスクスケジューラ実行までを安全に進める実務手順を整理します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
技術相談・設計レビュー
改修方針、設計レビュー、既存資産の扱いを整理するための技術相談です。