using System.IO;
using GFramework.Core.Abstractions.Logging;
namespace GFramework.Core.Logging.Appenders;
///
/// 控制台日志输出器
///
public sealed class ConsoleAppender : ILogAppender, IDisposable
{
private readonly ILogFilter? _filter;
private readonly ILogFormatter _formatter;
private readonly bool _useColors;
private readonly TextWriter _writer;
///
/// 创建控制台日志输出器
///
/// 日志格式化器
/// 文本写入器(默认为 Console.Out)
/// 是否使用颜色(默认为 true)
/// 日志过滤器(可选)
public ConsoleAppender(
ILogFormatter formatter,
TextWriter? writer = null,
bool useColors = true,
ILogFilter? filter = null)
{
_formatter = formatter ?? throw new ArgumentNullException(nameof(formatter));
_writer = writer ?? Console.Out;
_useColors = useColors && _writer == Console.Out;
_filter = filter;
}
///
/// 释放资源
///
public void Dispose()
{
_writer.Flush();
}
///
/// 追加日志条目到控制台
///
/// 日志条目
public void Append(LogEntry entry)
{
if (_filter != null && !_filter.ShouldLog(entry))
return;
var message = _formatter.Format(entry);
if (_useColors)
{
WriteColored(entry.Level, message);
}
else
{
_writer.WriteLine(message);
}
}
///
/// 刷新控制台输出
///
public void Flush()
{
_writer.Flush();
}
private void WriteColored(LogLevel level, string message)
{
var colorCode = GetAnsiColorCode(level);
_writer.WriteLine($"\x1b[{colorCode}m{message}\x1b[0m");
}
private static string GetAnsiColorCode(LogLevel level)
{
return level switch
{
LogLevel.Trace => "90", // 暗灰色
LogLevel.Debug => "36", // 青色
LogLevel.Info => "37", // 白色
LogLevel.Warning => "33", // 黄色
LogLevel.Error => "31", // 红色
LogLevel.Fatal => "35", // 洋红色
_ => "37"
};
}
}