Skip to content

Logging 包使用说明

概述

Logging 包提供了灵活的日志系统,支持多级别日志记录。默认日志级别为 Info,确保框架的关键操作都能被记录下来。

核心接口

ILogger

日志记录器接口,定义了日志记录的基本功能。

核心方法:

csharp
// 日志级别检查
bool IsTraceEnabled();
bool IsDebugEnabled();
bool IsInfoEnabled();
bool IsWarnEnabled();
bool IsErrorEnabled();
bool IsFatalEnabled();

// 记录日志
void Trace(string msg);
void Trace(string format, object arg);
void Trace(string format, object arg1, object arg2);
void Trace(string format, params object[] arguments);
void Trace(string msg, Exception t);

void Debug(string msg);
void Debug(string format, object arg);
void Debug(string format, object arg1, object arg2);
void Debug(string format, params object[] arguments);
void Debug(string msg, Exception t);

void Info(string msg);
void Info(string format, object arg);
void Info(string format, object arg1, object arg2);
void Info(string format, params object[] arguments);
void Info(string msg, Exception t);

void Warn(string msg);
void Warn(string format, object arg);
void Warn(string format, object arg1, object arg2);
void Warn(string format, params object[] arguments);
void Warn(string msg, Exception t);

void Error(string msg);
void Error(string format, object arg);
void Error(string format, object arg1, object arg2);
void Error(string format, params object[] arguments);
void Error(string msg, Exception t);

void Fatal(string msg);
void Fatal(string format, object arg);
void Fatal(string format, object arg1, object arg2);
void Fatal(string format, params object[] arguments);
void Fatal(string msg, Exception t);

// 获取日志器名称
string Name();

ILoggerFactory

日志工厂接口,用于创建日志记录器实例。

核心方法:

csharp
ILogger GetLogger(string name, LogLevel minLevel = LogLevel.Info);

ILoggerFactoryProvider

日志工厂提供程序接口,用于获取日志工厂。

核心方法:

csharp
ILoggerFactory GetLoggerFactory();
ILogger CreateLogger(string name);

LogLevel

日志级别枚举。

csharp
public enum LogLevel
{
    Trace = 0,   // 最详细的跟踪信息
    Debug = 1,   // 调试信息
    Info = 2,    // 一般信息(默认级别)
    Warning = 3, // 警告信息
    Error = 4,   // 错误信息
    Fatal = 5    // 致命错误
}

核心类

AbstractLogger

抽象日志基类,封装了日志级别判断、格式化与异常处理逻辑。平台日志器只需实现 Write 方法即可。

使用示例:

csharp
public class CustomLogger : AbstractLogger
{
    public CustomLogger(string? name = null, LogLevel minLevel = LogLevel.Info) 
        : base(name, minLevel)
    {
    }

    protected override void Write(LogLevel level, string message, Exception? exception)
    {
        // 自定义日志输出逻辑
        var logMessage = $"[{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss}] [{level}] {message}";
        if (exception != null)
            logMessage += $"\n{exception}";
        
        Console.WriteLine(logMessage);
    }
}

ConsoleLogger

控制台日志记录器实现,支持彩色输出。

使用示例:

csharp
// 创建控制台日志记录器
var logger = new ConsoleLogger("MyLogger", LogLevel.Debug);

// 记录不同级别的日志
logger.Info("应用程序启动");
logger.Debug("调试信息");
logger.Warn("警告信息");
logger.Error("错误信息");
logger.Fatal("致命错误");

输出格式:

[2025-01-09 01:40:00.000] INFO     [MyLogger] 应用程序启动
[2025-01-09 01:40:01.000] DEBUG    [MyLogger] 调试信息
[2025-01-09 01:40:02.000] WARN     [MyLogger] 警告信息

日志级别颜色:

  • Trace: 深灰色
  • Debug: 青色
  • Info: 白色
  • Warning: 黄色
  • Error: 红色
  • Fatal: 洋红色

构造函数参数:

  • name:日志器名称,默认为 "ROOT"
  • minLevel:最低日志级别,默认为 LogLevel.Info
  • writer:TextWriter 输出流,默认为 Console.Out
  • useColors:是否使用颜色,默认为 true(仅在输出到控制台时生效)

ConsoleLoggerFactory

控制台日志工厂,用于创建控制台日志记录器实例。

使用示例:

csharp
var factory = new ConsoleLoggerFactory();
var logger = factory.GetLogger("MyModule", LogLevel.Debug);
logger.Info("日志记录器创建成功");

