sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# NLog の基本的な使い方1(NLog とは?)

この記事は、NLog(ログを管理する機能)の使い方(基本)について調べたことを記事にしています。

2022 年 12 月現在、NLog バージョン v5.1.0 について、以下は記述しています。

記事一覧

NLog is なに?

NLog の HP トップページを順に見ていくと、最初に以下のようにあります。

NLog is a flexible and free logging platform for various .NET platforms, including .NET standard. NLog makes it easy to write to several targets. (database, file, console) and change the logging configuration on-the-fly.

NLog は、.NET プラットフォーム用の flexible で無料なプラットフォームです。NLog は、複数ターゲット(例えば、データベース、ファイル、コンソール)への書き込みをサポートします。ロギングの設定は、オンザフライで変更することができます。

要するに、アプリケーションのログを書くためのツールです。主となる開発を支援するためのものではないかもしれません。とはいえ、ログの目的について考えてみると、エラーログをまず思いつくところかもしれませんが、通信ログ、印刷ログ、設定変更ログ、セキュリティログなど、目的/用途は多様です。

バグの対応については、現在はテストの評価がとても高いですが、テストだけしていればバグをすべて取り除くことができるかといえば、そうではないですね。

正しいコードを書いても、悪質なバグは常に防御をすり抜けます。コーダーの狩猟帽とバグ退治のショットガンを装備する必要があります。
ベタープログラマ 10 章バグ狩り

つぎに NLog は(ログの保存形式として)structured logging(構造化ログ)と traditional logging(従来式のログ)をサポートします、とあります。なので、このふたつの概念の違いは知っておかないと困りそう。(structured logging については、下に簡単な説明を加えました)

ちなみに、structured logging は semantic logging とも言うみたい。

structured logging (構造化ログ) is なに?

構造化ログの一番の特徴は、ログデータを json 形式などのようなものにすること。traditional logging は対人間なのに対して、structured logging は対機械が読みやすい形式と言えるかもしれないです。

log("User {username} logged in from {ip_address}", username, ipAddress)
{
    "time": "2016-05-27T13:02:11.888",
    "template": "User {username} logged in from {ip_address}", 
    "username": "alice", 
    "ip_address": "123.45.67.89"
}

わかりやすい目的の例だと、別のツールと連携させたい/読み込ませたい、といったものが考えられそうです。

NLog の特徴を整理

NLog 特徴は以下の4つで説明できるようです:

  • high performance (高性能であること)
  • easy-to-use (使いやすいこと)
  • easy-to-extend (拡張しやすいこと)
  • flexible to configure (設定が柔軟であること)

特徴はさらに、6つの機能に分類して実現されています:

  • Easy to configure
    • NLogは、設定ファイルやプログラムによって、非常に簡単に設定することができます。アプリケーションを再起動しなくても、設定を変更することができます。
  • Templatable
    • すべてのログは、layout render でテンプレート化することができる。
  • Extensible
    • NLog は最初からすでに target と事前に定義されたレイアウトを含んでいますが、独自に拡張したり、独自の値を追加することができます。
  • Structured logging
    • 構造化ログを完全にサポート。message-template とカスタム ログイベント プロパティの両方を処理できる。
  • Microsoft Extension Logging
    • Microsoft Extensible Logging と完全に統合 (integrated) できる。
  • appsettings.json
    • NLog の設定は NLog.config XML の代わりに、appsettings.json から読み込むことができます。${configsetting} で appsettings.json の値を使って、NLog のターゲットを設定することも可能です。

まだよくわからない説明(内容)もあると思いますが、こういった特徴・機能を持ったログをサポートする拡張、という感じで読み進めていくとよいと思います。

最後に Extensible の説明に target という言葉が出てきました。これは重要です。target は、ログのメッセージを表示する、保存する等のために使用されるもので、以下のようなものが挙げられています:

  • File
  • Event Log
  • Database
  • Console
  • E-mail
  • Debugger output

これで target の概念も理解することができました。また、load balancing, failover の状況、非同期書き込み、色々な target wrapper という概念も用意されているようです。加えて、もしも、ニーズに合う target が無いときは、カスタムした target も書けると。

更新頻度

ここを参照するとよさそうです。

2022 年現在、更新頻度は年1回程度に落ち着いているものの、問題なくサポートされてそうですね。

はじめに (Getting started) の選択

とりあえず、.NET の「はじめに」を読んでみます。

NLog - Getting started

.NET で利用するときは、「Getting started for .NET framework」か「Getting started for .NET Core Console application」をまず読む感じになると思います。

両者のチュートリアルのわかりやすい使い分けは、(読んでみるとわかりますが)Microsoft Extension Logging を利用する場合は後者を選択して、シンプルに NLog だけで Logging したいときは前者を選択する、といった感じになると思います。(もちろん、ここの記事のような野良チュートリアルを読んでもいいけど、公式はなるべく押さえたほうがいいと思います)

次の記事で実際に NLog の getting start のコードを書いてみます。いわゆる hello world 記事です。

参考