
Esse código toma empréstimo bastante de um exemplo anterior aqui no CodeProject, mas eu o converti em C# do Visual Basic. O exemplo anterior foi escrito por Philip Liebscher em 2007 (uau!).
Este exemplo inclui dois componentes:
O código para o aplicativo Console é bem simples:
using System;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
using log4net;
internal static class UdpLogListener
{
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static void Main()
{
var Port = 8081; // <-- remember to use the same port in your web/source app.
try
{
var sender = new IPEndPoint(IPAddress.Any, 0);
var client = new UdpClient(Port);
while (true)
{
var buffer = client.Receive(ref sender);
var logLine = Encoding.Default.GetString(buffer);
// The color coded text is written to the console when Log.{level method} is called.
// i.e. Log.Info("my info")
// Optional: Replace your placeholders with whatever you like. [I]=Info, [D]=Debug, etc.
// More detail about placeholders in the UdpAppender config below.
if (logLine.IndexOf("{INFO}") >= 0)
Log.Info(logLine.Replace("{INFO}", "[I] "));
else if (logLine.IndexOf("{DEBUG}") >= 0)
Log.Debug(logLine.Replace("{DEBUG}", "[D] "));
else if (logLine.IndexOf("{ERROR}") >= 0)
Log.Error(logLine.Replace("{ERROR}", "[E] "));
else if (logLine.IndexOf("{WARN}") >= 0)
Log.Warn(logLine.Replace("{WARN}", "[W] "));
else
// Some other level.
Log.Warn(logLine);
}
}
catch (Exception e)
{
Console.WriteLine(e);
Console.WriteLine("rnPress any key to close...");
Console.ReadLine();
}
}
}
Além disso, há mais uma linha para adicionar ao AssemblyInfo.cs na pasta Properties, que realmente configurará e liga o log4net.
[assembly: XmlConfigurator(Watch = true)]
Configure o ColoredConsoleAppender e defina as cores do nível de log. O seguinte é o seu app.config :
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="INFO" />
<foreColor value="White, HighIntensity" />
<backColor value="Green" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="White, HighIntensity" />
<backColor value="Blue" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow, HighIntensity" />
<backColor value="Purple" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Yellow, HighIntensity" />
<backColor value="Red" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ColoredConsoleAppender" />
</root>
</log4net>
O aplicativo da web é um projeto ASP.NET com um único formulário. Existem vários arquivos de componentes, mas a essência disso é que, quando você inicia o aplicativo da Web, ele começará automaticamente a enviar mensagens de log para o aplicativo de console assim que iniciar os dois.
Então tente os dois botões que você vê. Ambos enviarão mensagens de log em diferentes níveis de log e você verá as diferentes cores no aplicativo de console.

O aplicativo da Web é configurado para usar um arquivo de configuração externo para log4net. Nesse arquivo, você configura um udpappender de acordo com a documentação do log4net:
A propriedade Remoteport deve corresponder à porta no aplicativo do console, que é codificado em 8081.
A propriedade RemoteAddress é um pouco mais complicada. O Log4Net foi lançado antes da introdução em massa IPv6 nas versões do Windows e acho que nunca foi atualizado corretamente. Se o aplicativo de console estiver na sua máquina local, você deverá usar o endereço IP 127.0.0.1 e não o localhost , porque o log4net resolverá localhost para :: 1, que é um endereço IPv6 !!! Se o aplicativo de console não estiver na sua máquina local, o método mais direto para fazer com que este trabalho seja usar um endereço IPv4 no formulário xxx.xxx.xxx.xxx em oposição a um nome de domínio totalmente qualificado (como myhost.somecompany.com) porque o último pode resolver um endereço IPV6 em vez de um endereço IPv4. Tedioso, não é? Tomar nota disso economizará muitas dores de cabeça.
Para ajudar a formatar a saída, você pode colocar a sintaxe PatternLayout que desejar. Consulte os documentos log4net para obter ajuda com isso.