Files
UnrealEngine/Engine/Source/Programs/Shared/EpicGames.Core/ILoggerProperty.cs
2025-05-18 13:04:45 +08:00

80 lines
2.4 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
namespace EpicGames.Core
{
/// <summary>
/// Extension methods for more convenient attaching of properties to log messages
/// </summary>
public static class LoggerPropertyExtensions
{
/// <summary>
/// Builder struct for attaching properties to log messages
/// Wraps and disposes log scope.
/// </summary>
public readonly struct LogScopedPropertyBuilder
{
private readonly Dictionary<string, object> _properties;
private readonly ILogger _logger;
/// <summary>
/// Constructor
/// </summary>
/// <param name="logger">Logger to wrap</param>
public LogScopedPropertyBuilder(ILogger logger)
{
_properties = [];
_logger = logger;
}
/// <summary>
/// Set a key/value property for current log scope
/// </summary>
/// <param name="key">Arbitrary key</param>
/// <param name="value">Arbitrary value</param>
/// <returns></returns>
public LogScopedPropertyBuilder WithProperty(string key, object value)
{
_properties[key] = value;
return this;
}
/// <summary>
/// Starts new scope on underlying logger, passing previously set properties
/// </summary>
/// <returns>Original IDisposable from ILogger.BeginScope()</returns>
public IDisposable? BeginScope()
{
return _logger.BeginScope(_properties);
}
}
/// <summary>
/// Creates a new log scope and attaches a key/value property
/// Additional properties can be added with <see cref="LogScopedPropertyBuilder.WithProperty" />.
/// </summary>
/// <param name="logger">Logger to use</param>
/// <param name="key">Arbitrary key</param>
/// <param name="value">Arbitrary value</param>
/// <returns>A disposable log property builder that wraps the original ILogger scope</returns>
/// <example>
/// Simple example of attaching two properties
/// <code>
/// using (_logger.WithProperty("stream", "ue5").WithProperty("os", "windows").BuildScope())
/// {
/// _logger.LogInformation("A log message with properties attached");
/// }
/// </code>
/// </example>
public static LogScopedPropertyBuilder WithProperty(this ILogger logger, string key, object value)
{
LogScopedPropertyBuilder builder = new LogScopedPropertyBuilder(logger);
builder.WithProperty(key, value);
return builder;
}
}
}