将输出窗口重定向到日志文件

本文关键字:日志 文件 重定向 输出 窗口 | 更新日期: 2023-09-27 17:51:22

当我的应用程序启动时,我看到以下几行被写入输出窗口:

'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_MSIL'PresentationFramework.Luna'3.0.0.0__31bf3856ad364e35'PresentationFramework.Luna.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_MSIL'PresentationFramework.Aero'3.0.0.0__31bf3856ad364e35'PresentationFramework.Aero.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_MSIL'PresentationFramework.resources'3.0.0.0_nl_31bf3856ad364e35'PresentationFramework.resources.dll'
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_MSIL'System.Data.SqlServerCe'3.5.1.0__89845dcd8080cc91'System.Data.SqlServerCe.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_32'System.Transactions'2.0.0.0__b77a5c561934e089'System.Transactions.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_32'System.EnterpriseServices'2.0.0.0__b03f5f7f11d50a3a'System.EnterpriseServices.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_MSIL'System.Data.resources'2.0.0.0_nl_b77a5c561934e089'System.Data.resources.dll'
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'C:'WINDOWS'assembly'GAC_MSIL'System.Xml.Linq'3.5.0.0__b77a5c561934e089'System.Xml.Linq.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'MyApp.exe' (Managed (v2.0.50727)): Loaded 'Anonymously Hosted DynamicMethods Assembly'

我喜欢将这些行添加到我的日志文件中(并分配时间戳),以进行一些性能测量。我试着用下面我创建的类来做这件事。

public static class ConsoleLogger
{
    public class LogWriter : TextWriter
    {
        public LogWriter()
        {
        }
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }
        public override void Write(string value)
        {
            Logger.Info(value);                
        }
    }
    public static void RedirectConsoleLog()
    {
        Console.SetOut(new LogWriter());
    }
}

但这不起作用。Write()方法永远不会被调用。什么好主意吗?

将输出窗口重定向到日志文件

这些行是由调试器生成的。这篇SDK文章中记录了调试器可以生成的通知类型。DLL加载通知对应于事件6 LOAD_DLL_DEBUG_EVENT。该列表与右键单击Output窗口时在上下文菜单中找到的内容基本一致。"模块加载消息",你感兴趣的。

这有几个含义。首先,只有调试器才能获得这些通知,通常在部署程序后不运行这些通知。Windows中的一个硬性限制是调试器必须是一个单独的进程,程序不能调试自己。您计划中的最后一个问题是,IDE不支持将现在发送到Output窗口的内容重定向到文件中。

你不能使这个工作,除非你编写自己的调试器。从技术上讲,可以下载MDbg样例。几乎没有。

您可以在Visual Studio中使用DebugView或File->SaveoutputAs

最接近的方法是处理AppDomain.AssemblyLoad事件。最简单的例子是:

using System;
namespace ConsoleApplicationN
{
    class Program
    {
        {
            AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(CurrentDomain_AssemblyLoad);
            // You need to *DO* something here to trigger an assembly load
            // For example, open a database connection
        }
        static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
        {
            // This is just an example of how to use what's provided in "args"
            Console.WriteLine(args.LoadedAssembly.FullName);
        }
    }
}

这不会捕捉到你想要的一切,它也不会提供与Visual Studio输出窗口完全相同的格式,但它可能是一个可以接受的"中间",介于两者之间。