将跟踪输出重定向到控制台

Posted

技术标签:

【中文标题】将跟踪输出重定向到控制台【英文标题】:Redirect Trace output to Console 【发布时间】:2021-12-12 18:08:17 【问题描述】:

假设我正在 VB.Net 中开发一个小型批处理控制台应用程序。我希望能够像这样构建应用程序:

Sub WorkerMethod()
   'Do some work
   Trace.WriteLine("Work progress")

   'Do more work
   Trace.WriteLine("Another progress update")

   '...
End Sub


Sub Main()

   'Do any setup, like confirm the user wants to continue or whatever

   WorkerMethod()     

End Sub

请注意,我使用Trace 而不是Console 作为我的输出。这是因为工作方法可能从其他地方调用,甚至存在于不同的程序集中,我希望能够将不同的跟踪侦听器附加到它。那么如何将控制台连接到跟踪?

我已经可以通过定义一个简单的类(如下所示)并将一个实例添加到 Trace 的 listeners 集合中来做到这一点,但我想知道是否有更可接受或内置的方法来完成此操作:

Public Class ConsoleTrace
    Inherits Diagnostics.TraceListener

    Public Overloads Overrides Sub Write(ByVal message As String)
        Console.Write(message)
    End Sub

    Public Overloads Overrides Sub WriteLine(ByVal message As String)
        Console.WriteLine(message)
    End Sub
End Class

【问题讨论】:

【参考方案1】:

您可以将以下内容添加到您的 exe 的 .config 文件中。

<?xml version="1.0"?>
<configuration>
    <system.diagnostics>
        <trace autoflush="true">
            <listeners>
                <add name="logListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="cat.log" />
                <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

我还包括了 TextWriter,以防您有兴趣登录到文件。

【讨论】:

赞成将我指向 System.Diagnostics.ConsoleTraceListner。我不知何故错过了。否则我没有 app.config,但我可以很容易地在代码中设置它。 这对于具有配置的 .exe 非常有效,但我也有类似的情况,但使用的是 DLL。我不想修改调用 exe 的 .config 文件(它是 nunit-console.exe)。我会继续寻找,但无论如何我还是给你投了赞成票,因为我确实学到了一些东西。【参考方案2】:

乔尔,

您可以这样做而不是应用配置方法:

Trace.Listeners.Add(new ConsoleTraceListener());

或者,如果您想在应用程序的生命周期内管理添加或删除侦听器:

ConsoleTraceListener listener = new ConsoleTraceListener();
Trace.Listeners.Add(listener);

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();

【讨论】:

【参考方案3】:

很好的解决方案,但我有一种情况,我有不同的 dll 由同一个调用 exe 运行,所以我不想修改调用 exe 的 .config 文件。我希望每个 dll 处理它自己对跟踪输出的更改。

很简单:

Stream outResultsFile = File.Create ("output.txt");
var textListener = new TextWriterTraceListener (outResultsFile);
Trace.Listeners.Add (textListener);

当然,这会将 Trace 输出输出到“output.txt”文件。

【讨论】:

我知道这是一篇旧帖子。但我有一个问题。你能看看我的帖子吗:***.com/questions/5568630/…。我正在做同样的事情,但使用 Debug,我没有得到任何结果,即输出文件为空。有什么想法吗?

以上是关于将跟踪输出重定向到控制台的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将 Java 程序控制台输出重定向到多个文件?

markdown 将所有控制台输出重定向到文件

如何将控制台输出重定向到文本文件

JavaFX:将控制台输出重定向到在 SceneBuilder 中创建的 TextArea

将 Visual C++ 控制台输出复制(不重定向)到文本文件,同时仍在控制台窗口中查看输出

将命令提示符输出重定向到 Visual Studio 2012 中的输出窗口