@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/04/02/001-custom-logger-minimum-requirements-and-integration-test-checklist/#article>
    schema:about <https://comcomponent.com/knowledge/custom-logger/>, <https://comcomponent.com/knowledge/logger-integration-test/> ;
    schema:mentions <https://comcomponent.com/knowledge/json-lines/>, <https://comcomponent.com/knowledge/single-writer/>, <https://comcomponent.com/knowledge/bounded-queue/>, <https://comcomponent.com/knowledge/log-flush/>, <https://comcomponent.com/knowledge/log-rotation/>, <https://comcomponent.com/knowledge/log-retention/>, <https://comcomponent.com/knowledge/log-session-id/>, <https://comcomponent.com/knowledge/process-id-log-field/>, <https://comcomponent.com/knowledge/one-process-one-file/>, <https://comcomponent.com/knowledge/multi-process-shared-log-file/>, <https://comcomponent.com/knowledge/sessionid-collision/>, <https://comcomponent.com/knowledge/log-record-mixing/>, <https://comcomponent.com/knowledge/log-record-validation/>, <https://comcomponent.com/knowledge/dotnet-ilogger/>, <https://comcomponent.com/knowledge/serilog/>, <https://comcomponent.com/knowledge/nlog/>, <https://comcomponent.com/knowledge/spdlog/>, <https://comcomponent.com/knowledge/diagnostic-app-log/>, <https://comcomponent.com/knowledge/log-storage-failure-handling/> .

<https://comcomponent.com/knowledge/custom-logger/> a skos:Concept ;
    skos:prefLabel "自作ロガー"@ja ;
    skos:definition "既製のログフレームワークを使えない事情がある場合に、アプリケーション自身が実装する障害調査用の診断ログの仕組み。"@ja ;
    skos:altLabel "自作logger"@ja ;
    skos:altLabel "自前実装のロガー"@ja ;
    ks:requires <https://comcomponent.com/knowledge/log-session-id/> ;
    ks:requires <https://comcomponent.com/knowledge/process-id-log-field/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/logger-integration-test/> .

<https://comcomponent.com/knowledge/logger-integration-test/> a skos:Concept ;
    skos:prefLabel "ロガーの結合テスト"@ja ;
    skos:definition "文字列整形やJSON化のユニットテストだけでは拾えないI/O・並行性・回転・終了時flush・権限エラーを、実ファイル・実スレッド・実プロセスで確認するテスト。"@ja ;
    skos:altLabel "実ファイル・実スレッド・実プロセスでのテスト"@ja ;
    ks:uses <https://comcomponent.com/knowledge/log-record-validation/> .

<https://comcomponent.com/knowledge/json-lines/> a skos:Concept ;
    skos:prefLabel "JSON Lines"@ja ;
    skos:definition "1行に1個のJSON値を書き、改行(\\n)で区切るテキスト形式。文字コードはUTF-8で、BOMを付けてはいけないと定められている。"@ja ;
    skos:altLabel "JSONL" ;
    skos:altLabel ".jsonl" .

<https://comcomponent.com/knowledge/log-session-id/> a skos:Concept ;
    skos:prefLabel "ログのsessionId"@ja ;
    skos:definition "プロセスの1回の起動を1セッションとして採番し、同じ起動のログをまとめて追跡するための、ログレコードの必須項目。"@ja ;
    skos:altLabel "sessionId(ログ)"@ja .

<https://comcomponent.com/knowledge/process-id-log-field/> a skos:Concept ;
    skos:prefLabel "processId(ログ項目)"@ja ;
    skos:definition "sessionIdとは別に、ログレコードが記録するOS上のプロセスIDの項目。"@ja ;
    skos:altLabel "pid(ログ項目)"@ja .

<https://comcomponent.com/knowledge/single-writer/> a skos:Concept ;
    skos:prefLabel "single writer(単一書き込み口)"@ja ;
    skos:definition "呼び出し側が何スレッドあっても、書き込み先(ログファイルやシリアルポートなど)への実際の書き込みは1か所(1スレッド)だけに絞る設計。"@ja ;
    skos:altLabel "書き込み口の一本化"@ja .

<https://comcomponent.com/knowledge/bounded-queue/> a skos:Concept ;
    skos:prefLabel "bounded queue(上限付きキュー)"@ja ;
    skos:definition "呼び出し側はキューに積むだけですぐ戻り、実際の書き込みはsingle writer側が行う、上限のあるキュー。あふれたときの方針を決める必要がある。"@ja ;
    skos:altLabel "上限のあるキュー"@ja ;
    ks:requires <https://comcomponent.com/knowledge/single-writer/> .

<https://comcomponent.com/knowledge/log-flush/> a skos:Concept ;
    skos:prefLabel "flush(ログの同期書き出し)"@ja ;
    skos:definition "メモリ上のバッファを実ファイルへ吐き出す処理。ここを通していないログは異常終了で消える。"@ja ;
    skos:altLabel "同期flush"@ja .

