Este problema apareceu-me porque tenho uma aplicação já construída que usa o log4net para fazer log, neste caso para ficheiro, mas eu queria por essa aplicação a ser invocada por um windows form estando o log a ser escrito para uma RichTextBox.
Esta técnica não só serve para esta situação, mas para qualquer objecto que tenha uma propriedade/campo que seja do tipo string. É necessário fazer 3 coisas:
1) Criar uma classe que derive de AppenderSkeleton;
2) Registar o appender no xml de configuração;
3) Dar ao appender o objecto para o qual vai escrever.
1)
1) Criar uma classe que derive de AppenderSkeleton;
2) Registar o appender no xml de configuração;
3) Dar ao appender o objecto para o qual vai escrever.
1)
using log4net.Appender;
using System.Windows.Forms;
using log4net.Core;
namespace LogExample
{
public class TextAppender : AppenderSkeleton
{
private RichTextBox logPlace;
public RichTextBox LogPlace
{
get { return logPlace; }
set { logPlace = value; }
}
///
/// Writes the logging event to a TextBox
///
override protected void Append(LoggingEvent loggingEvent)
{
LogPlace.Text += string.Format("\n{0}", loggingEvent.RenderedMessage);
}
}
}
2)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="Writer" type="LogExample.TextAppender, LogExample">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH:mm:ss} %-5p - %m%n"/>
</layout>
</appender>
<root>
<priority value="info"/>
<appender-ref ref="Writer"/>
</root>
</log4net>
</configuration>
3)
using System;
using System.Windows.Forms;
using log4net;
using log4net.Config;
using log4net.Appender;
namespace LogExample
{
public partial class Log : Form
{
private readonly ILog log;
public Log()
{
InitializeComponent();
log = LogManager.GetLogger(typeof(Log));
XmlConfigurator.Configure();
IAppender[] appenders = log.Logger.Repository.GetAppenders();
foreach (IAppender append in appenders)
{
if (append is TextAppender)
{
((TextAppender)append).LogPlace = logBox;
}
}
}
}
}
Essa é uma biblioteca que, desde que tive na Inosat, não parei de usar... mas isto não sabia :) boa dica!
ResponderEliminar