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");
    }
}




________________________________
From: Michael SALOMON <michaelsalomo...@gmail.com>
To: Log4NET User <log4net-user@logging.apache.org>
Sent: Friday, June 26, 2009 1:18:49 PM
Subject: Re: Problem using a ConsoleAppender in a Windows Form application

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

2009/6/26 Michael SALOMON <michaelsalomo...@gmail.com>

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.


2009/6/26 Radovan Raszka <ras...@hasam.cz>


Hello,
try to allocate your console _before_ log4net is 
configured.
Radovan

________________________________
 Od: Michael SALOMON 
[mailto:michaelsalomo...@gmail.com] 
Odesláno: 26. června 2009 
15:22
Komu: log4net-user@logging.apache.org
Předmět: Problem 
using a ConsoleAppender in a Windows Form application


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

Reply via email to