<https://comcomponent.com/knowledge/log-rotation/> a skos:Concept ;
    skos:prefLabel "ログの回転(ローテーション)"@ja ;
    skos:definition "ファイルが大きくなったり日付が変わったりしたときに、新しいログファイルへ切り替える仕組み。"@ja ;
    skos:altLabel "ローテーション"@ja .

<https://comcomponent.com/knowledge/log-retention/> a skos:Concept ;
    skos:prefLabel "ログの保持(リテンション)"@ja ;
    skos:definition "古いログファイルを何本・何日まで残すかの上限を定める仕組み。"@ja ;
    skos:altLabel "リテンション"@ja .

<https://comcomponent.com/knowledge/one-process-one-file/> a skos:Concept ;
    skos:prefLabel "1プロセス1ファイル"@ja ;
    skos:definition "ログファイルへの書き込み主体を1プロセスにつき1ファイルへ限定する、自作ロガーの基本方針。"@ja ;
    skos:altLabel "プロセスごとの単一ログファイル"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/custom-logger/> .

<https://comcomponent.com/knowledge/multi-process-shared-log-file/> a skos:Concept ;
    skos:prefLabel "複数プロセスによる同一ログファイルへの追記"@ja ;
    skos:definition "複数プロセスが同じログファイルへ追記する設計。排他制御・部分書き込み・回転タイミング・異常終了時の扱いが一気に難しくなる。"@ja ;
    skos:altLabel "複数プロセス共有ログファイル"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/custom-logger/> .

<https://comcomponent.com/knowledge/sessionid-collision/> a skos:Concept ;
    skos:prefLabel "sessionIdの衝突"@ja ;
    skos:definition "起動時刻とプロセスIDだけでsessionIdを作った場合に、OSによるプロセスIDの再利用やローカル時刻の巻き戻りで前回と同じ値になり得ること。"@ja ;
    skos:altLabel "セッションIDの重複"@ja .

<https://comcomponent.com/knowledge/log-record-mixing/> a skos:Concept ;
    skos:prefLabel "別々の起動のログレコードの混在"@ja ;
    skos:definition "sessionIdが衝突しファイル名も同じ値を使う設計のとき、FileMode.Appendで開いた瞬間に別々の起動のログレコードが1つのファイルへ混ざる状態。"@ja ;
    skos:altLabel "セッションの取り違え"@ja .

<https://comcomponent.com/knowledge/log-record-validation/> a skos:Concept ;
    skos:prefLabel "ログレコードの機械検証"@ja ;
    skos:definition "行数の一致・各行が単独でJSONとしてパースできるか・必須項目が値と型まで揃っているかを機械的に確認する検証方法。"@ja ;
    skos:altLabel "行数・パース可否・必須項目の検証"@ja .

<https://comcomponent.com/knowledge/dotnet-ilogger/> a skos:Concept ;
    skos:prefLabel "Microsoft.Extensions.Logging(ILogger)"@ja ;
    skos:definition ".NET標準のログAPI。ログレベル・カテゴリ・出力先を差し替えるプロバイダーの仕組みを持ち、多くの.NET SDKに暗黙の参照として含まれる。"@ja ;
    skos:altLabel ".NET標準のILogger API"@ja ;
    skos:altLabel "ILogger / ロギング基盤"@ja ;
    skos:altLabel "ILogger<T>" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/diagnostic-app-log/> .

<https://comcomponent.com/knowledge/diagnostic-app-log/> a skos:Concept ;
    skos:prefLabel "障害調査用の診断ログ"@ja ;
    skos:definition "監査証跡・分散トレーシング・メトリクス基盤・クラウド集約を対象外とし、アプリケーション障害の切り分けに使うことに絞ったログの用途。"@ja ;
    skos:altLabel "アプリケーション障害の切り分け用ログ"@ja .

<https://comcomponent.com/knowledge/serilog/> a skos:Concept ;
    skos:prefLabel "Serilog"@ja ;
    skos:definition "構造化イベントを前提にした.NET向け診断ログライブラリ。メッセージテンプレートのパラメーターに名前を付け、値をイベントのプロパティとして保持する。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/diagnostic-app-log/> .

<https://comcomponent.com/knowledge/nlog/> a skos:Concept ;
    skos:prefLabel "NLog"@ja ;
    skos:definition "構造化ログと従来型ログの両方に対応する.NET向けログライブラリ。JSONレイアウトや自動命名・アーカイブ付きのファイル出力を持つ。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/diagnostic-app-log/> .

