使用Avalonia开发时无法查看控制台及日志输出问题
问题根本原因
默认Avalonia MVVM模板生成的项目存在三个默认配置,直接导致日志无法输出到控制台:
- 项目输出类型默认为
WinExe(Windows平台专属配置),进程启动时不会关联控制台会话,所有写入标准输出流的内容(包括Console.WriteLine的输出)没有承载窗口,直接被系统丢弃。非Windows平台虽然没有WinExe的区分,但默认模板没有为Avalonia内置日志系统注册控制台输出接收器,框架日志不会自动写入标准输出。 System.Diagnostics.Debug.WriteLine本身设计为仅向附加的调试器输出内容,直接执行dotnet run不附加调试器时,无论怎么配置都看不到该方法的输出,且该方法仅在Debug编译模式下生效,Release构建会被编译器自动剔除。- 直接调用
Logger.TryGet无输出的核心原因是没有注册对应的日志接收器:Avalonia内置日志系统采用发布订阅模式,只配置日志级别和输出区域、不绑定实际输出目标(控制台、文件、调试器等)时,所有日志事件会被直接丢弃。
配置步骤
按以下顺序修改配置即可正常看到所有日志输出:
- 第一步:修改项目文件开启控制台输出
打开项目根目录下后缀为.csproj的项目配置文件,在<PropertyGroup>节点中添加/修改输出类型配置:
该配置在Windows平台下会让程序复用启动它的终端窗口输出内容,双击启动程序时会自动弹出关联的控制台窗口;非Windows平台无副作用。<OutputType>Exe</OutputType> - 第二步:为Avalonia日志系统注册控制台接收器
打开Program.cs文件,找到BuildAvaloniaApp方法中的AppBuilder链式调用代码,添加控制台日志配置:
配置后Avalonia框架内部日志、你通过using Avalonia; using Avalonia.Logging; public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure<App>() .UsePlatformDetect() // 注册控制台日志,参数依次为:最低输出级别、要输出的日志区域(可按需增删) .LogToConsole(LogEventLevel.Debug, LogArea.Visual, LogArea.Control, LogArea.Property, LogArea.Layout) .UseSkia() .UseReactiveUI(); // MVVM模板默认自带该行,保留即可Logger.TryGet(...)?.Log(...)写法输出的自定义日志,只要级别和区域匹配,都会写入控制台。如果代码中找不到LogToConsole扩展方法,添加对Avalonia.Diagnostics包的项目引用即可。 - 第三步:验证输出
重新执行dotnet run启动项目,你在代码中写入的Console.WriteLine内容、Avalonia框架日志都会正常输出到当前终端。
常见注意事项
日志级别需要两边匹配:如果注册控制台日志时设置的最低级别为
LogEventLevel.Warning,那么调用Logger.TryGet(LogEventLevel.Information, 任意区域)会返回null,对应日志不会输出,自定义日志的级别不能低于注册时配置的最低级别。
如果不想修改项目输出类型,仅在调试时查看日志,可以不用改csproj配置,直接在IDE中启动调试,Debug.WriteLine和通过.LogToTrace()注册的调试日志会直接显示在IDE调试器的输出面板中。
内容的提问来源于stack exchange,提问作者Lime
相关产品推荐
相关产品推荐

