Monday, May 21, 2012
 
The best way to analyze your logs! Minimize
 Log4Net Mail archive   

The Log4Net mailing list is a great source of information about using log4Net, in this forum we collect all the messages in the log4net user list and some selected threads from the developer list.

Subject: Problem using a ConsoleAppender in a Windows Form application
Prev Next
You are not authorized to post a reply.

Author Messages
Michael SALOMON

06/26/2009 3:21 PM  
Hi !

I'm using log4net 1.2.10.0 and .NET 2.0

I wrote a Windows Form application and I want to be able to log debug messages in a ColoredConsoleAppender (or whatever type of Console appender).

If I compile my application as a Console Application, this works fine... If I compile it as a Windows Forms application, then I understand that no console is attached to my application, fair enough..

In this case I programmaticaly attach a brand new console by using this piece of code :

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

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

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool AttachConsole(int dwProcessId);

        public static void SetConsole()
        {
            foreach (log4net.Appender.IAppender appender in log4net.LogManager.GetRepository().GetAppenders())
            {
                System.Type type = appender.GetType();

                if ((type == typeof(log4net.Appender.ColoredConsoleAppender))
                    || (type == typeof(log4net.Appender.ConsoleAppender)))
                {
                    if (AllocConsole())
                        AttachConsole(-1);

                    return;
                }
            }

So at startup, if any console appender is found, I attach a console...

At this stage, I can do things like : Console.WriteLine() , and it works very fine, I can see the messages in my new console...

But for some reason, the Console Appenders do not forward their messages to this console...

Do I miss something or do something wrong ?

I tried to create a custom appender that inherits ConsoleAppender and do something like:

protected override void Append (LoggingEvent loggingEvent)
{
    Console.WriteLine (RenderLoggingEvent(loggingEvent);
}

This works fine with my attached console, but I loose all the nice colored features... And fact is I do want them :)

Thanks a lot for your help

Michael
Radovan Raszka

06/26/2009 3:44 PM  
Hello,
try to allocate your console _before_ log4net is configured.
Radovan
Michael SALOMON

06/26/2009 4:28 PM  
thx for your answer ! i'll try that but then I need to change my approach.

Originally I wanted to attach a console depending on log4net config, so now i will try to detach the console depending on the config ;)

I don't mind doing that

I'll let you know if it works.

Michael SALOMON

06/26/2009 7:18 PM  
Well, I tried this and it still does not work:


            if (AllocConsole())
                AttachConsole(-1);

            // this file exists....
            XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("./Log4Net.config"));

           LogManager.GetLogger("DebugLogger").Debug("message");

My config file:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="DebugConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    <threshold value="ALL"/>
    <mapping>
      <level value="FATAL" />
      <foreColor value="White" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <mapping>
      <level value="ERROR" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <mapping>
      <level value="WARN" />
      <backColor value="Yellow, HighIntensity" />
    </mapping>
    <mapping>
      <level value="DEBUG" />
      <backColor value="Green" />
    </mapping>
    <mapping>
      <level value="INFO" />
      <foreColor value="White" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%ndc %date %-4timestamp %-5level - %message %newline%exception " />
    </layout>
  </appender>

  <root>
    <level value="ALL" />
  </root>

  <logger name="DebugLogger">
    <level value="ALL"/>
    <appender-ref ref="DebugConsoleAppender"/>
  </logger>

</log4net>


Thanks for your help !

Michael
Ron Grabowski

06/27/2009 1:48 AM  
ColoredConsoleAppender calls Console.OpenStandardOutput() in ActivateOptions to store a Stream that represents the console. When you create a console in a WinForm app you need to call ActivateOptions again so the internal Stream can be re-initialized:

public partial class Form1 : Form
{
    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool AllocConsole();

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);

    public Form1()
    {
        InitializeComponent();

        var appender = new ColoredConsoleAppender();
        var mapping = new ColoredConsoleAppender.LevelColors
        {
            Level = Level.Debug,
            ForeColor = ColoredConsoleAppender.Colors.Red,
            BackColor = ColoredConsoleAppender.Colors.Blue
        };
        appender.AddMapping(mapping);
        appender.ActivateOptions();
        appender.Layout = new SimpleLayout();
        BasicConfigurator.Configure(appender);

        SetConsole();

        ILog log = LogManager.GetLogger(typeof(Form1));
        log.Debug("Hello World");
    }

    public static void SetConsole()
    {
        foreach (IAppender appender in LogManager.GetRepository().GetAppenders())
        {
            var coloredConsole = appender as ColoredConsoleAppender;

            if (coloredConsole != null)
            {
                if (AllocConsole())
                {
                    AttachConsole(-1);
                    coloredConsole.ActivateOptions();
                }

                return;
            }
        }
    }
}
 
Ron Grabowski

06/27/2009 2:06 AM  
This works for me:

public partial class Form1 : Form
{
    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool AllocConsole();

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);

    public Form1()
    {
        InitializeComponent();

        if (AllocConsole())
            AttachConsole(-1);

        var appender = new ColoredConsoleAppender();
        var mapping = new ColoredConsoleAppender.LevelColors
        {
            Level = Level.Debug,
            ForeColor = ColoredConsoleAppender.Colors.Red,
            BackColor = ColoredConsoleAppender.Colors.Blue
        };
        appender.AddMapping(mapping);
        appender.ActivateOptions();
        appender.Layout = new SimpleLayout();
        BasicConfigurator.Configure(appender);

        ILog log = LogManager.GetLogger(typeof(Form1));
        log.Debug("Hello World");
    }
}
 
Michael SALOMON

06/30/2009 3:21 PM  
Hi !!

I truely apologize for this late answer!

This works great for me !! Thanks so much for your help, log4net definitely rocks !

Regards

michael
You are not authorized to post a reply.
Forums > Log4Net > Log4Net Mail archive > Problem using a ConsoleAppender in a Windows Form application



ActiveForums 3.7

 

 

 

 

 

 

 

 

Log4Net Dashboard

Log analysis and monitoring made easy!

Log4Net Dashboard is a log viewer that can read log statements from a variety of logging output targets.

You can download a free developer version.

  

Check it out!

On the demonstration site you can try it  with live data.demo.l4ndash.com - Try Log4Net Dashboard with live data

The mail archive is a copy of all the mail sent to the mail address: log4net-user@logging.apache.org, organized as a forum.

If you would like to participate in the mail list, send a mail to log4net-user-subscribe@logging.apache.org.

More information about the mailing list is available on: http://logging.apache.org/log4net/support.html

 

A complete topic list is available and can be viewed here (warning, it takes some time to load)

 

Copyright 2005-2008 by FaktNet AS Terms Of Use Privacy Statement