Skip to content

Commit bb03775

Browse files
authored
Fix CA1848 documentation: Update link and add code examples (#47579)
1 parent d09f4c0 commit bb03775

File tree

1 file changed

+44
-5
lines changed
  • docs/fundamentals/code-analysis/quality-rules

1 file changed

+44
-5
lines changed

docs/fundamentals/code-analysis/quality-rules/ca1848.md

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: "CA1848: Use the LoggerMessage delegates (code analysis)"
33
description: "Learn about code analysis rule CA1848: Use the LoggerMessage delegates"
4-
ms.date: 01/19/2022
4+
ms.date: 08/04/2025
55
f1_keywords:
66
- "LoggerMessageDefineAnalyzer"
77
- "CA1848"
@@ -26,13 +26,51 @@ Use of [logger extension methods](xref:Microsoft.Extensions.Logging.LoggerExtens
2626

2727
## Rule description
2828

29-
For high-performance logging scenarios, use the <xref:Microsoft.Extensions.Logging.LoggerMessage> pattern.
29+
For high-performance logging scenarios, use the [LoggerMessage](../../../core/extensions/logger-message-generator.md) pattern instead of <xref:Microsoft.Extensions.Logging.Logger`1> extension methods.
3030

3131
## How to fix violations
3232

33-
Use `LoggerMessage` to fix violations of this rule.
33+
Use <xref:Microsoft.Extensions.Logging.LoggerMessageAttribute> to fix violations of this rule. (Or, if you're using .NET 5 or earlier, use the <xref:Microsoft.Extensions.Logging.LoggerMessage> class.)
3434

35-
<xref:Microsoft.Extensions.Logging.LoggerMessage> provides the following performance advantages over Logger extension methods:
35+
```csharp
36+
public class SomethingDoer
37+
{
38+
private readonly ILogger _logger;
39+
public SomethingDoer(ILogger<SomethingDoer> logger)
40+
{
41+
_logger = logger;
42+
}
43+
44+
public void DoSomething()
45+
{
46+
// This call violates CA1848.
47+
_logger.LogInformation("Did something!");
48+
}
49+
}
50+
```
51+
52+
The following code fixes the violation.
53+
54+
```csharp
55+
public partial class SomethingDoer
56+
{
57+
private readonly ILogger _logger;
58+
public SomethingDoer(ILogger<SomethingDoer> logger)
59+
{
60+
_logger = logger;
61+
}
62+
63+
public void DoSomething()
64+
{
65+
Log_DidSomething();
66+
}
67+
68+
[LoggerMessage(Level = LogLevel.Information, Message = "Did something!")]
69+
private partial void Log_DidSomething();
70+
}
71+
```
72+
73+
<xref:Microsoft.Extensions.Logging.LoggerMessage> provides the following performance advantages over <xref:Microsoft.Extensions.Logging.Logger`1> extension methods:
3674

3775
- Logger extension methods require "boxing" (converting) value types, such as `int`, into `object`. The <xref:Microsoft.Extensions.Logging.LoggerMessage> pattern avoids boxing by using static <xref:System.Action> fields and extension methods with strongly typed parameters.
3876
- Logger extension methods must parse the message template (named format string) every time a log message is written. <xref:Microsoft.Extensions.Logging.LoggerMessage> only requires parsing a template once when the message is defined.
@@ -43,5 +81,6 @@ Do not suppress a warning from this rule.
4381

4482
## See also
4583

46-
- [High-performance logging with LoggerMessage in ASP.NET Core](/aspnet/core/fundamentals/logging/loggermessage)
84+
- [Compile-time logging source generation](../../../core/extensions/logger-message-generator.md)
85+
- [High-performance logging in .NET](../../../core/extensions/high-performance-logging.md)
4786
- [Performance rules](performance-warnings.md)

0 commit comments

Comments
 (0)