Log4Net:如何将程序内部的日志结果输出到变量中?

Meh*_*rad 3 c# wpf log4net log4net-appender

我正在尝试学习使用Log4Net来改进我的程序中的日志记录技术。我已经阅读了 Log4Net 网站中提供的文档,但是我有这些问题。

这是Log4Net网站上的示例程序中显示的最简单的输出BasicConfigurator.Configure()。

0    [main] INFO  MyApp        - Entering application.
36   [main] DEBUG Com.Foo.Bar  - Did it again!
51   [main] INFO  MyApp        - Exiting application.
Run Code Online (Sandbox Code Playgroud)

我的程序已经有一个窗格(在调试模式下)来显示程序的流程,该流程在多次异步尝试中循环。所以当我运行它时,我可以看到程序的流程(典型的批量调试方法)。

在这个级别,据我所知,通过使用 Log4Net,我可以收集那些时刻的日志,这些日志可以附加到许多不同的输出方法中,例如控制台、外部文件、数据库等。这导致代码加倍. 在每个测试点中,一行用于将日志输出到 UI,另一行用于 Log4Net 的日志记录。

是否有任何方法可以将其中一个附加程序的内容(例如上面显示的附加程序)输出到字符串或类似类型的变量,以便能够在运行时显示它?

我不确定如何在 WPF 应用程序中看到控制台的输出。将Log4Net输出到文件中,然后将它的竞赛打印回字符串似乎很有趣。


更新

当Show output from:下拉菜单设置为“Debug”时,Console Appender可以在Visual Studio的输出窗口中看到 的输出。非常感谢@Aron 指出。

sam*_*amy 5

Log4net 带有UDPAppender,这是将日志内容传输到网络上的任何侦听器的低调方式。我建议使用它作为将日志推送到 UI 的一种方式。

<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
  <remoteAddress value="127.0.0.1" /> <!-- local for the demo on my machine --> 
  <remotePort value="10000" />
  <layout type="log4net.Layout.PatternLayout" value="%-5level %logger [%ndc] - %message%newline" />
</appender>
Run Code Online (Sandbox Code Playgroud)

在 UI 中,将 WPF 应用程序后台线程中的侦听器与这些消息挂钩可让您随心所欲地显示它们,例如作为 x 最新日志上的滑动窗口,或将所有日志推送到您在题。

// launch this in a background thread
private static void UDPListen()
{
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
    var udpClient = new UdpClient(10000);

    while (true)
    {
        var buffer = udpClient.Receive(ref remoteEndPoint);
        var loggingEvent = System.Text.Encoding.Unicode.GetString(buffer);
        // write the log to your pane
    }
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,这是许多用于 log4net 的“仪表板”用于监视应用程序的方法,因此如果您愿意,可以在应用程序的发布版本中删除该窗格,并从网络上的另一台机器查看您的应用程序。


编辑:在任何应用程序中写入控制台都会写入程序的标准输出流,您可以将其通过管道传输到其他进程;例如,启动使用以下语法写入控制台的 wpf 应用程序会将消息记录到 log.txt 文件

myApp.exe > log.txt
Run Code Online (Sandbox Code Playgroud)

(以下示例感谢@Aron)作为一个更有用的示例,Visual Studio 将您附加到的程序的标准输出通过管道传输到其输出窗口,因此发送到 ConsoleAppender 的任何内容都将出现在输出窗口中。

因此,如果您重用程序的默认输出,控制台 appender 会很有用,但没有什么会强迫您使用它。

  • @Mehrad Console appender 非常适合 WPF 应用程序。附加后,Visual Studio 将能够在“控制台”上显示输出,但在正常操作期间,它不执行任何操作。 (2认同)