-
Notifications
You must be signed in to change notification settings - Fork 6k
Add log buffering docs #46232
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
evgenyfedorov2
merged 29 commits into
dotnet:main
from
evgenyfedorov2:users/evgenyfedorov2/log_buffering_doc
May 24, 2025
+940
−1
Merged
Add log buffering docs #46232
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
5cbf2fc
Add log buffering docs
evgenyfedorov2 41386c4
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 58ab537
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 0ad7cd8
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 e064f67
Update docs/navigate/tools-diagnostics/toc.yml
evgenyfedorov2 0821741
Merge branch 'dotnet:main' into users/evgenyfedorov2/log_buffering_doc
evgenyfedorov2 6e33818
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 f354210
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 42a0f49
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 cb981f5
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 b203e46
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 d5b5338
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 cfaf21a
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 5c4daa2
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 e702606
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 ce617a8
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 2371724
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 f3c9d31
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 851cb23
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 a1520aa
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 3c57ea8
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 21caf96
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 3124a5c
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 31bf222
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 47fe285
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 6544c34
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 1ae0d48
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 f1eba73
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 94055e2
Update docs/core/extensions/log-buffering.md
evgenyfedorov2 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,219 @@ | ||
--- | ||
title: Log buffering | ||
description: Learn how to delay log emission using log buffering in .NET applications. | ||
ms.date: 05/16/2025 | ||
--- | ||
|
||
# Log buffering in .NET | ||
|
||
.NET provides log buffering capabilities that allow you to delay the emission of logs until certain conditions are met. Log buffering is useful in scenarios where you want to: | ||
|
||
- Collect all logs from a specific operation before deciding whether to emit them. | ||
- Prevent logs from being emitted during normal operation, but emit them when errors occur. | ||
- Optimize performance by reducing the number of logs written to storage. | ||
|
||
Buffered logs are stored in temporary circular buffers in process memory, and the following conditions apply: | ||
|
||
- If the buffer is full, the oldest logs will be dropped and never emitted. | ||
- If you want to emit the buffered logs, you can call `Flush()` on the `GlobalLogBuffer` or `PerRequestLogBuffer` class. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- If you never flush buffers, the buffered logs will eventually be dropped as application runs, so it effectively behaves like those logs are disabled. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
There are two buffering strategies available: | ||
|
||
- Global buffering: Buffers logs across the entire application. | ||
- Per-request buffering: Buffers logs for each individual HTTP request if available, otherwise - buffers to the global buffer. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
> [!NOTE] | ||
> Log buffering is available in .NET 9 and later versions. | ||
|
||
Log buffering works with all logging providers. If a logging provider you use does not implement the <xref:Microsoft.Extensions.Logging.Abstractions.IBufferedLogger> interface, log buffering will be calling log methods directly on every single buffered log record when flushing the buffer. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Log buffering extends [filtering capabilities](logging.md#configure-logging-with-code) by allowing you to capture and store logs temporarily. Rather than making an immediate emit-or-discard decision, buffering lets you hold logs in memory and decide later whether to emit them. | ||
|
||
## Get started | ||
|
||
To get started, install the [📦 Microsoft.Extensions.Telemetry](https://www.nuget.org/packages/Microsoft.Extensions.Telemetry) NuGet package for [Global buffering](#global-buffering) | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
and/or install the [📦 Microsoft.AspNetCore.Diagnostics.Middleware](https://www.nuget.org/packages/Microsoft.AspNetCore.Diagnostics.Middleware) NuGet package for [Per-request buffering](#per-request-buffering): | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### [.NET CLI](#tab/dotnet-cli) | ||
|
||
```dotnetcli | ||
dotnet add package Microsoft.Extensions.Telemetry | ||
dotnet add package Microsoft.AspNetCore.Diagnostics.Middleware | ||
``` | ||
|
||
### [PackageReference](#tab/package-reference) | ||
|
||
```xml | ||
<ItemGroup> | ||
<PackageReference Include="Microsoft.Extensions.Telemetry" | ||
Version="*" /> | ||
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.Middleware" | ||
Version="*" /> | ||
</ItemGroup> | ||
``` | ||
|
||
--- | ||
|
||
For more information, see [dotnet add package](../tools/dotnet-package-add.md) or [Manage package dependencies in .NET applications](../tools/dependencies.md). | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Global buffering | ||
|
||
Global buffering allows you to buffer logs across your entire application. You can configure which logs to buffer using filter rules, and then flush the buffer as needed to emit those logs. | ||
|
||
### Simple configuration | ||
|
||
To enable global buffering at or below a specific log level, specify that level: | ||
|
||
:::code language="csharp" source="snippets/logging/log-buffering/global/basic/Program.cs" range="18-19"::: | ||
|
||
The preceding configuration enables buffering logs with level <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> and below. | ||
|
||
### File-based configuration | ||
|
||
Create a configuration section in your _appsettings.json_, for example: | ||
|
||
:::code language="json" source="snippets/logging/log-buffering/global/file-based/appsettings.json" range="1-22" highlight="7-20" ::: | ||
|
||
The preceding configuration: | ||
|
||
- Buffers logs from categories starting with `BufferingDemo` with level <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> and below. | ||
- Buffers all logs with event ID 1001. | ||
- Sets the maximum buffer size to approximately 100 MB. | ||
- Sets the maximum log record size to 50 KB. | ||
- Sets an auto-flush duration of 30 seconds after manual flushing. | ||
|
||
To register the log buffering with the configuration, consider the following code: | ||
|
||
:::code language="csharp" source="snippets/logging/log-buffering/global/file-based/Program.cs" range="21-22"::: | ||
|
||
### Inline code configuration | ||
|
||
:::code language="csharp" source="snippets/logging/log-buffering/global/code-based/Program.cs" range="18-28" ::: | ||
|
||
The preceding configuration: | ||
|
||
- Buffers logs from categories starting with `BufferingDemo` with level <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> and below. | ||
- Buffers all logs with event ID 1001. | ||
- Sets the maximum buffer size to approximately 100 MB. | ||
- Sets the maximum log record size to 50 KB. | ||
- Sets an auto-flush duration of 30 seconds after manual flushing. | ||
|
||
### Flushing the buffer | ||
|
||
To flush the buffered logs, inject the `GlobalLogBuffer` abstract class and call the `Flush()` method: | ||
|
||
:::code language="cs" source="snippets/logging/log-buffering/global/basic/myservice.cs" range="6-22" highlight="5,12" ::: | ||
|
||
## Per-request buffering | ||
|
||
Per-request buffering is specific to ASP.NET Core applications and allows you to buffer logs independently for each HTTP request. The | ||
buffer for each respective request is created when the request starts and disposed when the request ends, so if you don't flush the buffer, the logs will be lost when the request ends. This way, it is useful to only flush buffers when you really need to, such as when an error occurs. | ||
|
||
Per-request buffering is tightly coupled with [global buffering](#global-buffering). If a log entry is supposed to be buffered to a per-request buffer, but there is no active HTTP context at the moment | ||
of buffering attempt, it will be buffered to the global buffer instead. If buffer flush is triggered, the per-request buffer will be flushed first, followed by the global buffer. | ||
|
||
### Simple configuration | ||
|
||
To buffer only logs at or below a specific log level: | ||
|
||
:::code language="cs" source="snippets/logging/log-buffering/per-request/basic/program.cs" range="16" ::: | ||
|
||
### File-based configuration | ||
|
||
Create a configuration section in your _appsettings.json_: | ||
|
||
:::code language="json" source="snippets/logging/log-buffering/per-request/file-based/appsettings.json" range="1-18" highlight="8-16"::: | ||
|
||
The preceding configuration: | ||
|
||
- Buffers logs from categories starting with `PerRequestLogBufferingFileBased.` with level <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> and below. | ||
- Sets an auto-flush duration of 5 seconds after manual flushing. | ||
|
||
To register the log buffering with the configuration, consider the following code:: | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
:::code language="cs" source="snippets/logging/log-buffering/per-request/file-based/program.cs" range="16" ::: | ||
|
||
### Inline code configuration | ||
|
||
:::code language="cs" source="snippets/logging/log-buffering/per-request/code-based/program.cs" range="16-20" ::: | ||
|
||
The preceding configuration: | ||
|
||
- Buffers logs from categories starting with `PerRequestLogBufferingFileBased.` with level <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> and below. | ||
- Sets an auto-flush duration of 5 seconds after manual flushing. | ||
|
||
### Flushing the per-request buffer | ||
|
||
To flush the buffered logs for the current request, inject the `PerRequestLogBuffer` abstract class and call its `Flush()` method: | ||
|
||
:::code language="cs" source="snippets/logging/log-buffering/per-request/basic/homecontroller.cs" range="8-48" highlight="8,11,34" ::: | ||
|
||
> [!NOTE] | ||
> Flushing the per-request buffer will also flush the global buffer. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## How buffering rules are applied | ||
|
||
Log buffering rules evaluation is performed on each log record. The following algorithm is used for each log record: | ||
|
||
1. If a log entry matches any rule, it will be buffered instead of being emitted immediately. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. If a log entry does not match any rule, it will be emitted normally. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. If the buffer size limit is reached, the oldest buffered log entries will be dropped (not emitted!) to make room for new ones. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. If a log entry size is greater than the maximum log record size, it will not be buffered and will be emitted normally. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
For each log record, the algorithm checks: | ||
|
||
- If the log level matches (is equal to or lower than) the rule's log level. | ||
- If the category name starts with the rule's CategoryName prefix. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- If the event ID matches the rule's EventId. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- If the event name matches the rule's EventName. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- If any attributes match the rule's Attributes. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Change buffer filtering rules in a running app | ||
|
||
Both [global buffering](#global-buffering) and [per-request buffering](#per-request-buffering) support runtime configuration updates via the <xref:Microsoft.Extensions.Options.IOptionsMonitor%601> interface. If you're using a configuration provider that supports reloads—such as the [File Configuration Provider](configuration-providers.md#file-configuration-provider)—you can update filtering rules at runtime without restarting the application. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
For example, you can start your application with the following _appsettings.json_, which enables log buffering for logs with the <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> level and category starting with `PerRequestLogBufferingFileBased.`: | ||
|
||
:::code language="json" source="snippets/logging/log-buffering/per-request/file-based/appsettings.json" range="1-19" ::: | ||
|
||
While the app is running, you can update the _appsettings.json_ with the following configuration: | ||
|
||
:::code language="json" source="snippets/logging/log-buffering/per-request/file-based/appsettingsUpdated.json" range="1-17" highlight="9-13" ::: | ||
|
||
The new rules will be applied automatically, for instance, with the preceding configuration, all logs with the <xref:Microsoft.Extensions.Logging.LogLevel.Information?displayProperty=nameWithType> level will be buffered. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
## Performance considerations | ||
|
||
Log buffering offers a trade-off between memory usage and log storage costs. Buffering logs in memory allows you to: | ||
|
||
1. Selectively emit logs based on runtime conditions. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
1. Drop unnecessary logs without writing them to storage. | ||
|
||
However, be mindful of the memory consumption, especially in high-throughput applications. Configure appropriate buffer size limits to prevent excessive memory usage. | ||
|
||
## Best practices | ||
|
||
- Set appropriate buffer size limits based on your application's memory constraints. | ||
- Use per-request buffering for web applications to isolate logs by request. | ||
- Configure auto-flush duration carefully to balance memory usage and log availability. | ||
- Implement explicit flush triggers for important events (errors, warnings, etc.). | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- Monitor buffer memory usage in production to ensure it remains within acceptable limits. | ||
|
||
## Limitations | ||
|
||
- Log buffering is not supported in .NET 8 and earlier versions. | ||
- The order of logs is not guaranteed to be preserved. However, original timestamps are preserved. | ||
- Custom configuration per each logging provider is not supported. Same configuration is used for all providers. | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- Log scopes are not supported. This means that if you use the <xref:Microsoft.Extensions.Logging.ILogger.BeginScope%2A> method, the buffered log records will not be associated with the scope. | ||
- Not all information of the original log record is preserved. Log buffering internally uses <xref:Microsoft.Extensions.Logging.Abstractions.BufferedLogRecord> class when flushing, and its following properties are always empty: | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- <xref:Microsoft.Extensions.Logging.Abstractions.BufferedLogRecord.ActivitySpanId> | ||
- <xref:Microsoft.Extensions.Logging.Abstractions.BufferedLogRecord.ActivityTraceId> | ||
- <xref:Microsoft.Extensions.Logging.Abstractions.BufferedLogRecord.ManagedThreadId> | ||
- <xref:Microsoft.Extensions.Logging.Abstractions.BufferedLogRecord.MessageTemplate> | ||
|
||
## See also | ||
|
||
- [Log Sampling](log-sampling.md) | ||
evgenyfedorov2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- [Logging in .NET](logging.md) | ||
- [High-performance logging in .NET](high-performance-logging.md) |
17 changes: 17 additions & 0 deletions
17
...ore/extensions/snippets/logging/log-buffering/global/basic/GlobalLogBufferingBasic.csproj
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<Description>Demonstrates how to use log buffering feature.</Description> | ||
<OutputType>Exe</OutputType> | ||
<NoWarn>$(NoWarn);EXTEXP0003</NoWarn> | ||
<TargetFrameworks>$(LatestTargetFramework)</TargetFrameworks> | ||
<RootNamespace>GlobalLogBufferingBasic</RootNamespace> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.5" /> | ||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.5" /> | ||
<PackageReference Include="Microsoft.Extensions.Telemetry" Version="9.5.0" /> | ||
</ItemGroup> | ||
|
||
</Project> |
12 changes: 12 additions & 0 deletions
12
docs/core/extensions/snippets/logging/log-buffering/global/basic/Log.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using Microsoft.Extensions.Logging; | ||
|
||
namespace GlobalLogBufferingBasic; | ||
|
||
internal static partial class Log | ||
{ | ||
[LoggerMessage(Level = LogLevel.Error, Message = "ERROR log message in my application. {message}")] | ||
public static partial void ErrorMessage(this ILogger logger, string message); | ||
|
||
[LoggerMessage(Level = LogLevel.Information, Message = "INFORMATION log message in my application.")] | ||
public static partial void InformationMessage(this ILogger logger); | ||
} |
22 changes: 22 additions & 0 deletions
22
docs/core/extensions/snippets/logging/log-buffering/global/basic/MyService.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
using System; | ||
using Microsoft.Extensions.Diagnostics.Buffering; | ||
|
||
namespace GlobalLogBufferingBasic; | ||
|
||
public class MyService | ||
{ | ||
private readonly GlobalLogBuffer _buffer; | ||
|
||
public MyService(GlobalLogBuffer buffer) | ||
{ | ||
_buffer = buffer; | ||
} | ||
|
||
public void HandleException(Exception ex) | ||
{ | ||
_buffer.Flush(); | ||
|
||
// After flushing, log buffering will be temporarily suspended (= all logs will be emitted immediately) | ||
// for the duration specified by AutoFlushDuration. | ||
} | ||
} |
45 changes: 45 additions & 0 deletions
45
docs/core/extensions/snippets/logging/log-buffering/global/basic/Program.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
using System; | ||
using System.Threading.Tasks; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using Microsoft.Extensions.Diagnostics.Buffering; | ||
using Microsoft.Extensions.Hosting; | ||
using Microsoft.Extensions.Logging; | ||
using Log = GlobalLogBufferingBasic.Log; | ||
|
||
var hostBuilder = Host.CreateApplicationBuilder(); | ||
|
||
hostBuilder.Logging.AddSimpleConsole(options => | ||
{ | ||
options.SingleLine = true; | ||
options.TimestampFormat = "hh:mm:ss"; | ||
options.UseUtcTimestamp = true; | ||
}); | ||
|
||
// Add the Global buffer to the logging pipeline. | ||
hostBuilder.Logging.AddGlobalBuffer(LogLevel.Information); | ||
|
||
using var app = hostBuilder.Build(); | ||
|
||
var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>(); | ||
var logger = loggerFactory.CreateLogger("BufferingDemo"); | ||
var buffer = app.Services.GetRequiredService<GlobalLogBuffer>(); | ||
|
||
for (int i = 1; i < 21; i++) | ||
{ | ||
try | ||
{ | ||
Log.InformationMessage(logger); | ||
|
||
if(i % 10 == 0) | ||
{ | ||
throw new Exception("Simulated exception"); | ||
} | ||
} | ||
catch (Exception ex) | ||
{ | ||
Log.ErrorMessage(logger, ex.Message); | ||
buffer.Flush(); | ||
} | ||
|
||
await Task.Delay(1000).ConfigureAwait(false); | ||
} |
17 changes: 17 additions & 0 deletions
17
...sions/snippets/logging/log-buffering/global/code-based/GlobalLogBufferingCodeBased.csproj
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<Description>Demonstrates how to use log buffering feature.</Description> | ||
<OutputType>Exe</OutputType> | ||
<NoWarn>$(NoWarn);EXTEXP0003</NoWarn> | ||
<TargetFrameworks>$(LatestTargetFramework)</TargetFrameworks> | ||
<RootNamespace>GlobalLogBufferingCodeBased</RootNamespace> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.5" /> | ||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.5" /> | ||
<PackageReference Include="Microsoft.Extensions.Telemetry" Version="9.5.0" /> | ||
</ItemGroup> | ||
|
||
</Project> |
12 changes: 12 additions & 0 deletions
12
docs/core/extensions/snippets/logging/log-buffering/global/code-based/Log.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using Microsoft.Extensions.Logging; | ||
|
||
namespace GlobalLogBufferingCodeBased; | ||
|
||
internal static partial class Log | ||
{ | ||
[LoggerMessage(Level = LogLevel.Error, Message = "ERROR log message in my application. {message}")] | ||
public static partial void ErrorMessage(this ILogger logger, string message); | ||
|
||
[LoggerMessage(Level = LogLevel.Information, Message = "INFORMATION log message in my application.")] | ||
public static partial void InformationMessage(this ILogger logger); | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.