log4net 自定义Appender
最近有个需求,使用log4net来记录日志,然后将数据保存到服务器端。一开始打算写一个windows service,定期上传日志。
后来又因为一些场景下不适应,因此直接改为保存内存中,到一定阀值之后将数据post到服务器。
考虑用log4net的MemoryAppender,但是没办法控制这个阀值,同时还需要另外配置服务器接受数据地址。
因此也不适用,还好log4net支持自定义Appender,于是,参考MemoryAppender,自定义一个,问题解决。
下面是Appender代码。
1 /// <summary> 2 /// Customize Appender, save the Log in the memory 3 /// when it the event queue reach maximum queue size 4 /// the queue will post to sever. 5 /// </summary> 6 public class MyMemAppender : AppenderSkeleton 7 { 8 #region public properties 9 public string RemoteAddress { get; set; } 10 public int QueueSize { get; set; } 11 #endregion 12 13 #region Public Instance Constructors 14 public MyMemAppender() 15 : base() 16 { 17 eventQueue = new ArrayList(); 18 } 19 #endregion 20 21 #region private fields 22 private ArrayList eventQueue; 23 #endregion 24 25 #region Override implementation of AppenderSkeleton 26 protected override void Append(log4net.Core.LoggingEvent loggingEvent) 27 { 28 lock (eventQueue.SyncRoot) 29 { 30 eventQueue.Add(loggingEvent); 31 if (eventQueue.Count >= QueueSize) 32 { 33 this.Clear(); 34 } 35 } 36 } 37 #endregion 38 39 #region Public Instance Methods 40 41 /// <summary> 42 /// Clear the list of events 43 /// </summary> 44 /// <remarks> 45 /// Clear the list of events 46 /// </remarks> 47 virtual public void Clear() 48 { 49 lock (eventQueue.SyncRoot) 50 { 51 SaveToServer(); 52 eventQueue.Clear(); 53 } 54 } 55 56 /// <summary> 57 /// Gets the events that have been logged. 58 /// </summary> 59 /// <returns>The events that have been logged</returns> 60 /// <remarks> 61 /// <para> 62 /// Gets the events that have been logged. 63 /// </para> 64 /// </remarks> 65 virtual public LoggingEvent[] GetEvents() 66 { 67 lock (eventQueue.SyncRoot) 68 { 69 return (LoggingEvent[])eventQueue.ToArray(typeof(LoggingEvent)); 70 } 71 } 72 73 #endregion Public Instance Methods 74 75 #region private methods 76 private void SaveToServer() 77 { 78 lock (eventQueue.SyncRoot) 79 { 80 List<LogModel> logList = new List<LogModel>(); 81 foreach (log4net.Core.LoggingEvent evt in eventQueue) 82 { 83 try 84 { 85 LogModel m = Newtonsoft.Json.JsonConvert.DeserializeObject<LogModel>(evt.RenderedMessage); 86 logList.Add(m); 87 } 88 catch (Exception ex) 89 { 90 Console.Write(ex.ToString()); 91 continue; 92 } 93 } 94 SaveToServer(logList); 95 } 96 } 97 98 private void SaveToServer(List<LogModel> logList) 99 { 100 try 101 { 102 IsoDateTimeConverter timeConverter = new IsoDateTimeConverter(); 103 timeConverter.DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"; 104 string str = Newtonsoft.Json.JsonConvert.SerializeObject(logList, Newtonsoft.Json.Formatting.Indented, timeConverter); 105 PostStrToServer(str, RemoteAddress); 106 } 107 catch (Exception ex) 108 { 109 Console.Write(ex.ToString()); 110 return; 111 } 112 } 113 114 private void PostStrToServer(string content, string url) 115 { 116 using (WebClient client = new WebClient()) 117 { 118 client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 119 client.Encoding = System.Text.Encoding.UTF8; 120 client.UploadStringAsync(new Uri(url), ("logList=" + content)); 121 } 122 } 123 124 #endregion 125 }
配置文件:
<?xml version="1.0" encoding="utf-8" ?> <log4net debug="true"> <appender name="myMemAppender" type="LogSystem.Common.MyMemAppender"> <param name="QueueSize" value="10"/> <param name="RemoteAddress" value="http://localhost/PostLogData.aspx"/> </appender> <root> <level value="ALL"/> <appender-ref ref="myMemAppender" /> </root> </log4net>
调用方式:
MyMemAppender logger = new MyMemAppender(); logger.QueueSize = 5; logger.RemoteAddress = "http://localhost:57427/PostLogData.aspx"; log4net.Config.BasicConfigurator.Configure(logger); ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
或者
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(configPath));
log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步