C# Avalonia怎么记录程序日志 Avalonia集成Serilog

来源:这里教程网 时间:2026-02-21 17:35:48 作者:

在 Avalonia 应用中集成 Serilog 记录日志,核心是将 Serilog 初始化并注入到 Avalonia 的依赖注入容器中,同时确保日志能正确输出到文件、控制台或其它目标。下面分几步说明怎么稳妥集成。

安装必要 NuGet 包

你需要至少以下三个包(以 .NET 6/7/8 和 Avalonia 11+ 为例):

Serilog(基础库) Serilog.Sinks.Console(控制台输出) Serilog.Sinks.File(文件输出,推荐用
Serilog.Sinks.Async
包裹提升性能)

可通过包管理器命令安装:

Install-Package Serilog
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
Install-Package Serilog.Sinks.Async

在 AppBuilder 中配置 Serilog

Avalonia 启动时通过

AppBuilder
注册服务,Serilog 的
ILogger
需在此阶段初始化并添加进 DI 容器。推荐在
Program.cs
App.xaml.cs
的启动逻辑里做:

示例(Program.cs):

using Serilog;

public static class Program
{
  [STAThread]
  public static void Main(string[] args)
  {
    // 先创建全局 Logger 实例(可选,但方便全局使用)
    Log.Logger = new LoggerConfiguration()
      .MinimumLevel.Debug()
      .WriteTo.Async(a => a.Console())
      .WriteTo.Async(a => a.File("logs/log-.txt", rollingInterval: RollingInterval.Day))
      .CreateLogger();

    BuildAvaloniaApp()
      .StartWithClassicDesktopLifetime(args);
  }

  public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure()
    .UsePlatformDetect()
    .LogToDebug()
    .UseAppHost()
    // 关键:注册 Serilog ILogger,供 ViewModel 等类构造注入
    .ConfigureServices(services =>
    {
      services.AddSingleton(sp => Log.Logger);
    });
}

在 ViewModel 或窗口中使用 ILogger

只要类是通过 Avalonia DI 创建的(如通过

DataContext
绑定的 ViewModel),就可以直接在构造函数中注入
ILogger

public partial class MainWindowViewModel : ViewModelBase
{
  private readonly ILogger _logger;

  public MainWindowViewModel(ILogger logger)
  {
    _logger = logger;
    _logger.Information("MainWindowViewModel 已创建");
  }

  public void OnButtonClick()
  {
    _logger.Warning("用户点击了按钮");
  }
}

补充建议和注意事项

日志路径如
logs/
目录需存在,否则文件写入会失败;可在启动时用
Directory.CreateDirectory("logs")
确保
若想按级别过滤(如 Debug 日志只写文件、Info+ 写控制台),可用
Filter.ByExcluding
或多个
WriteTo
配置不同最小级别
避免在
Log.Logger
初始化前调用日志(比如静态字段初始化里),否则会触发
NullReferenceException
关闭应用前建议调用
Log.CloseAndFlush()
(可在
App.OnFrameworkInitializationCompleted
或主窗口关闭事件中执行)

基本上就这些。Serilog 和 Avalonia 搭配很自然,关键是把 Logger 实例正确注入生命周期,后续使用就跟标准 .NET 一样简洁。

相关推荐