【问题标题】:How to initialize logging in DLL如何在 DLL 中初始化日志记录
【发布时间】:2021-02-12 02:41:34
【问题描述】:

我有一个 DLL,它将在非 .NET 应用程序中使用,因此它似乎不会读取配置文件。
我已经阅读了解决方案,您可以在其中编写自定义解决方案以从 DLL 显式读取配置,但我不知道如何让日志记录组件读取它。
用于登录 System.Diagnostics 的配置页面声称您可以从代码中设置所有内容。我已经找到了如何创建和添加监听器。

    static LogFactory() {
        TextWriterTraceListener myListener = new TextWriterTraceListener("C:\\Logs\\app.log", "myListener");
        Trace.Listeners.Add(myListener);
        myListener.WriteLine("Test message.");
        Trace.WriteLine("Another test");
        myListener.Flush();
    }

文件已创建,但没有任何内容写入其中,无论是来自此显式写入,还是来自任何对登录应用程序的调用。 TRACE 在构建选项中设置。

【问题讨论】:

  • 如何从非.NET 应用程序中使用 DLL?他们将如何沟通?
  • @C.AugustoProiete 不知道为什么这很重要,但作为一个 COM 对象。

标签: c# logging system.diagnostics


【解决方案1】:

从您的问题中不清楚如何从非.NET 应用程序中使用 DLL 以及它们如何相互通信,但理想情况下 DLL 不会有自己的日志......它会写到正在使用它的主应用程序的日志。

这意味着您将设计您的 DLL,以便消费者可以为您提供一种写入其日志的方式(例如,通过传递 DLL 和主机应用程序共同/已知的 ILogger 接口,或至少是某种类型的委托,例如Action<string>),通过商定的引导方法,主机应用程序将调用该方法作为应用程序引导的一部分。

如果您决定在不与主机应用程序合作的情况下为 DLL 单独记录日志,那么您可以尝试使用 ModuleInitializer,这是您可以添加到在程序集运行时运行的 .NET 程序集的特殊功能首次加载。

在撰写本文时,将 ModuleInitializers 添加到程序集的一种简单方法是通过名为 ModuleInit 的 Fody 插件。

至于从您的 DLL 中发出日志(无论上述方法如何),您可能需要考虑 SerilogNLog,与 Trace 相比,它们提供了更丰富的日志记录功能。

【讨论】:

  • 由于您提到的原因,我通常从不使用 Trace。这次我要使用它,因为我使用的 SDK 会记录那里的所有内容,并且我想将所有内容放在一起。但是我现在已经查看了他们的代码以及我真正想要的每条消息,他们记录然后抛出异常。事实证明,无论如何我都会得到它。因此,我将丢弃这些并使用我熟悉的内容。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2020-08-03
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多