Agent skill

dotnet-source-gen-logging

Converts logging to use the LoggerMessage source generator for high-performance, AOT-compatible logging. Also use when the user mentions "LoggerMessage," "logging source generator," "high-performance logging," "optimize logging," "AOT logging," or "structured logging source gen." For full AOT analysis, see dotnet-aot-analysis.

Stars 0
Forks 0

Install this agent skill to your Project

npx add-skill https://github.com/Im5tu/claude/tree/main/skills/dotnet-source-gen-logging

Metadata

Additional technical details for this skill

author
Im5tu
version
1.0

SKILL.md

Convert existing logging calls to use the LoggerMessage source generator for high-performance, AOT-compatible logging with no boxing overhead and compile-time template parsing.

When to Use

  • Optimizing logging performance in hot paths
  • Preparing for Native AOT deployment
  • Organizing scattered log messages into logical groupings
  • Standardizing EventIds across the codebase

Steps

  1. Find ILogger usages and logging calls

    • Search for ILogger field/parameter declarations
    • Find all logging calls: LogInformation, LogWarning, LogError, LogDebug, LogTrace, LogCritical
    • Note the log message templates and parameters
  2. Organize into logical groupings by domain

    • Group related log messages by their functional area, eg:
      • LoggingValidationExtensions - validation-related logs
      • LoggingAuthenticationExtensions - auth-related logs
      • LoggingDatabaseExtensions - database-related logs
      • LoggingHttpExtensions - HTTP-related logs
      • LoggingCacheExtensions - caching-related logs
      • LoggingMessagingExtensions - messaging/queue-related logs
  3. Create partial static classes with extension methods

    csharp
    public static partial class LoggingValidationExtensions
    {
        [LoggerMessage(
            EventId = 1001,
            Level = LogLevel.Warning,
            Message = "Validation failed for {EntityType}: {Errors}")]
        public static partial void ValidationFailed(
            this ILogger logger, string entityType, string errors);
    }
    
  4. Use EventId ranges per category

    • 1000-1999: Validation
    • 2000-2999: Authentication
    • 3000-3999: Database
    • 4000-4999: HTTP
    • 5000-5999: Cache
    • 6000-6999: Messaging
    • 7000-7999: General/Application
  5. Replace inline logging calls with extension method calls

    • Before: _logger.LogWarning("Validation failed for {entityType}: {errors}", type, errs)
    • After: _logger.ValidationFailed(type, errs)
  6. Verify with build

    bash
    dotnet build
    
  7. If build fails, review errors:

    • Missing using statements for the extension class namespace
    • Parameter type mismatches
    • Duplicate EventIds
  8. Report results:

    • List all created extension classes
    • Show count of converted log messages per category
    • Confirm build status

Key Notes

  • Requires .NET 6+ - the source generator is built into the SDK
  • Avoids boxing - value types are not boxed when passed to the generated methods
  • Template parsed once - message template is parsed at compile time, not runtime
  • Use PascalCase for placeholders - {EntityType} not {entityType} (matching is case-insensitive, but PascalCase is the recommended convention)
  • Extension methods - allows fluent logger.MethodName() syntax
  • Partial classes - required for source generator to emit the implementation

Example Conversion

Before:

csharp
_logger.LogInformation("User {UserId} logged in from {IpAddress}", userId, ip);
_logger.LogWarning("Failed login attempt for {Username}", username);

After:

csharp
// In LoggingAuthenticationExtensions.cs
public static partial class LoggingAuthenticationExtensions
{
    [LoggerMessage(
        EventId = 2001,
        Level = LogLevel.Information,
        Message = "User {UserId} logged in from {IpAddress}")]
    public static partial void UserLoggedIn(
        this ILogger logger, string userId, string ipAddress);

    [LoggerMessage(
        EventId = 2002,
        Level = LogLevel.Warning,
        Message = "Failed login attempt for {Username}")]
    public static partial void FailedLoginAttempt(
        this ILogger logger, string username);
}

// Usage
_logger.UserLoggedIn(userId, ip);
_logger.FailedLoginAttempt(username);

Expand your agent's capabilities with these related and highly-rated skills.

Im5tu/claude

flutter-animations

Comprehensive guide for implementing animations in Flutter. Use when adding motion and visual effects to Flutter apps: implicit animations (AnimatedContainer, AnimatedOpacity, TweenAnimationBuilder), explicit animations (AnimationController, Tween, AnimatedWidget/AnimatedBuilder), hero animations (shared element transitions), staggered animations (sequential/overlapping), and physics-based animations. Includes workflow for choosing the right animation type, implementation patterns, and best practices for performance and user experience.

0 0
Explore
Im5tu/claude

dotnet-source-gen-options-validation

Converts options validation to use the compile-time source generator for AOT-compatible, reflection-free validation. Also use when the user mentions "OptionsValidator," "options validation source gen," "AOT options validation," "compile-time validation," "ValidateDataAnnotations replacement," or "reflection-free validation." For full AOT analysis, see dotnet-aot-analysis.

0 0
Explore
Im5tu/claude

dotnet-enable-testing-platform

Enables the Microsoft Testing Platform runner in global.json. Also use when the user mentions "testing platform," "Microsoft.Testing.Platform," "new test runner," "migrate test runner," "global.json testing," or "modern test platform."

0 0
Explore
Im5tu/claude

dotnet-json-polymorphic

Configures polymorphic JSON serialization with [JsonPolymorphic] and [JsonDerivedType] attributes. Also use when the user mentions "polymorphic JSON," "JsonDerivedType," "JSON inheritance," "type discriminator," "serialize derived types," or "JSON polymorphism." For full JSON source generation, see dotnet-source-gen-json.

0 0
Explore
Im5tu/claude

competitor-alternatives

When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when the user mentions 'alternative page,' 'vs page,' 'competitor comparison,' 'comparison page,' '[Product] vs [Product],' '[Product] alternative,' or 'competitive landing pages.' Covers four formats: singular alternative, plural alternatives, you vs competitor, and competitor vs competitor. Emphasizes deep research, modular content architecture, and varied section types beyond feature tables.

0 0
Explore
Im5tu/claude

flutter-duit-bdui

Integrate Duit framework into Flutter applications including setup, driver configuration, HTTP/WebSocket transports, custom widgets, and themes. Use when integrating backend-driven UI, configuring Duit, or adding Duit to Flutter applications.

0 0
Explore

Didn't find tool you were looking for?

Be as detailed as possible for better results