
Este código toma prestado bastante de un ejemplo anterior aquí en CodeProject, pero lo convertí a C# de Visual Basic. El ejemplo anterior fue escrito por Philip Liebscher en 2007 (¡guau!).
Este ejemplo incluye dos componentes:
El código para la aplicación de la consola es bastante simple:
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();
}
}
}
Además, hay una línea más para agregar a EnsamblyInfo.cs en la carpeta Propiedades, que en realidad configurará y encenderá log4net.
[assembly: XmlConfigurator(Watch = true)]
Configure el ColoredConsoleAppender y establezca los colores de nivel de registro. Lo siguiente va en su 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>
La aplicación web es un proyecto ASP.NET con un solo formulario. Hay varios archivos de componentes, pero la esencia de esto es que cuando active la aplicación web, comenzará automáticamente a enviar mensajes de registro a la aplicación de la consola tan pronto como inicie los dos.
Luego prueba los dos botones que veas. Ambos enviarán mensajes de registro a diferentes niveles de registro, y verá los diferentes colores en la aplicación de la consola.

La aplicación web se configura para usar un archivo de configuración externo para log4net. Dentro de ese archivo, configura un UDPAppender según la documentación log4net:
La propiedad Remoteport tiene que coincidir con el puerto en la aplicación de la consola, que está codificada con 8081.
La propiedad remotaaddress es un poco más complicada. Log4net salió antes de la introducción de Mass IPv6 a las versiones de Windows y supongo que nunca se ha actualizado correctamente. Si la aplicación de la consola está en su máquina local, debe usar la dirección IP 127.0.0.1 y no localhost , porque log4net resolverá localhost a :: 1, ¡que es una dirección IPv6! Si la aplicación de la consola no está en su máquina local, el método más directo para que este funcione es usar una dirección IPv4 en el formulario xxx.xxx.xxx.xxx en lugar de un nombre de dominio totalmente calificado (como myhost.somecompany.com) porque este último podría resolver una dirección IPV6 en lugar de una dirección IPV4. Tedioso, ¿eh? Tomar nota de esto le ahorrará muchos dolores de cabeza.
Para ayudar a formatear la salida, puede poner la sintaxis de PatternLayout que desee. Consulte los documentos de log4net para obtener ayuda con eso.