Reputation: 43
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.
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();
}
The line
loggerFactory = NpgsqlLogManager.LoggerFactory;
is because the NLog by default uses SqlClient for sql server. This will switch to use PostgreSql.
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>
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");
}
}
}
Am I missing something?
Upvotes: 2
Views: 4845
Reputation: 11
In Nlog.config
modify this info (add dbProvider="Npgsql.NpgsqlConnection, Npgsql
)
<target name="database" xsi:type="Database" dbProvider="Npgsql.NpgsqlConnection, Npgsql">
And use NuGet install Npgsql
Upvotes: 0
Reputation: 659
This worked for me to write into file and PostgreSQL:
Then I installed from NuGet:
Modified the following files like this:
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) Controller
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");
}
}
References:
[1]. Getting started with ASP.NET Core (project.json)
Upvotes: 1
Reputation: 1874
Change your connectionString to this ;
<target name="database" xsi:type="Database" connectionString="Server=XXX;Port=1234;User Id=test;Password=pwd;Database=DummyDB;">
and you should use npsql driver here : http://www.npgsql.org/
Upvotes: 0