将控制台appender添加到log4net中的windows窗体

时间:2013-02-13 21:15:42

标签: c# log4net

是否可以在基于表单的C#应用​​程序中添加控制台? 目前我做的事情是

Console.WriteLine("testing");

它出现在VS2010的输出窗口中。 我想知道是否可以将控制台连接到我的Windows窗体应用程序。所以输出显示在控制台中。

编辑: 看起来我的第一个问题有点误导,并没有明确说明我想要完成的任务。我刚刚使用

为我的应用程序添加了一个控制台
    [DllImport("kernel32")]
    static extern int AllocConsole();

然而,我真正想要的是显示的log4net控制台appender的输出 那个没有发生的控制台。 我的appender的xml是

  <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    <mapping>
      <level value="INFO" />
      <foreColor value="White" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%class %date - %message %newline" />
    </layout>
  </appender>

现在我喜欢

 log.info("Some log");

它仍然不会在新添加的控制台窗口中显示它。关于我如何做到这一点的任何建议?

2 个答案:

答案 0 :(得分:3)

只需将其丢弃,请确保在加载log4net配置之前AllocConsole() 。我尝试做了类似于你的问题的问题,并且在将我的电话转移到AllocConsole之前遇到了同样的问题。一旦我移动它,log4net就会自动写入我分配的控制台。

基本上......(并且记得要执行此处未包括的所有常规错误检查)...

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace SampleApp
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError=true, CallingConvention=CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool AllocConsole();

        [DllImport("kernel32.dll", SetLastError=true, CallingConvention=CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool FreeConsole();

        [STAThread]
        private static void Main(string[] args)
        {
            // (1) Make sure we have a console to use.
            Program.AllocConsole();
            try {
                // (2) Tell log4net to configure itself according to our app.config data.
                log4net.Config.XmlConfigurator.Configure();
                // (3) Usual WinForms startup code here.
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new SampleApp.Form1());
            } catch ( Exception ) {
                // WAT!
            }
            // (4) Remember to release the console before we exit.
            Program.FreeConsole();
        }
    }
}

不是100%肯定为什么它会分配控制台的时间有所不同,但这确实解决了我的问题。

答案 1 :(得分:2)

只需将您的项目设置为控制台应用程序,然后从控制台应用程序创建/显示表单,而不是相反。