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 <[email protected]>
To: Log4NET User <[email protected]>
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 <[email protected]>
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 <[email protected]>
Hello,
try to allocate your console _before_ log4net is
configured.
Radovan
________________________________
Od: Michael SALOMON
[mailto:[email protected]]
Odesláno: 26. června 2009
15:22
Komu: [email protected]
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