I have a simple test project to experiment with logging with NetCore 2.0 using the Microsoft Logging Extensions package.
The problem I'm having is that when I run my app the very first time, it logs informational messages as expected. The weird behavior I'm having though is that subsequent runs won't produce any messages at all.
My project targets the Net Core 2.0 framework, and has the following NuGet packages installed:
Below is my sample code I'm trying to get logging working with:
using System;
namespace LoggingNetCore2
{
using Microsoft.Extensions.Logging;
class Program
{
static void Main(string[] args)
{
var loggerFactory = new LoggerFactory();
loggerFactory.AddConsole();
loggerFactory.AddDebug(); // <-- why is this needed for console logging?
var logger = loggerFactory.CreateLogger(typeof(Program));
logger.LogInformation("Hello, World!");
logger.LogTrace("trace");
logger.LogDebug("debug");
logger.LogWarning("warning");
logger.LogCritical("critical");
logger.LogError("errrrr");
//using (logger.BeginScope("MyMessages"))
//{
// logger.LogInformation("Beginning Operation...");
// logger.LogInformation("Doing something cool... please wait.");
// logger.LogInformation("Completed successfully.");
//}
}
}
}
I get no output on the console window when I run the above. Any ideas that spring to mind on what could be going on?
Things I've tried:
Edit: I got logs showing now in the console window if I add the debug logging provider into the mix.
In a NetCore 1.x app, simply adding the console provider was enough.
Edit #2: Turns out the console logging provider doesn't immediately flush the messages to the console like it did in the net-core-1.x versions. It appears to run on a different thread. See this web page for info: https://github.com/aspnet/Logging/issues/631
ILoggerFactory is a factory interface that we can use to create instances of the ILogger type and register logging providers. It acts as a wrapper for all the logger providers registered to it and a logger it creates can write to all the logger providers at once.
Regardless, you can still see the console output in the Output pane in Visual Studio. There's a drop down there called "Show output from" and one of the choices is "ASP.NET Core Web server". Select this and you'll see all the console output.
@ajawad987, you're right. The Dispose()
works.
public class Program
{
public static void Main(string[] args)
{
var services = new ServiceCollection()
.AddLogging(config => config.AddConsole())
.BuildServiceProvider();
services.GetRequiredService<ILogger<Program>>()
.LogCritical("Hello");
((IDisposable) services)?.Dispose();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With