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

C# 将输出窗口重定向到日志文件,c#,.net,C#,.net,当我的应用程序启动时,我看到以下行被写入输出窗口: '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 opt

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

'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()方法。有什么想法吗?

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

这些行是由调试器生成的。调试器可以生成的通知类型记录在中。DLL加载通知与事件6“加载DLL调试事件”相对应。该列表与右键单击输出窗口时在上下文菜单中找到的内容基本一致。“模块加载消息”用于您感兴趣的消息

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


除非编写自己的调试器,否则无法实现此功能。技术上可行,请下载。实际上并非如此。

最接近这一点的方法是处理
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输出窗口完全相同的格式,但它可能是介于两者之间的一个可接受的“中间”窗口。

您使用的是哪个IDE?如何/在哪里使用此自定义
LogWriter
类?@Subhash:当然是Visual StudioThanks,但是我想将这些日志添加到我的应用程序已经存在的日志文件中,并包含一个时间戳。@Robbert,不愉快的答案通常是最令人沮丧的,但有时它们是正确的。不幸的是,要准确地得到你想要的答案,那就是。