2017-02-13 24 views
0

Я пытаюсь интегрировать ведение журнала в БД в .NET Core. Я могу настроить NLog и протоколировать сообщения на SQL Server. Это было довольно легко. Но когда я попытался переключить DB на PostgreSQL, ничего не записывается.. Регистрация .NET Core в PostgreSQL DB с использованием NLog

Ниже приведен код в 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> 

Нет Исключения регистрируются во внутренней лог-файл (внутреннего 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"); 
       } 
      } 
     } 

Я что-то не хватает?

ответ

0

Измените connectionString на это;

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

и вы должны использовать npsql драйвер здесь: http://www.npgsql.org/

+0

По-прежнему не повезло, я намеренно изменил имя таблицы из журналов в lgs, чтобы узнать, не выбрасывается ли какое-либо исключение во время ведения журнала. Никакое исключение не регистрируется в файле internal-NLog. Вышеупомянутое изменение имени таблицы регистрирует исключение во внутреннем nlog при использовании SQL Server. –

+0

И что вы подразумеваете при использовании драйвера npsql из вышеприведенного URL? Я загрузил ссылку из Nuget Manager. –

0

Это работает для меня, чтобы написать в файл и PostgreSQL:

  1. Сначала я создал веб-приложения ASP.NET ядра (.NET ядро).
  2. Затем я установил из NuGet:

  3. Модифицированные следующие файлы, как это:

    а) project.json

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


    б) 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(); 
        } 
    } 
    


    с) Nlog.Конфигурационные

    <?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> 
    


    д) Контроллер

    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]. Getting started with ASP.NET Core (project.json)