Nlog 記錄日志到 sqlite


最近研究了一下Nlog這個日志框架,這里記錄一下如何將日志寫到sqlite中。

第一步:使用NuGet獲取Nlog和Sqlite

Nuget

  1. 第二步:在sqlite中創建一個database,這里我用了SQLite Expert Personal可視化工具

SqliteTable

第三步:在Nlog.config中配置target節點,這個在Nlog的官網中沒有查找到相應的例子,但網上有一篇博客有相應的記載,所以就先參考下:

<target name="Database" xsi:type="Database" keepConnection="false"
            useTransactions="false"
            dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"
            connectionString="Data Source=d:log.db3;Version=3;"
           commandText="INSERT into Log(Timestamp, Loglevel, Logger, Callsite, Message) values(@Timestamp, @Loglevel, @Logger, @Callsite, @Message)">
      <parameter name="@Timestamp" layout="${longdate}"/>
      <parameter name="@Loglevel" layout="${level:uppercase=true}"/>
      <parameter name="@Logger" layout="${logger}"/>
      <parameter name="@Callsite" layout="${callsite:filename=true}"/>
      <parameter name="@Message" layout="${message}"/>
    </target>

但這只是參考,首先我們獲取的sqlite版本不是1.0.65.0,所以要修改dbProvider中的字符串,這里可以用ILSpay查看

ILCheckVersion

到這里基本上就差不多了,但最新的Nlog需要的配置中還要加上這一句:

commandType="Text"

所以最終的配置如下:

  <targets>
    <!-- add your targets here -->
    <target name="File" xsi:type="File" fileName="C:Logfiles${shortdate}_nlog.txt"/>
    <target name="Database" xsi:type="Database" keepConnection="false"
            useTransactions="false"
            dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.97.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"
            connectionString="Data Source=d:log.db3;Version=3;"
            commandType="Text"
            commandText="INSERT into Log(Timestamp, Loglevel, Logger, Callsite, Message) values(@Timestamp, @Loglevel, @Logger, @Callsite, @Message)">
      <parameter name="@Timestamp" layout="${longdate}"/>
      <parameter name="@Loglevel" layout="${level:uppercase=true}"/>
      <parameter name="@Logger" layout="${logger}"/>
      <parameter name="@Callsite" layout="${callsite:filename=true}"/>
      <parameter name="@Message" layout="${message}"/>
    </target>
    <!--
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>

  <rules>
    
     <logger name="*" minlevel="Trace" writeTo="Database" />
   
  </rules>

這樣我們就可以在代碼中直接使用Nlog記錄日志了

Logger log = LogManager.GetCurrentClassLogger();
LogManager.ThrowExceptions = true;
log.Trace("test begin...");

for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
    log.Debug(i.ToString());
}
log.Trace("test end...");

Console.WriteLine("Press any key to close the application");
Console.ReadKey();

最后我們再用SQLite Expert Personal查看下是否記錄成功:

CheckResult


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM