在Avalonia中集成Serilog需先安装Serilog及相关Sink包,再于AppBuilder中注册ILogger服务,并在ViewModel等类中构造注入使用;注意日志目录创建、级别过滤及关闭时调用CloseAndFlush。

在 Avalonia 应用中集成 Serilog 记录日志,核心是将 Serilog 初始化并注入到 Avalonia 的依赖注入容器中,同时确保日志能正确输出到文件、控制台或其它目标。下面分几步说明怎么稳妥集成。
安装必要 NuGet 包
你需要至少以下三个包(以 .NET 6/7/8 和 Avalonia 11+ 为例):
- Serilog(基础库)
- Serilog.Sinks.Console(控制台输出)
-
Serilog.Sinks.File(文件输出,推荐用
Serilog.Sinks.Async包裹提升性能)
可通过包管理器命令安装:
Install-Package SerilogInstall-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
});
}
在 ViewModel 或窗口中使用 ILogger
只要类是通过 Avalonia DI 创建的(如通过 DataContext 绑定的 ViewModel),就可以直接在构造函数中注入 ILogger:
{
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 一样简洁。










