log4net 사용자 정의 Appender
20686 단어 appender
나중에 일부 장면에서 적응하지 못하기 때문에 메모리에 저장하고 일정한 밸브 값에 도달한 후에 데이터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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
log4net 사용자 정의 Appender최근에 로그를 기록하고 서버에 데이터를 저장하기 위해log4net을 사용해야 한다는 요구가 있습니다.처음에는 윈도우즈 서비스를 써서 정기적으로 로그를 올릴 계획이다. 나중에 일부 장면에서 적응하지 못하기 때문에 메모...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.