c# - WPF项目中的Serilog
问题描述
我正在 VS 2019 中开发 WPF .Net 项目,而不是 .Net Core。我想记录异常。我对此有一些疑问:
- 我可以将 Serilog 添加到那种应用程序中吗?
- 我需要选择安装什么 Serilog 包?在 NuGet Packager Manager 的 VS 中,我发现了一堆 Serilog 包。
- 那是多层架构项目。Sirelog 必须安装在哪一层?在数据层还是 UI 层?
- 如何设置、配置和使用 Serilog?
- 如何全局配置 Serilog 以捕获异常并将它们从任何形式的解决方案记录到文件或数据库?
我将不胜感激详细的解释和示例。
谢谢
解决方案
我可以将 Serilog 添加到那种应用程序中吗?
我想你的意思是问“我可以将 Serilog 添加到 WPF 项目中吗?” 答案是“是”。
我需要选择安装什么 Serilog 包?在 NuGet Packager Manager 的 VS 中,我发现了一堆 Serilog 包。
阅读文档。每个软件包都有特定的用途,它们 相应的 自述 文件会让您知道您是否需要它们。
那是多层架构项目。Serilog 必须安装在哪一层?在数据层还是 UI 层?
“多层架构项目”不是一个描述性的术语:每个写得很好的非平凡项目都有层。
Serilog 支持不同风格的用例:
在我看来和(据我所知)Serilog 维护者的意见中,最好的风格是使用
serilog-extensions-logging
:- 首先,在您的应用程序中使用 DI 容器(即
Microsoft.Extensions.DependencyInjection
- 您可以使用其他容器,但如果您是 DI 新手,那么您应该使用Microsoft.Extensions.DependencyInjection
)。 - 然后将 NuGet 包引用添加到
Microsoft.Extensions.Logging
和Microsoft.Extensions.Logging.Abstractions
。 - 然后将 NuGet 包引用添加到
Serilog
和Serilog.Extensions.Logging
- 这使您可以使用 Serilog 作为Microsoft.Extensions.Logging
. 您应该避免在应用程序代码中直接使用 Serilog,而是通过执行所有日志记录Microsoft.Extensions.Logging.ILogger
(不要与 Serilog 混淆Serilog.ILogger
!)。 - 有关如何使用的更多详细信息,
serilog-extensions-logging
请阅读他们的文档。请注意,虽然很多文档都提到了 .NET Core,但事实上您可以将它与 .NET Framework 4.7.2 项目一起使用,只要您有Microsoft.Extensions.DependencyInjection
和Microsoft.Extensions.Logging
包工作。
- 首先,在您的应用程序中使用 DI 容器(即
但 Serilog 还支持其全局静态
Serilog.Logger.Log
对象属性,该属性允许来自任何地方的任何代码记录数据。- 但是您应该避免使用这种方法,因为它会使您的代码更难测试。还要小心将此方法与执行同步 IO 的日志记录后端一起使用,因为高频日志记录会大大降低您的应用程序的速度。
如何设置、配置和使用 Serilog?
阅读文档!
如何全局配置 Serilog 以捕获异常并将它们从任何形式的解决方案记录到文件或数据库?
这取决于您的应用程序的项目平台。Serilog确实有 NuGet 包,可以为特定平台设置全局异常日志记录,但在我看来,你不应该只让 Serilog 为你处理这些,什么都不做。仅仅因为 Serilog 将记录未捕获的异常并不意味着您不应该自己采取行动。
也就是说,特别是在 WPF 中,您需要处理两个事件:
AppDomain.UnhandledException
- 这实际上适用于所有 .NET 项目,而不仅仅是 WPF。
Application.DispatcherUnhandledException
.- 这是特定于 WPF 的。这是大多数(但不是全部)在 WPF 触发的事件处理程序(以及模型绑定?)中抛出的未捕获异常将被捕获的地方。
请注意,WPF 有很多关于非致命错误和警告的运行时报告(例如 View-Model Binding 的问题,根据您的应用程序的设计,这可能会或可能不会异常),在这种情况下,您需要实现TraceListener
并记录任何对 Serilog 自己来说值得注意的东西。
推荐阅读
- ios - 在xcode中显示/隐藏视图而不留空间
- docker - 在 Hydra OAuth 2.0 集成期间面临错误:“客户端身份验证失败”
- c# - C# Xml 可序列化枚举类型
- kubernetes - 在 Kubernetes 的多主节点中安装 Istio
- javascript - 1个函数+多个参数//多个函数+1个函数参数JAVASCRIPT
- swift - 如何调整集合视图单元格的大小
- c++ - 成员函数指针值类别的模板特化
- android - Exoplayer 2 - 如何在没有 uri 但有字符串的情况下显示字幕?
- c++ - 初始化私有静态复合 constexpr 值
- keras - Keras fit_generator raise 你必须在使用它之前编译你的模型错误