自作ロガー
type: Concept
definition: 既製のログフレームワークを使えない事情がある場合に、アプリケーション自身が実装する障害調査用の診断ログの仕組み。
alternative label: 自作logger
alternative label: 自前実装のロガー
requires: ログのsessionId
requires: processId(ログ項目)
verified by: ロガーの結合テスト

ロガーの結合テスト
type: Concept
definition: 文字列整形やJSON化のユニットテストだけでは拾えないI/O・並行性・回転・終了時flush・権限エラーを、実ファイル・実スレッド・実プロセスで確認するテスト。
alternative label: 実ファイル・実スレッド・実プロセスでのテスト
uses: ログレコードの機械検証

JSON Lines
type: Concept
definition: 1行に1個のJSON値を書き、改行(\n)で区切るテキスト形式。文字コードはUTF-8で、BOMを付けてはいけないと定められている。
alternative label: JSONL
alternative label: .jsonl

ログのsessionId
type: Concept
definition: プロセスの1回の起動を1セッションとして採番し、同じ起動のログをまとめて追跡するための、ログレコードの必須項目。
alternative label: sessionId(ログ)

processId(ログ項目)
type: Concept
definition: sessionIdとは別に、ログレコードが記録するOS上のプロセスIDの項目。
alternative label: pid(ログ項目)

single writer(単一書き込み口)
type: Concept
definition: 呼び出し側が何スレッドあっても、書き込み先(ログファイルやシリアルポートなど)への実際の書き込みは1か所(1スレッド)だけに絞る設計。
alternative label: 書き込み口の一本化

bounded queue(上限付きキュー)
type: Concept
definition: 呼び出し側はキューに積むだけですぐ戻り、実際の書き込みはsingle writer側が行う、上限のあるキュー。あふれたときの方針を決める必要がある。
alternative label: 上限のあるキュー
requires: single writer(単一書き込み口)

flush(ログの同期書き出し)
type: Concept
definition: メモリ上のバッファを実ファイルへ吐き出す処理。ここを通していないログは異常終了で消える。
alternative label: 同期flush

ログの回転(ローテーション)
type: Concept
definition: ファイルが大きくなったり日付が変わったりしたときに、新しいログファイルへ切り替える仕組み。
alternative label: ローテーション

ログの保持(リテンション)
type: Concept
definition: 古いログファイルを何本・何日まで残すかの上限を定める仕組み。
alternative label: リテンション

1プロセス1ファイル
type: Concept
definition: ログファイルへの書き込み主体を1プロセスにつき1ファイルへ限定する、自作ロガーの基本方針。
alternative label: プロセスごとの単一ログファイル
recommended for: 自作ロガー

複数プロセスによる同一ログファイルへの追記
type: Concept
definition: 複数プロセスが同じログファイルへ追記する設計。排他制御・部分書き込み・回転タイミング・異常終了時の扱いが一気に難しくなる。
alternative label: 複数プロセス共有ログファイル
not recommended for: 自作ロガー

sessionIdの衝突
type: Concept
definition: 起動時刻とプロセスIDだけでsessionIdを作った場合に、OSによるプロセスIDの再利用やローカル時刻の巻き戻りで前回と同じ値になり得ること。
alternative label: セッションIDの重複

別々の起動のログレコードの混在
type: Concept
definition: sessionIdが衝突しファイル名も同じ値を使う設計のとき、FileMode.Appendで開いた瞬間に別々の起動のログレコードが1つのファイルへ混ざる状態。
alternative label: セッションの取り違え

ログレコードの機械検証
type: Concept
definition: 行数の一致・各行が単独でJSONとしてパースできるか・必須項目が値と型まで揃っているかを機械的に確認する検証方法。
alternative label: 行数・パース可否・必須項目の検証

Microsoft.Extensions.Logging(ILogger)
type: Concept
definition: .NET標準のログAPI。ログレベル・カテゴリ・出力先を差し替えるプロバイダーの仕組みを持ち、多くの.NET SDKに暗黙の参照として含まれる。
alternative label: .NET標準のILogger API
alternative label: ILogger / ロギング基盤
alternative label: ILogger<T>
recommended for: 障害調査用の診断ログ

障害調査用の診断ログ
type: Concept
definition: 監査証跡・分散トレーシング・メトリクス基盤・クラウド集約を対象外とし、アプリケーション障害の切り分けに使うことに絞ったログの用途。
alternative label: アプリケーション障害の切り分け用ログ

Serilog
type: Concept
definition: 構造化イベントを前提にした.NET向け診断ログライブラリ。メッセージテンプレートのパラメーターに名前を付け、値をイベントのプロパティとして保持する。
recommended for: 障害調査用の診断ログ

NLog
type: Concept
definition: 構造化ログと従来型ログの両方に対応する.NET向けログライブラリ。JSONレイアウトや自動命名・アーカイブ付きのファイル出力を持つ。
recommended for: 障害調査用の診断ログ

spdlog
type: Concept
definition: C++11以降で使えるログライブラリ。サイズで切り替えるrotatingと日付で切り替えるdailyのファイル出力を持つ。
recommended for: 障害調査用の診断ログ

保存失敗時の明示的な失敗通知
type: Concept
definition: ログ保存先が使えないときに黙って別の場所へ書かず、アプリの通知・イベントログ・標準エラーなど明示的な手段で失敗を表に出す設計方針。
alternative label: 保存先異常時のフォールバック禁止
recommended for: 自作ロガー

subject: 自作ロガー
predicate: uses
object: JSON Lines
description: 本記事が要件とする自作ロガーは、UTF-8のJSON Linesを1レコード1行の形式として採用する
evidence: jsonlines.org
verified at: 2026-08-01
certainty: context-dependent

