2017-02-13 23 views
0

.NETコアのDBへのログを統合しようとしています。 NLogとSQL Serverへのログメッセージを設定できます。それはかなり簡単でした。しかし、PostgreSQLにDBを切り替えると、何も記録されていないようです。NLogを使用した.NETコアのPostgreSQL DBへのログ

は以下startup.cs

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

デフォルトでNLogは、SQL Server用のSqlClientを使用しているため

loggerFactory = NpgsqlLogManager.LoggerFactory; 

がある行のコードです。これは、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

接続文字列をこれに変更します。

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

、あなたがここにnpsqlドライバを使用する必要があります。私は、ファイルとPostgreSQLに書き込むためhttp://www.npgsql.org/

+0

まだ幸運なことに、私は故意にテーブル名をログからlgsに変更して、ログ中に例外がスローされたかどうかを確認しました。 internal-NLogファイルにも例外は記録されません。上記のテーブル名の変更は、SQL Serverを使用しているときにinternal-nlogで例外を記録しています。 –

+0

そして、上記のURLからnpsqlドライバを使用するとどういう意味ですか?私はNuget Managerからリファレンスをダウンロードしました。 –

0

これが働いた:

  1. まず私はASP.NETコアWebアプリケーションを作成する(.NETコア)。
  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。コンフィグ

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

関連する問題