簡體   English   中英

.NET Core 使用 NLog 將日志記錄到 PostgreSQL 數據庫

[英].NET Core logging to PostgreSQL DB using NLog

我試圖將日志記錄集成到 .NET Core 中的 DB。 我能夠設置 NLog 並將消息記錄到 SQL Server。 這很容易。 但是當我嘗試將 DB 切換到 PostgreSQL 時,似乎沒有記錄任何內容。

下面是startup.cs中的代碼

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory = NpgsqlLogManager.LoggerFactory;
            loggerFactory.ConfigureNLog(@"NLog.config");
            loggerFactory.AddNLog();
        }

loggerFactory = NpgsqlLogManager.LoggerFactory;

是因為 NLog 默認使用 SqlClient 作為 sql server。 這將切換到使用 PostgreSql。

我的 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="Warn"
      internalLogFile="internal-nlog.txt">

  <targets>
    <!--<target xsi:type="File" name="allfile" fileName="${var:configDir}\nlog-all.log"
                layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="File" name="ownFile-web" fileName="${var:configDir}\nlog-own.log"
             layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception}" />-->

    <target xsi:type="Null" name="blackhole" />

    <target name="database" xsi:type="Database" >

    <connectionString>User ID=test;Password=pwd;Host=XXX;Port=1234;Database=DummyDB;Pooling=true;</connectionString>


      <commandText>
        insert into logs (
        Application, Logged, Level, Message,
        Logger, CallSite, Exception
        ) values (
        @Application, @Logged, @Level, @Message,
        @Logger, @Callsite, @Exception
        );
      </commandText>
      <parameter name="@Application" layout="Test" />
      <parameter name="@Logged" layout="${date}" />
      <parameter name="@Logger" layout="${logger}" />
      <parameter name="@Callsite" layout="${callsite}" />
      <parameter name="@Exception" layout="${exception:format=tostring}" />
      <parameter name="@Message" layout="${message}" />
      <parameter name="@Level" layout="${level}" />
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="database" />
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
  </rules>
</nlog>

內部日志文件(internal-nlog.txt)中沒有記錄異常。

在控制器中訪問記錄器。

  public class TestController : Controller
        {
            private ILogger _logger;
            public TestController(ILogger<TestController> logger)
            {
                _logger = logger;
            }

            [HttpGet]
            public void Test()
            {
                try
                {
                    throw new System.Exception("Random Exception");
                }
                catch (System.Exception ex)
                {
                    _logger.LogError("Log Something");
                }
            }
        }

我錯過了什么嗎?

將connectionString更改為此;

<target name="database" xsi:type="Database"  connectionString="Server=XXX;Port=1234;User Id=test;Password=pwd;Database=DummyDB;">

你應該在這里使用npsql驅動程序: http ://www.npgsql.org/

這對我來說可以寫入文件和PostgreSQL:

  1. 首先,我創建了一個ASP.NET核心Web應用程序(.NET Core)。
  2. 然后我從NuGet安裝:

  3. 修改了以下文件,如下所示:

    a) project.json

     "buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true, "copyToOutput": { "includeFiles": [ "nlog.config" ] } }, "publishOptions": { "include": [ "wwwroot", "web.config", "nlog.config" ] } 


    b) Startup.cs

     public class Startup { public Startup(IHostingEnvironment env) { env.ConfigureNLog("nlog.config"); } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddNLog(); app.UseDeveloperExceptionPage(); app.UseMvc(); app.AddNLogWeb(); } } 


    c) 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="Warn" internalLogFile="c:\\temp\\internal-nlog.txt"> <!-- Load the ASP.NET Core plugin --> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <!-- the targets to write to --> <targets> <target xsi:type="File" name="localFile" fileName="c:\\\\temp\\\\nlog-all-${shortdate}.log" layout="${longdate} ${level} ${message} ${logger} ${callsite} ${exception:format=tostring}" /> <target name="database" xsi:type="Database"> <dbProvider>Npgsql.NpgsqlConnection, Npgsql, Version=3.2.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7</dbProvider> <connectionString>Server=localhost;Port=5432;User Id=XXX;Password=XXX;Database=TestLog;</connectionString> <commandText> insert into "logs" ("Application", "Timestamp", "Level", "Message", "Logger", "CallSite", "Exception") values (:Application, :Timestamp, :Level, :Message, :Logger, :Callsite, :Exception); </commandText> <parameter name="@Application" layout="TestApp" /> <parameter name="@Timestamp" layout="${longdate}" /> <parameter name="@Level" layout="${level}" /> <parameter name="@Message" layout="${message}" /> <parameter name="@Logger" layout="${logger}" /> <parameter name="@Callsite" layout="${callsite}" /> <parameter name="@Exception" layout="${exception:format=tostring}" /> </target> <!-- write to the void aka just remove --> <target xsi:type="Null" name="blackhole" /> </targets> <!-- rules to map from logger name to target --> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Debug" writeTo="database" /> <logger name="*" minlevel="Debug" writeTo="localFile" /> <!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> </rules> </nlog> 


    d) 控制器

     public class HomeController : Controller { ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } [Route("home/test")] public IActionResult Test() { _logger.LogInformation("Logged test information from home controller."); return Ok("Ok"); } } 


參考文獻:
[1]。 ASP.NET Core入門(project.json)

Nlog.config修改此信息(添加dbProvider="Npgsql.NpgsqlConnection, Npgsql

<target name="database" xsi:type="Database"  dbProvider="Npgsql.NpgsqlConnection, Npgsql">

並使用 NuGet install Npgsql

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM