/
SimpleDBBufferingAppender.cs
84 lines (73 loc) · 3.51 KB
/
SimpleDBBufferingAppender.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using Amazon.SimpleDB;
using Amazon.SimpleDB.Model;
using log4net;
using log4net.Appender;
using log4net.Core;
namespace Logging
{
public class SimpleDBBufferingAppender : BufferingAppenderSkeleton
{
private int maxItemsPerRequest = 25; // simpledb has max 25 items per batch put request
protected override void SendBuffer(log4net.Core.LoggingEvent[] events)
{
var client = new AmazonSimpleDBClient(); // access and secret keys in web.config
for (var i = 0; i < (events.Count() / maxItemsPerRequest) + 1; i++)
{
try
{
var request = new BatchPutAttributesRequest();
foreach (var e in events.Skip(i * maxItemsPerRequest).Take(maxItemsPerRequest))
{
var batchItem = new ReplaceableItem()
{
ItemName = Guid.NewGuid().ToString()
};
batchItem.Attribute.Add(GetAttribute("Thread", e.ThreadName));
batchItem.Attribute.Add(GetAttribute("Level", e.Level.Name));
batchItem.Attribute.Add(GetAttribute("CustomLevel", GetCustomProperty(e, "CustomLevel")));
batchItem.Attribute.Add(GetAttribute("Url", GetCustomProperty(e, "Url")));
batchItem.Attribute.Add(GetAttribute("Machine", GetCustomProperty(e, "Machine")));
batchItem.Attribute.Add(GetAttribute("Product", GetCustomProperty(e, "Product")));
batchItem.Attribute.Add(GetAttribute("UserId", GetCustomProperty(e, "UserId")));
batchItem.Attribute.Add(GetAttribute("UserName", GetCustomProperty(e, "UserName")));
batchItem.Attribute.Add(GetAttribute("TimeStamp", e.TimeStamp.ToUniversalTime().ToString("o")));
batchItem.Attribute.Add(GetAttribute("Message", e.RenderedMessage));
batchItem.Attribute.Add(GetAttribute("FormattedMessage", GetCustomProperty(e, "FormattedMessage")));
batchItem.Attribute.Add(GetAttribute("StackTrace", e.GetExceptionString()));
request.Item.Add(batchItem);
}
// Assumes Domain has already been created
if(!string.IsNullOrEmpty(ConfigurationManager.AppSettings["SimpleDBLogName"]))
request.DomainName = ConfigurationManager.AppSettings["SimpleDBLogName"];
else
request.DomainName = "Log";
client.BatchPutAttributes(request);
}
finally
{
}
}
}
private ReplaceableAttribute GetAttribute(string name, string value)
{
return new ReplaceableAttribute()
{
Replace = true,
Name = name,
Value = value
};
}
private string GetCustomProperty(LoggingEvent e, string property)
{
if (e != null && e.Properties[property] != null)
return e.Properties[property].ToString();
else
return string.Empty;
}
}
}