0

0

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

煙雲

煙雲

发布时间:2025-12-27 12:15:07

|

781人浏览过

|

来源于php中文网

原创

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

c# avalonia怎么记录程序日志 avalonia集成serilog

在 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.csApp.xaml.cs 的启动逻辑里做:

灵云AI开放平台
灵云AI开放平台

灵云AI开放平台

下载

示例(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 一样简洁。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

97

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

464

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

12

2025.12.06

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

411

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

487

2024.05.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 46万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号