<https://comcomponent.com/knowledge/spdlog/> a skos:Concept ;
    skos:prefLabel "spdlog"@ja ;
    skos:definition "C++11以降で使えるログライブラリ。サイズで切り替えるrotatingと日付で切り替えるdailyのファイル出力を持つ。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/diagnostic-app-log/> .

<https://comcomponent.com/knowledge/log-storage-failure-handling/> a skos:Concept ;
    skos:prefLabel "保存失敗時の明示的な失敗通知"@ja ;
    skos:definition "ログ保存先が使えないときに黙って別の場所へ書かず、アプリの通知・イベントログ・標準エラーなど明示的な手段で失敗を表に出す設計方針。"@ja ;
    skos:altLabel "保存先異常時のフォールバック禁止"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/custom-logger/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/json-lines/> ;
    schema:description "本記事が要件とする自作ロガーは、UTF-8のJSON Linesを1レコード1行の形式として採用する"@ja ;
    ks:evidence <https://jsonlines.org/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/log-session-id/> ;
    schema:description "自作ロガーの必須項目にはlogSessionIdが含まれ、同じ起動のログをまとめて追跡できるようにする"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/process-id-log-field/> ;
    schema:description "自作ロガーの必須項目にはprocessIdが含まれ、logSessionIdとは別にOS上の実体を記録する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/single-writer/> ;
    schema:description "本記事が要件とする自作ロガーは、呼び出し側のスレッド数によらず、書き込み口を1本(single writer)に絞る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/bounded-queue/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/single-writer/> ;
    schema:description "bounded queueを使う設計は、キューから実際に書き込むのがsingle writerであることを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/bounded-queue/> ;
    schema:description "ログ量が多く同期I/Oが律速になる場合、自作ロガーはsingle writer + bounded queueの構成を採用する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/log-flush/> ;
    schema:description "本記事が要件とする自作ロガーは、Error/Criticalとセッション開始・終了のログを同期flushする"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/log-rotation/> ;
    schema:description "本記事が要件とする自作ロガーは、無限に増え続けないよう、v1から回転の仕組みを持つ"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/log-retention/> ;
    schema:description "本記事が要件とする自作ロガーは、回転とあわせて、古いログファイルを何本残すかの保持上限を持つ"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/one-process-one-file/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/custom-logger/> ;
    schema:description "自作ロガーの基本方針として1プロセス1ファイルが推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.fileshare> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-process-shared-log-file/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/custom-logger/> ;
    schema:description "複数プロセスから同じファイルへ追記させる設計は、排他制御・部分書き込み・回転タイミング・異常終了時の扱いが難しくなるため避けるべきとされる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.fileshare> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/log-session-id/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/sessionid-collision/> ;
    schema:description "起動時刻・プロセスID・GUIDを組み合わせて採番する場合に限り、logSessionIdの衝突を防ぐ。起動時刻とプロセスIDだけで採番すると、この衝突がそのまま起き得る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.guid.newguid> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sessionid-collision/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/log-record-mixing/> ;
    schema:description "logSessionIdが衝突しファイル名にも同じ値を使う設計だと、FileMode.Appendで開いた瞬間に別々の起動のレコードが1ファイルに混ざる原因になり得る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.filemode> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/logger-integration-test/> ;
    schema:description "自作ロガーが運用で信用できるかどうかは、実ファイル・実スレッド・実プロセスでの結合テストで確認する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/testing/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/logger-integration-test/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/log-record-validation/> ;
    schema:description "結合テストでは、行数・各行のパース可否・必須項目の値と型を機械的に検証する方法を用いる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-content> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-ilogger/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/diagnostic-app-log/> ;
    schema:description "既製のログフレームワークが使える場合、.NET標準のMicrosoft.Extensions.Loggingの利用が推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/serilog/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/diagnostic-app-log/> ;
    schema:description "既製のログフレームワークが使える場合、構造化イベント前提のSerilogが選択肢として推奨される"@ja ;
    ks:evidence <https://serilog.net/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/nlog/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/diagnostic-app-log/> ;
    schema:description "既製のログフレームワークが使える場合、構造化ログと従来型ログの両対応であるNLogが選択肢として推奨される"@ja ;
    ks:evidence <https://nlog-project.org/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/spdlog/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/diagnostic-app-log/> ;
    schema:description "C++の既製ログフレームワークとして、rotating/dailyのファイル出力を持つspdlogが選択肢として推奨される"@ja ;
    ks:evidence <https://github.com/gabime/spdlog> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/custom-logger/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/diagnostic-app-log/> ;
    schema:description "依存を増やせない・実行環境が限られるなど既製フレームワークを使えない事情がある場合に限り、自作ロガーが選択肢になる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/log-storage-failure-handling/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/custom-logger/> ;
    schema:description "ログ保存先が使えないとき黙って別の場所へ逃がさず、明示的な手段で失敗を表に出す設計が自作ロガーには推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/logging> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
