Log4net自定义实现httpAppender

来源:互联网 发布:mac arp 命令 编辑:程序博客网 时间:2024/06/06 17:01

Log4net实现一个Appender是一件比较简单的工作,只需要实IAppender接口即可以,当然Log4net也会提供一些基类方便我们实现.接下来实现一个httpAppender,在实现之前需制定一些参数用于内部实现用.

  • Host     日志提交的URL,如:http://localhost:30532/logupload.aspx
  • ServerTag  提交日志的服务器标记,如:192.168.0.1
  • AppName   应用程序的名称,如:Game
  • MaxRecords 内存保存的最大记录数,当日志数量超过些值是进行数据提交
  • Timer     定时提交时间

制定消息存储结构

  1. public class LogEvent
  2. {
  3. public LogEvent()
  4. {
  5. Errors = new List<EventMessage>();
  6. }
  7. public string EventType
  8. {
  9. get;
  10. set;
  11. }
  12. public string ServerTag
  13. {
  14. get;
  15. set;
  16. }
  17. public string Message
  18. {
  19. get;
  20. set;
  21. }
  22. public string AppName
  23. {
  24. get;
  25. set;
  26. }
  27. public DateTime ErrorTime
  28. {
  29. get;
  30. set;
  31. }
  32. public List<EventMessage> Errors
  33. {
  34. get;
  35. set;
  36. }
  37.  
  38. }
  39. public class EventMessage
  40. {
  41. public string Message { get; set; }
  42. public string StackTrace { get; set; }
  43. }

Appender实现

  1. /// <summary>
  2. /// <code>
  3. /// <appender name="HttpAppender" type="log4netUTS.HttpAppender,log4netUTS">
  4. /// <param name="Host" value="http://localhost:30532/WEBFORM1.ASPX"/>
  5. /// <param name="ServerTag" value="192.168.0.1"/>
  6. /// <param name="AppName" value="test"/>
  7. /// <param name="Timer" value="10000"/>
  8. /// <param name="MaxRecords" value="1000"/>
  9. /// </appender>
  10. /// </code>
  11. /// </summary>
  12. public class HttpAppender : log4net.Appender.AppenderSkeleton
  13. {
  14. public HttpAppender()
  15. {
  16. Timer = 5000;
  17. MaxRecords = 300;
  18. }
  19.  
  20. private System.Threading.Timer mTimer;
  21.  
  22. private void CreateTime()
  23. {
  24. lock (this)
  25. {
  26. if (mTimer == null)
  27. mTimer = new System.Threading.Timer(Upload, null, Timer, Timer);
  28. }
  29. }
  30.  
  31. private readonly static Type declaringType = typeof(HttpAppender);
  32.  
  33. private Queue<LogEvent> mEvents = new Queue<LogEvent>(1000);
  34.  
  35. private void Add(LogEvent item)
  36. {
  37. CreateTime();
  38. lock (mEvents)
  39. {
  40. mEvents.Enqueue(item);
  41. if (mEvents.Count > MaxRecords)
  42. Upload(null);
  43. }
  44. }
  45.  
  46. private void Upload(object state)
  47. {
  48. List<LogEvent> items = new List<LogEvent>();
  49. lock (mEvents)
  50. {
  51. while (mEvents.Count > 0)
  52. {
  53. items.Add(mEvents.Dequeue());
  54. }
  55. }
  56. if (items.Count > 0)
  57. {
  58. OnUpload(items);
  59. }
  60. }
  61.  
  62. private void OnUpload(object state)
  63. {
  64. try
  65. {
  66. List<LogEvent> items = (List<LogEvent>)state;
  67. string param = "LogData=" + Newtonsoft.Json.JsonConvert.SerializeObject(items);
  68. byte[] data = Encoding.UTF8.GetBytes(param);
  69. HttpWebRequest req =
  70. (HttpWebRequest)HttpWebRequest.Create(Host);
  71. req.Method = "POST";
  72. req.ContentType = "application/x-www-form-urlencoded";
  73. req.ContentLength = data.Length;
  74. using (Stream reqStream = req.GetRequestStream())
  75. {
  76. reqStream.Write(data, 0, data.Length);
  77. }
  78. using (WebResponse wr = req.GetResponse())
  79. {
  80.  
  81. }
  82. }
  83. catch (Exception e_)
  84. {
  85. LogLog.Error(declaringType, e_.Message);
  86. }
  87. }
  88.  
  89. public string Host
  90. {
  91. get;
  92. set;
  93. }
  94.  
  95. public string ServerTag
  96. {
  97. get;
  98. set;
  99. }
  100.  
  101. public string AppName
  102. {
  103. get;
  104. set;
  105. }
  106.  
  107. public int MaxRecords
  108. {
  109. get;
  110. set;
  111. }
  112.  
  113. public int Timer
  114. {
  115. get;
  116. set;
  117. }
  118.  
  119. protected override void Append(log4net.Core.LoggingEvent loggingEvent)
  120. {
  121. try
  122. {
  123. LogEvent le = new LogEvent();
  124. le.ErrorTime = loggingEvent.TimeStamp;
  125. le.EventType = loggingEvent.Level.ToString();
  126. le.Message = loggingEvent.RenderedMessage;
  127. le.AppName = AppName;
  128. le.ServerTag = ServerTag;
  129. AddError(le, loggingEvent.ExceptionObject);
  130. Add(le);
  131.  
  132.  
  133. }
  134. catch (Exception e_)
  135. {
  136. LogLog.Error(declaringType, e_.Message);
  137. }
  138. }
  139.  
  140. private void AddError(LogEvent e, Exception err)
  141. {
  142. if (err != null)
  143. {
  144. e.Errors.Add(new EventMessage { Message = err.Message, StackTrace = err.StackTrace });
  145. err = err.InnerException;
  146. while (err != null)
  147. {
  148. e.Errors.Add(new EventMessage { Message = err.Message, StackTrace = err.StackTrace });
  149. err = err.InnerException;
  150. }
  151. }
  152.  
  153. }
  154. }

实现代码相对比较简单,就是把队列中的数据打包成json格式上传到相关http服

0 0
原创粉丝点击