版权声明:本文为 走错路的程序员 原创文章,欢迎转载。 https://blog.csdn.net/phker/article/details/83410255
为了方便远程在线查看日志,做了这个.
using Fleck;
using log4net.Appender;
using log4net.Core;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Web;
namespace Jobs.AppCode.Log
{
/// <summary>
/// log4net 扩展,允许输出到WebSocket
/// </summary>
public class WebSocketAppender : AppenderSkeleton
{
//int Port = 20001;
//static List<int> checkPorts = new List<int>();
static Dictionary<int, List<IWebSocketConnection>> listeners = new Dictionary<int, List<IWebSocketConnection>>();
public WebSocketAppender()
{
//this.ErrorHandler.
}
public List<IWebSocketConnection> CreateListeners(int Port)
{
lock (listeners)
{
if (!listeners.ContainsKey(Port))
{
var server = new WebSocketServer("ws://127.0.0.1:" + Port);
server.Start(socket =>
{
socket.OnOpen = () => { Console.WriteLine("Open!"); listeners[Port].Add(socket); };
socket.OnClose = () => { Console.WriteLine("Close!"); };
socket.OnMessage = message => { socket.Send(message); };
});
//checkPorts.Add(Port);
listeners.Add(Port, new List<IWebSocketConnection>());
return listeners[Port];
}
else
{
return listeners[Port];
}
}
}
protected override void Append(LoggingEvent loggingEvent)
{
try
{
if (!loggingEvent.Repository.Properties.Contains("Port"))
{
System.IO.File.WriteAllText(System.AppDomain.CurrentDomain.BaseDirectory +"/TCPAppender.log", "Properties 中没有Port属性");
return ;
}
var p = loggingEvent.Repository.Properties["Port"].ToString();
var Port = int.Parse(p);
//NetworkStream ntwStream = this.Client.GetStream();
var aa = this.RenderLoggingEvent(loggingEvent);//.ToCharArray();
//byte[] bytes = Encoding.UTF8.GetBytes(this.RenderLoggingEvent(loggingEvent).ToCharArray());
//配置端口
if (!listeners.ContainsKey(Port))
{
CreateListeners(Port);
}
for (int i = 0; i < listeners[Port].Count; i++)
{
//群发给每一个客户端
listeners[Port][i].Send(aa);
}
//ntwStream.Write(bytes, 0, bytes.Length);
}
catch (Exception ex)
{
System.IO.File.WriteAllText(System.AppDomain.CurrentDomain.BaseDirectory+"/TCPAppender.error.log", ex.ToString());
//如果无法输出到日志客户端,那么就不输出, 防止影响主业务系统运行.
//this.ErrorHandler.Error("Unable to send logging event to remote host " + this.RemoteAddress.ToString() + " on port " + (object)this.RemotePort + ".", ex, ErrorCode.WriteFailure);
}
}
}
}