ConsoleLoggerFactoryProvider

控制台日志工厂提供程序实现。

使用示例:

csharp
var provider = new ConsoleLoggerFactoryProvider();
provider.MinLevel = LogLevel.Debug;  // 设置最低日志级别
var logger = provider.CreateLogger("MyApp");
logger.Info("应用程序启动");

LoggerFactoryResolver

日志工厂提供程序解析器,用于管理和提供日志工厂提供程序实例。

使用示例:

csharp
// 设置日志工厂提供程序
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();

// 设置最小日志级别
LoggerFactoryResolver.MinLevel = LogLevel.Debug;

// 获取日志记录器
var logger = LoggerFactoryResolver.Provider.CreateLogger("MyApp");
logger.Info("应用程序启动");

在架构中使用日志

1. 在 Architecture 中使用

csharp
public class GameArchitecture : Architecture
{
    protected override void Init()
    {
        var logger = LoggerFactoryResolver.Provider.CreateLogger("GameArchitecture");
        logger.Info("游戏架构初始化开始");

        RegisterModel(new PlayerModel());
        RegisterSystem(new GameSystem());

        logger.Info("游戏架构初始化完成");
    }
}

2. 在 System 中使用

csharp
public class CombatSystem : AbstractSystem
{
    protected override void OnInit()
    {
        var logger = LoggerFactoryResolver.Provider.CreateLogger("CombatSystem");
        logger.Info("战斗系统初始化完成");
    }
    
    protected override void OnDestroy()
    {
        var logger = LoggerFactoryResolver.Provider.CreateLogger("CombatSystem");
        logger.Info("战斗系统已销毁");
    }
}

3. 在 Model 中使用

csharp
public class PlayerModel : AbstractModel
{
    protected override void OnInit()
    {
        var logger = LoggerFactoryResolver.Provider.CreateLogger("PlayerModel");
        logger.Info("玩家模型初始化完成");
    }
}

4. 自定义日志级别

public class DebugLogger : AbstractLogger
{
    public DebugLogger() : base("Debug", LogLevel.Debug)
    {
    }

    protected override void Write(LogLevel level, string message, Exception? exception)
    {
        // 只输出调试及更高级别的日志
        if (level >= LogLevel.Debug)
        {
            Console.WriteLine($"[{level}] {message}");
            if (exception != null)
                Console.WriteLine(exception);
        }
    }
}

日志级别说明

级别说明使用场景
Trace最详细的跟踪信息调试复杂的执行流程,记录函数调用等
Debug调试信息开发阶段,记录变量值、流程分支等
Info一般信息记录重要的业务流程和系统状态
Warning警告信息可能的问题但不中断程序执行
Error错误信息影响功能但不致命的问题
Fatal致命错误导致程序无法继续运行的严重错误

最佳实践

  1. 使用合适的日志级别

    • 使用 Info 记录重要业务流程
    • 使用 Debug 记录调试信息
    • 使用 Warning 记录异常情况
    • 使用 Error 记录错误但不影响程序运行
    • 使用 Fatal 记录严重错误
  2. 提供上下文信息

    csharp
    logger.Info($"用户登录成功: UserId={userId}, UserName={userName}");
  3. 异常日志记录

    csharp
    try 
    {
        // 业务逻辑
    }
    catch (Exception ex)
    {
        logger.Error("数据库操作失败", ex);
    }
  4. 分类使用日志

    csharp
    var dbLogger = LoggerFactoryResolver.Provider.CreateLogger("Database");
    var netLogger = LoggerFactoryResolver.Provider.CreateLogger("Network");
    
    dbLogger.Info("查询用户数据");
    netLogger.Debug("发送HTTP请求");
  5. 在框架组件中合理使用日志

    csharp
    // 在系统初始化时记录
    var logger = LoggerFactoryResolver.Provider.CreateLogger("System");
    logger.Info("系统初始化完成");

注意事项

  1. 日志级别检查

    • 每个日志方法都会自动检查日志级别
    • 如果当前级别低于最小级别,不会输出日志
  2. 格式化参数

    • 支持字符串格式化参数
    • 支持异常信息传递
  3. ConsoleLogger 的额外参数

    • ConsoleLogger 现在支持自定义TextWriter输出流
    • 支持禁用颜色输出的功能(useColors参数)

相关包

  • architecture - 架构核心,使用日志系统记录生命周期事件
  • property - 可绑定属性基于事件系统实现
  • extensions - 提供便捷的扩展方法

许可证: Apache 2.0

基于 Apache 2.0 许可证发布