この記事の目的
この記事は、
ログ出力ライブラリのNlogをつかってPostgresにログ出力するための設定の忘備録
を目的としています。
本題
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は、以下のようにメタデータから取得しました。こんな方法しか思いつかなかったですが、一応、これで取得できます。
ファイルの出力先について
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>