log4net 사용자 정의 Appender

20686 단어 appender
최근에 로그를 기록하고 서버에 데이터를 저장하기 위해log4net을 사용해야 한다는 요구가 있습니다.처음에는 윈도우즈 서비스를 써서 정기적으로 로그를 올릴 계획이다.
나중에 일부 장면에서 적응하지 못하기 때문에 메모리에 저장하고 일정한 밸브 값에 도달한 후에 데이터post를 서버에 저장합니다.
log4net의 Memory Appender를 사용하려고 하지만 이 밸브 값을 제어할 수 없고 서버가 데이터 주소를 받아들일 수 있도록 따로 설정해야 합니다.
그렇기 때문에 적용되지 않습니다. 다행히도log4net은 사용자 정의 Appender를 지원하기 때문에 Memory Appender를 참고하여 사용자 정의를 하고 문제를 해결합니다.
다음은 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);

좋은 웹페이지 즐겨찾기