Skip to content

Commit eec8e43

Browse files
committed
Implemented logger providers
#7
1 parent 78d855b commit eec8e43

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using System;
2+
using System.Collections.Concurrent;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Net.Http;
6+
using System.Net.Http.Headers;
7+
using System.Text;
8+
using Microsoft.Extensions.Logging;
9+
using Newtonsoft.Json;
10+
using Splunk.Configurations;
11+
using Splunk.Loggers;
12+
13+
namespace Splunk.Providers
14+
{
15+
public class SplunkHECJsonLoggerProvider : ILoggerProvider
16+
{
17+
readonly BatchManager batchController;
18+
readonly HttpClient httpClient;
19+
readonly LogLevel threshold;
20+
readonly ILoggerFormatter loggerFormatter;
21+
readonly ConcurrentDictionary<string, ILogger> loggers;
22+
23+
public SplunkHECJsonLoggerProvider(SplunkLoggerConfiguration configuration, ILoggerFormatter loggerFormatter = null)
24+
{
25+
loggers = new ConcurrentDictionary<string, ILogger>();
26+
27+
threshold = configuration.Threshold;
28+
29+
this.loggerFormatter = loggerFormatter;
30+
31+
httpClient = new HttpClient();
32+
33+
var splunkCollectorUrl = configuration.HecConfiguration.SplunkCollectorUrl;
34+
if (!splunkCollectorUrl.EndsWith("/", StringComparison.InvariantCulture))
35+
splunkCollectorUrl += "/";
36+
37+
var baseAddress = new Uri(splunkCollectorUrl + "event");
38+
httpClient.BaseAddress = baseAddress;
39+
40+
httpClient.Timeout = TimeSpan.FromMilliseconds(configuration.HecConfiguration.DefaultTimeoutInMiliseconds);
41+
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Splunk", configuration.HecConfiguration.Token);
42+
43+
batchController = new BatchManager(configuration.HecConfiguration.BatchSizeCount, configuration.HecConfiguration.BatchIntervalInMiliseconds, Emit);
44+
}
45+
46+
ILogger CreateLoggerInstance(string categoryName)
47+
{
48+
return new HECJsonLogger(categoryName, threshold, httpClient, batchController, loggerFormatter);
49+
}
50+
51+
public ILogger CreateLogger(string categoryName)
52+
{
53+
return loggers.GetOrAdd(categoryName, CreateLoggerInstance(categoryName));
54+
}
55+
56+
public void Dispose()
57+
{
58+
loggers.Clear();
59+
}
60+
61+
public void Emit(List<object> events)
62+
{
63+
var jArray = events.Select(evt => JsonConvert.SerializeObject(evt, Formatting.None));
64+
var formatedMessage = string.Join(" ", jArray);
65+
var stringContent = new StringContent(formatedMessage, Encoding.UTF8, "application/json");
66+
httpClient.PostAsync(string.Empty, stringContent);
67+
}
68+
}
69+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Net.Http;
4+
using System.Net.Http.Headers;
5+
using Microsoft.Extensions.Logging;
6+
using System.Linq;
7+
using System.Collections.Concurrent;
8+
using Splunk.Configurations;
9+
using Splunk.Loggers;
10+
11+
namespace Splunk.Providers
12+
{
13+
public class SplunkHECRawLoggerProvider : ILoggerProvider
14+
{
15+
readonly BatchManager batchManager;
16+
readonly HttpClient httpClient;
17+
readonly LogLevel threshold;
18+
readonly ILoggerFormatter loggerFormatter;
19+
readonly ConcurrentDictionary<string, ILogger> loggers;
20+
21+
public SplunkHECRawLoggerProvider(SplunkLoggerConfiguration configuration, ILoggerFormatter loggerFormatter = null)
22+
{
23+
loggers = new ConcurrentDictionary<string, ILogger>();
24+
25+
threshold = configuration.Threshold;
26+
27+
this.loggerFormatter = loggerFormatter;
28+
29+
httpClient = new HttpClient();
30+
31+
var splunkCollectorUrl = configuration.HecConfiguration.SplunkCollectorUrl;
32+
if (!splunkCollectorUrl.EndsWith("/", StringComparison.InvariantCulture))
33+
splunkCollectorUrl += "/";
34+
35+
var baseAddress = new Uri(splunkCollectorUrl + "/raw?channel=" + Guid.NewGuid().ToString());
36+
httpClient.BaseAddress = baseAddress;
37+
38+
httpClient.Timeout = TimeSpan.FromMilliseconds(configuration.HecConfiguration.DefaultTimeoutInMiliseconds);
39+
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Splunk", configuration.HecConfiguration.Token);
40+
41+
batchManager = new BatchManager(configuration.HecConfiguration.BatchSizeCount, configuration.HecConfiguration.BatchIntervalInMiliseconds, Emit);
42+
}
43+
44+
ILogger CreateLoggerInstance(string categoryName)
45+
{
46+
return new HECRawLogger(categoryName, threshold, httpClient, batchManager, loggerFormatter);
47+
}
48+
49+
public ILogger CreateLogger(string categoryName)
50+
{
51+
return loggers.GetOrAdd(categoryName, CreateLoggerInstance(categoryName));
52+
}
53+
54+
public void Dispose()
55+
{
56+
loggers.Clear();
57+
}
58+
59+
public void Emit(List<object> events)
60+
{
61+
var formatedMessage = string.Join(Environment.NewLine, events.Select(evt => evt.ToString()));
62+
var stringContent = new StringContent(formatedMessage);
63+
httpClient.PostAsync(string.Empty, stringContent);
64+
}
65+
}
66+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Collections.Concurrent;
2+
using Microsoft.Extensions.Logging;
3+
using Splunk.Configurations;
4+
using Splunk.Loggers;
5+
using System.Net.Sockets;
6+
7+
namespace Splunk.Providers
8+
{
9+
public class SplunkTcpLoggerProvider : ILoggerProvider
10+
{
11+
readonly LogLevel threshold;
12+
readonly ILoggerFormatter loggerFormatter;
13+
readonly ConcurrentDictionary<string, ILogger> loggers;
14+
readonly TcpClient tcpClient;
15+
16+
public SplunkTcpLoggerProvider(SplunkLoggerConfiguration configuration, ILoggerFormatter loggerFormatter = null)
17+
{
18+
loggers = new ConcurrentDictionary<string, ILogger>();
19+
20+
threshold = configuration.Threshold;
21+
22+
this.loggerFormatter = loggerFormatter;
23+
24+
tcpClient = new TcpClient(configuration.SocketConfiguration.HostName, configuration.SocketConfiguration.Port);
25+
if (!tcpClient.Connected)
26+
tcpClient.Connect(configuration.SocketConfiguration.HostName, configuration.SocketConfiguration.Port);
27+
}
28+
29+
ILogger CreateLoggerInstance(string categoryName)
30+
{
31+
return new TcpLogger(categoryName, threshold, tcpClient, loggerFormatter);
32+
}
33+
34+
public ILogger CreateLogger(string categoryName)
35+
{
36+
return loggers.GetOrAdd(categoryName, CreateLoggerInstance(categoryName));
37+
}
38+
39+
public void Dispose()
40+
{
41+
loggers.Clear();
42+
}
43+
}
44+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Collections.Concurrent;
2+
using Microsoft.Extensions.Logging;
3+
using Splunk.Configurations;
4+
using Splunk.Loggers;
5+
using System.Net.Sockets;
6+
7+
namespace Splunk.Providers
8+
{
9+
public class SplunkUdpLoggerProvider : ILoggerProvider
10+
{
11+
readonly LogLevel threshold;
12+
readonly ILoggerFormatter loggerFormatter;
13+
readonly ConcurrentDictionary<string, ILogger> loggers;
14+
readonly UdpClient udpClient;
15+
16+
public SplunkUdpLoggerProvider(SplunkLoggerConfiguration configuration, ILoggerFormatter loggerFormatter = null)
17+
{
18+
loggers = new ConcurrentDictionary<string, ILogger>();
19+
20+
threshold = configuration.Threshold;
21+
22+
this.loggerFormatter = loggerFormatter;
23+
24+
udpClient = new UdpClient(configuration.SocketConfiguration.HostName, configuration.SocketConfiguration.Port);
25+
if (!udpClient.Client.Connected)
26+
udpClient.Client.Connect(configuration.SocketConfiguration.HostName, configuration.SocketConfiguration.Port);
27+
}
28+
29+
ILogger CreateLoggerInstance(string categoryName)
30+
{
31+
return new UdpLogger(categoryName, threshold, udpClient, loggerFormatter);
32+
}
33+
34+
public ILogger CreateLogger(string categoryName)
35+
{
36+
return loggers.GetOrAdd(categoryName, CreateLoggerInstance(categoryName));
37+
}
38+
39+
public void Dispose()
40+
{
41+
loggers.Clear();
42+
}
43+
}
44+
}

src/SplunkLogger/SplunkLogger.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<ItemGroup>
1111
<Folder Include="Configurations\" />
1212
<Folder Include="Loggers\" />
13+
<Folder Include="Providers\" />
1314
</ItemGroup>
1415
<ItemGroup>
1516
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />

0 commit comments

Comments
 (0)