How to limit logging per component? - c#

In my .NET Core app, I define a logger factory with Serilog and then pass it to various components in the system.
When I set my logging level to Debug, some components (Memcached client, for instance) completely and utterly overwhelm the logs due to how much they log.
Is there a way to specify that I want Debug for all, except certain ones? I see that there is an Override entry, but I am not clear as to how to specify a specific component.
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Information"
}
}
}

Related

Could someone help explain the priority of log level configuration of ASP.NET Core 6

I am now handling the logs in my ASP.NET Core project (based on .NET 6), and I need to reduce some logs from Microsoft.AspNetCore library.
I configured log setting in appsettings.json as below:
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.Hosting.Diagnostics": "Information", // Required
"Microsoft.AspNetCore": "Warning", // Avoid any logs from other classes under this namesapce
"Microsoft": "Information"
}
}
Could someone help me to check whether this setting can achieve my requirement?
Does the log level of Microsoft.AspNetCore will override the setting of Microsoft.AspNetCore.Hosting.Diagnostics?
Thank you.
Does the log level of Microsoft.AspNetCore will override the setting of Microsoft.AspNetCore.Hosting.Diagnostics?
No, as per docs the most specific category is applied.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
In the preceding JSON:
The "Default", "Microsoft", and "Microsoft.Hosting.Lifetime" log level categories are specified.
The "Default" value is applied to all categories that aren't otherwise specified, effectively making all default values for all categories "Information". You can override this behavior by specifying a value for a category.
The "Microsoft" category applies to all categories that start with "Microsoft".
The "Microsoft" category logs at a log level of Warning and higher.
The "Microsoft.Hosting.Lifetime" category is more specific than the "Microsoft" category, so the "Microsoft.Hosting.Lifetime" category logs at log level "Information" and higher.
A specific log provider is not specified, so LogLevel applies to all the enabled logging providers except for the Windows EventLog.

Logging to the Application Insights TRACE event type using ILogger in ASP.Net Core

ASP.NET Core, targeting net7.0
I am using the .NET Core ILogger machinery to log messages to Application Insights.
I want to display application debug information, (I need to debug an app deployed to Azure). But I can't convince Application Insights NOT to filter out my logged debug messages.
EDIT:
It seems to me that I am trying to get Application Insights to do something it's not designed to do - that is, consistently display ALL of a particular type of message. Is there a better way to log debug message in an app deployed to Azure?
END-OF-EDIT
I use what I think is the standard setup and usage pattern:
In Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddApplicationInsightsTelemetry();
In my application code:
private readonly ILogger<MyCode> _logger;
/// <summary> DI constructor. </summary>
public MyCode(ILogger<MyApp.MyCode> logger)
{
_logger = logger;
}
// <summary> My method </summary>
public void MyMethod()
{
_logger.LogDebug("My message");
}
In appsetings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"MyApp": "Trace"
}
}
}
I do see my log output in the debug window, so I know it's making its way through the ILogger machinery, presumably to all of the listeners. I assume the adaptive sampling scheme is filtering out my messages.
EDIT:
I've verified that calling _logger.LogWarning results in a "TRACE" message in ApplicationInsights. But I don't want to use Warning error level for debugging because there is no easy way to turn off the debug logging (e.g., in appsettings.json). I would need to modify the source code to remove the warning-level log messages.
You could:
Change "LogLevel": { "Default": "Information", to "Trace"; or
Set ApplicationInsights -> LogLevel -> Default (see below); or
Change the log level in the code: builder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Trace);; or
Log these "really important" messages as Information or even Warning - the problem with changing App Insight's log levels is that unless you get it right you'll get A LOT of other Debug+Trace messages not from your code. Don't worry about the word Warning - it's just a level.
Create filter rules in configuration with appsettings.json from
says:
ApplicationInsightsLoggerProvider is aliased as "ApplicationInsights". The following section of appsettings.json overrides the default LogLevel.Warning log level of Application Insights to log categories that start with "Microsoft" at level LogLevel.Error and higher.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
},
"ApplicationInsights": {
"LogLevel": {
"Microsoft": "Error"
}
}
}
}

How to configure Logging without appsetting.json?

