.NET Core 使用 NLog 将日志记录到 PostgreSQL 数据库 [英] .NET Core logging to PostgreSQL DB using NLog

查看:72
本文介绍了.NET Core 使用 NLog 将日志记录到 PostgreSQL 数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试将日志记录集成到 .NET Core 中的 DB.我能够设置 NLog 并将消息记录到 SQL Server.这很容易.但是当我尝试将 DB 切换到 PostgreSQL 时,似乎没有记录任何内容.

I trying to integrate logging to DB in .NET Core. I am able to set up NLog and log messages to SQL Server. It was quite easy. But When I tried to switch DB to PostgreSQL nothing seems to be logged.

下面是startup.cs中的代码

Below is the code in 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 for sql server.这将切换到使用 PostgreSql.

is because the NLog by default uses SqlClient for sql server. This will switch to use PostgreSql.

我的 NLog.config 中的内容

Content in my 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)中没有记录异常.

No Exceptions are logged in internal log file(internal-nlog.txt).

访问控制器中的记录器.

Accessing Logger in Controllers.

  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");
                }
            }
        }

我错过了什么吗?

推荐答案

这对我写入文件和 PostgreSQL 很有用:

This worked for me to write into file and PostgreSQL:

  1. 首先,我创建了一个 ASP.NET Core Web 应用程序 (.NET Core).
  2. 然后我从 NuGet 安装:

  1. First I created an ASP.NET Core Web Application (.NET Core).
  2. Then I installed from NuGet:

修改如下文件:

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)

这篇关于.NET Core 使用 NLog 将日志记录到 PostgreSQL 数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