きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × SIer

Nlog × npgsql × Postgresにログを出力する設定のメモ

この記事の目的

この記事は、
ログ出力ライブラリのNlogをつかってPostgresにログ出力するための設定の忘備録
を目的としています。

本題

基本設定について

導入方法はNlogのページを参考に実施します。
nlog-project.org

DataBaseの設定は、こっちですね。
github.com

DbProviderの設定について

公式ドキュメントには、Nlogの設定からDBへの出力設定までまとまっていますが、なぜかPostgresへの設定の記載がありません。MySqlとかあるのに・・・
特に詰まったのが、DbProviderの設定です。
DbProviderに設定する内容は以下の通りですが、PostgresのExampleは提供されていません(=_=)

Note for .NET Core one should install the Nuget-package for the DbProvider (Ex. System.Data.SqlClient), and instead use the fully qualified name of the provider connection type (class implementing IDbConnection). See also DbProvider Examples

実際には、以下の手順で設定ができました。

  • NUGETでNpgsqlをインストールする。
  • db providerに以下のパラメータを設定する

dbProvider="Npgsql.NpgsqlConnection, Npgsql, Version=4.1.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"

以上。
Versionと、PublicKeyTokenは、以下のようにメタデータから取得しました。こんな方法しか思いつかなかったですが、一応、これで取得できます。
f:id:kinakomotitti:20191016224104p:plain


ファイルの出力先について

Nlogの内部ログの出力先と、ファイル形式の出力先は、同じ相対パスで指定しても、別の場所に出力されました。それぞれのルートフォルダが異なっているってことですが、これは仕様なのでしょうか・・・

一緒のフォルダに出力したい場合は、公式のサンプルと同じように、絶対パス指定するのが簡単のようです。Cドライブ直下にtempファイルを作るのが嫌だったので、相対パスにしたところ見つけた挙動なので、これ以上深入りはしませんw

nlog.config全体

最後に、サンプルを載せておきます。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Info"
      internalLogFile=".\temp\internal-nlog.txt"> <!--プロジェクトファイルと同じ場所にtempフォルダが作成される-->

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <targets>
    <!--binフォルダ配下にtempフォルダが作成される-->
    <target xsi:type="File" name="allfile" fileName=".\temp\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    <!--binフォルダ配下にtempフォルダが作成される-->
    <target xsi:type="File" name="ownFile-web" fileName=".\temp\nlog-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />

    <!--ここから-->
    <target xsi:type="Database"
        name="dotnet"
        dbProvider="Npgsql.NpgsqlConnection, Npgsql, Version=4.1.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"     <!--ここがとても詰まったところ-->
        dbDatabase="dotnet"
        dbUserName="postgres"
        dbPassword="dotnet"
        dbHost="localhost"
        commandType="text"
        commandText="INSERT INTO public.nlog VALUES( @message )">
      <parameter name="@message" layout="${message}" />      
    </target>
    <!--ここまで追加-->
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="dotnet" /><!--ここ追加-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>