I am working on .net framework 4.7.2 web API which doesn't have appsetting.json.
I wonder where should I configure the below setting for Microsoft.Extension.Logging?
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
and Bind it to LoggerFilterOption on Startup?
Below seems not to work:
LoggerFilterOptions options = new LoggerFilterOptions();
var config = UnityConfig.Container.Resolve<IConfiguration>();
config.GetSection("Logging").Bind(options);
I want to control MinLogLevel and Rules (LoggerFilterOption)through the web.config, Can that be achieved?

ASP.NET Core 3.1, logging only specific messages to Azure Log Stream Console

I have an ASP.NET Core 3.1 API running on Microsoft Azure App Service.
I have set up an ILogger into the app and I use it extensively to monitor the behavior of the API. I would like to be able to see those messages real time into the Azure Log Stream of the app portal.
I managed to get logs after registering the AzureWebAppDiagnostics into Program.cs as follows:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
logging.AddAzureWebAppDiagnostics();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
The problem is that messages I logged explicitly, using
logger.LogInformation("whatever message")
are mixed with system messages and becomes flooded: Entity Framework commands, Microsoft.Hosting.Lifetime messages, and multiple other informative messages.
How can I set up the system in a way that I get only error/warning messages from the system, and informative messages from my app code.
I tried to change the appsettings.json as follows, but it seems to have no effect at all :
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Error",
"Microsoft.Hosting.Lifetime": "Error",
"Microsoft.*": "Error",
"System": "Error",
"Microsoft.EntityFrameworkCore.*": "Warning"
}
}
I deleted as well the appsettings.development.json file just in case, as suggested here.
What am I doing wrong?
Actually, after throrough researches, the solution was provided here
You need to add AzureAppServicesBlob and AzureAppServicesFile configuration into your configuration file, they seem to be the one taken into account by the Azure Log Stream.
So I added the following part :
"AzureAppServicesBlob": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Error",
"System": "Error"
}
},
"AzureAppServicesFile": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Error",
"System": "Error"
}
}
It's not wildcarded in the configuration. It's simply a namespace prefix: use Microsoft.EntityFrameworkCore as the property name.

What does MinimumLevel and Override mean in appsettings.json logging context?

I am looking at the appsettings.json from Serilog sample project, which has the following snippet:
"MinimumLevel": {
"Default": "Debug",
"Override": {
"System": "Information",
"Microsoft": "Information"
}
}
In this context, what is the purpose of Override? The System and Microsoft entries don't have a parent setting in the MinimumLevel node, so what is it overriding?
Unless I am completely misunderstanding the purpose of Override.
By default, you're saying any log entry that is severity "Debug" or higher should be sent to your sink(s) (console, file, etc).
This is similar behavior to Microsoft's document on logging:
For example, logging configuration is commonly provided by the Logging section of app settings files. The following example shows the contents of a typical appsettings.Development.json file:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
},
"Console": {
"IncludeScopes": true
}
}
}
[...]
The LogLevel property under Logging specifies the minimum level to log for selected categories. In the example, System and Microsoft categories log at Information level, and all others log at Debug level.
The override section is for changing that minimum log level for types of a given namespace. In your example that means that a log from a System.* or Microsoft.* namespace must be Information or higher to be shown.
Normally you'd want to see Debug log entries for your code, but a higher level (like Information or Warning) for "not your code", like Microsoft and System.
Instead of putting this configuration in a configuation file you could also use code:
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog((ctx, cfg) =>
{
cfg.ReadFrom.Configuration(ctx.Configuration)
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information);
})
.Build();
Code from kimsereyblog.blogspot.com
Their explanation for the process is:
From the example we saw that we can configure a default minimum level of logging .MinimumLevel.Debug(). We can also override that default for certain namespaces, for example here we set the minimum level of logging for Microsoft namespace to Information. This will prevent ASP.NET Core to log all debug logs while keeping our own debug logs.
Another explanation, from nblumhardt.com:
The first argument of Override is a source context prefix, which is normally matched against the namespace-qualified type name of the class associated with the logger.
...
The effect of the configuration above, then, is to generate events only at or above the Warning level when the logger is owned by a type in a Microsoft.* namespace.

Categories