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);
}
}