using System;
using System.Collections.Generic;
namespace GFramework.Core.logging;
///
/// 日志工厂实现,使用LogConfig配置创建日志记录器
///
public class LoggerFactory : ILoggerFactory
{
private readonly LogConfig _config;
private readonly Dictionary _loggers = new();
///
/// 构造函数
///
/// 日志配置
public LoggerFactory(LogConfig config)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
}
///
/// 创建指定类别的日志记录器
///
/// 日志类别
/// 日志记录器实例
public ILog Create(string category)
{
if (_loggers.TryGetValue(category, out var existingLogger))
{
return existingLogger;
}
var logger = CreateLogger(category);
_loggers[category] = logger;
return logger;
}
///
/// 创建全局日志记录器实例
///
/// 全局日志记录器
public ILog CreateGlobalLogger()
{
return Create("Global");
}
private ILog CreateLogger(string category)
{
var level = _config.GetCategoryLevel(category);
var consoleLogger = new ConsoleLogger(category, level, null, _config.UseColors);
if (_config.EnableFile && !string.IsNullOrEmpty(_config.LogFilePath))
{
// 创建一个组合日志记录器,同时输出到控制台和文件
return new CompositeLogger(category, level, consoleLogger, CreateFileLogger(category));
}
return consoleLogger;
}
private ILog CreateFileLogger(string category)
{
try
{
var level = _config.GetCategoryLevel(category);
var directory = System.IO.Path.GetDirectoryName(_config.LogFilePath);
if (!string.IsNullOrEmpty(directory) && !System.IO.Directory.Exists(directory))
{
System.IO.Directory.CreateDirectory(directory);
}
var writer = new System.IO.StreamWriter(_config.LogFilePath!, append: true);
return new ConsoleLogger(category, level, writer, useColors: false);
}
catch
{
return new NullLogger();
}
}
///
/// 组合日志记录器,将日志同时输出到多个目标
///
private class CompositeLogger : ILog
{
private readonly string _category;
private readonly LogLevel _minLevel;
private readonly ILog _consoleLogger;
private readonly ILog _fileLogger;
public CompositeLogger(string category, LogLevel minLevel, ILog consoleLogger, ILog fileLogger)
{
_category = category;
_minLevel = minLevel;
_consoleLogger = consoleLogger;
_fileLogger = fileLogger;
}
public void Log(LogLevel level, string message, Exception? exception = null, object? context = null)
{
if (!IsEnabled(level))
return;
_consoleLogger.Log(level, message, exception, context);
_fileLogger.Log(level, message, exception, context);
}
public bool IsEnabled(LogLevel level) => level >= _minLevel;
// 快捷方法实现
public void Info(string msg, object? ctx = null)
=> Log(LogLevel.Info, msg, null, ctx);
public void Error(string msg, Exception? ex = null, object? ctx = null)
=> Log(LogLevel.Error, msg, ex, ctx);
public void Debug(string msg, object? ctx = null)
=> Log(LogLevel.Debug, msg, null, ctx);
public void Trace(string msg, object? ctx = null)
=> Log(LogLevel.Trace, msg, null, ctx);
public void Warn(string msg, object? ctx = null)
=> Log(LogLevel.Warning, msg, null, ctx);
public void Fatal(string msg, object? ctx = null)
=> Log(LogLevel.Fatal, msg, null, ctx);
}
}