subject: 自作ロガー
predicate: requires
object: ログのsessionId
description: 自作ロガーの必須項目にはlogSessionIdが含まれ、同じ起動のログをまとめて追跡できるようにする
evidence: logging
verified at: 2026-08-01
certainty: established

subject: 自作ロガー
predicate: requires
object: processId(ログ項目)
description: 自作ロガーの必須項目にはprocessIdが含まれ、logSessionIdとは別にOS上の実体を記録する
evidence: logging
verified at: 2026-08-01
certainty: established

subject: 自作ロガー
predicate: uses
object: single writer(単一書き込み口)
description: 本記事が要件とする自作ロガーは、呼び出し側のスレッド数によらず、書き込み口を1本(single writer)に絞る
evidence: logging
verified at: 2026-08-01
certainty: context-dependent

subject: bounded queue(上限付きキュー)
predicate: requires
object: single writer(単一書き込み口)
description: bounded queueを使う設計は、キューから実際に書き込むのがsingle writerであることを前提とする
evidence: logging
verified at: 2026-08-01
certainty: established

subject: 自作ロガー
predicate: uses
object: bounded queue(上限付きキュー)
description: ログ量が多く同期I/Oが律速になる場合、自作ロガーはsingle writer + bounded queueの構成を採用する
evidence: logging
verified at: 2026-08-01
certainty: context-dependent

subject: 自作ロガー
predicate: uses
object: flush(ログの同期書き出し)
description: 本記事が要件とする自作ロガーは、Error/Criticalとセッション開始・終了のログを同期flushする
evidence: logging
verified at: 2026-08-01
certainty: context-dependent

subject: 自作ロガー
predicate: uses
object: ログの回転(ローテーション)
description: 本記事が要件とする自作ロガーは、無限に増え続けないよう、v1から回転の仕組みを持つ
evidence: logging
verified at: 2026-08-01
certainty: context-dependent

subject: 自作ロガー
predicate: uses
object: ログの保持(リテンション)
description: 本記事が要件とする自作ロガーは、回転とあわせて、古いログファイルを何本残すかの保持上限を持つ
evidence: logging
verified at: 2026-08-01
certainty: context-dependent

subject: 1プロセス1ファイル
predicate: recommendedFor
object: 自作ロガー
description: 自作ロガーの基本方針として1プロセス1ファイルが推奨される
evidence: system.io.fileshare
verified at: 2026-08-01
certainty: established

subject: 複数プロセスによる同一ログファイルへの追記
predicate: notRecommendedFor
object: 自作ロガー
description: 複数プロセスから同じファイルへ追記させる設計は、排他制御・部分書き込み・回転タイミング・異常終了時の扱いが難しくなるため避けるべきとされる
evidence: system.io.fileshare
verified at: 2026-08-01
certainty: established

subject: ログのsessionId
predicate: prevents
object: sessionIdの衝突
description: 起動時刻・プロセスID・GUIDを組み合わせて採番する場合に限り、logSessionIdの衝突を防ぐ。起動時刻とプロセスIDだけで採番すると、この衝突がそのまま起き得る
evidence: system.guid.newguid
verified at: 2026-08-01
certainty: context-dependent

subject: sessionIdの衝突
predicate: mayCause
object: 別々の起動のログレコードの混在
description: logSessionIdが衝突しファイル名にも同じ値を使う設計だと、FileMode.Appendで開いた瞬間に別々の起動のレコードが1ファイルに混ざる原因になり得る
evidence: system.io.filemode
verified at: 2026-08-01
certainty: context-dependent

subject: 自作ロガー
predicate: verifiedBy
object: ロガーの結合テスト
description: 自作ロガーが運用で信用できるかどうかは、実ファイル・実スレッド・実プロセスでの結合テストで確認する
evidence: testing
verified at: 2026-08-01
certainty: established

subject: ロガーの結合テスト
predicate: uses
object: ログレコードの機械検証
description: 結合テストでは、行数・各行のパース可否・必須項目の値と型を機械的に検証する方法を用いる
evidence: get-content
verified at: 2026-08-01
certainty: established

subject: Microsoft.Extensions.Logging(ILogger)
predicate: recommendedFor
object: 障害調査用の診断ログ
description: 既製のログフレームワークが使える場合、.NET標準のMicrosoft.Extensions.Loggingの利用が推奨される
evidence: logging
verified at: 2026-08-01
certainty: established

subject: Serilog
predicate: recommendedFor
object: 障害調査用の診断ログ
description: 既製のログフレームワークが使える場合、構造化イベント前提のSerilogが選択肢として推奨される
evidence: serilog.net
verified at: 2026-08-01
certainty: established

subject: NLog
predicate: recommendedFor
object: 障害調査用の診断ログ
description: 既製のログフレームワークが使える場合、構造化ログと従来型ログの両対応であるNLogが選択肢として推奨される
evidence: nlog-project.org
verified at: 2026-08-01
certainty: established

subject: spdlog
predicate: recommendedFor
object: 障害調査用の診断ログ
description: C++の既製ログフレームワークとして、rotating/dailyのファイル出力を持つspdlogが選択肢として推奨される
evidence: spdlog
verified at: 2026-08-01
certainty: established

subject: 自作ロガー
predicate: recommendedFor
object: 障害調査用の診断ログ
description: 依存を増やせない・実行環境が限られるなど既製フレームワークを使えない事情がある場合に限り、自作ロガーが選択肢になる
evidence: logging
verified at: 2026-08-01
certainty: context-dependent

subject: 保存失敗時の明示的な失敗通知
predicate: recommendedFor
object: 自作ロガー
description: ログ保存先が使えないとき黙って別の場所へ逃がさず、明示的な手段で失敗を表に出す設計が自作ロガーには推奨される
evidence: logging
verified at: 2026-08-01
certainty: established