using Microsoft.Extensions.Logging; using StellaOps.Plugin.Abstractions.Context; namespace StellaOps.Plugin.Host.Context; /// /// Default implementation of IPluginLogger that wraps a Microsoft.Extensions.Logging logger. /// public sealed class PluginLogger : IPluginLogger { private readonly ILogger _logger; private readonly string _pluginId; private readonly Dictionary _properties; /// /// Creates a new plugin logger. /// /// The underlying logger. /// The plugin ID for context. public PluginLogger(ILogger logger, string pluginId) : this(logger, pluginId, new Dictionary()) { } private PluginLogger(ILogger logger, string pluginId, Dictionary properties) { _logger = logger; _pluginId = pluginId; _properties = properties; } /// public void Log(LogLevel level, string message, params object[] args) { _logger.Log(level, message, args); } /// public void Log(LogLevel level, Exception exception, string message, params object[] args) { _logger.Log(level, exception, message, args); } /// public IPluginLogger WithProperty(string name, object value) { var newProperties = new Dictionary(_properties) { [name] = value }; // Create a logger that includes the property in scope return new PropertyScopedPluginLogger(_logger, _pluginId, newProperties); } /// public IPluginLogger ForOperation(string operationName) { return WithProperty("Operation", operationName); } /// public bool IsEnabled(LogLevel level) => _logger.IsEnabled(level); /// /// Plugin logger with property scope support. /// private sealed class PropertyScopedPluginLogger : IPluginLogger { private readonly ILogger _logger; private readonly string _pluginId; private readonly Dictionary _properties; public PropertyScopedPluginLogger( ILogger logger, string pluginId, Dictionary properties) { _logger = logger; _pluginId = pluginId; _properties = properties; } public void Log(LogLevel level, string message, params object[] args) { using var scope = _logger.BeginScope(_properties); _logger.Log(level, message, args); } public void Log(LogLevel level, Exception exception, string message, params object[] args) { using var scope = _logger.BeginScope(_properties); _logger.Log(level, exception, message, args); } public IPluginLogger WithProperty(string name, object value) { var newProperties = new Dictionary(_properties) { [name] = value }; return new PropertyScopedPluginLogger(_logger, _pluginId, newProperties); } public IPluginLogger ForOperation(string operationName) { return WithProperty("Operation", operationName); } public bool IsEnabled(LogLevel level) => _logger.IsEnabled(level); } }