-
-
Notifications
You must be signed in to change notification settings - Fork 323
/
NLogDataProvider.cs
116 lines (107 loc) · 3.94 KB
/
NLogDataProvider.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using NLog;
using Audit.Core;
namespace Audit.NLog.Providers
{
/// <summary>
/// Store Audit logs using NLog.
/// </summary>
/// <remarks>
/// Settings:
/// Logger/LoggerBuilder: A way to obtain the NLog ILog instance. Default is LogManager.GetLogger(auditEvent.GetType()).
/// LogLevel/LogLevelBuilder: A way to obtain the log level for the audit events. Default is Error for exceptions and Info for anything else.
/// LogBodyBuilder: A way to obtain the object to be logged. Default is the AuditEvent JSON including the EventId as a custom field.
/// </remarks>
public class NLogDataProvider : AuditDataProvider
{
/// <summary>
/// The NLog ILog implementation to use
/// </summary>
public Setting<ILogger> Logger { get; set; }
/// <summary>
/// The NLog Log Level to use
/// </summary>
public Setting<LogLevel?> LogLevel { get; set; }
/// <summary>
/// A function that given an audit event and an event id, returns the message to log
/// </summary>
public Func<AuditEvent, object, object> LogMessageBuilder { get; set; }
public NLogDataProvider()
{
}
public NLogDataProvider(Action<Configuration.INLogConfigurator> config)
{
var logConfig = new Configuration.NLogConfigurator();
if (config != null)
{
config.Invoke(logConfig);
Logger = logConfig._logger;
LogLevel = logConfig._logLevel;
LogMessageBuilder = logConfig._messageBuilder;
}
}
private ILogger GetLogger(AuditEvent auditEvent)
{
return Logger.GetValue(auditEvent) ?? LogManager.GetLogger(auditEvent.GetType().FullName);
}
private LogLevel GetLogLevel(AuditEvent auditEvent)
{
return LogLevel.GetValue(auditEvent) ?? (auditEvent.Environment?.Exception != null ? NLog.LogLevel.Error : NLog.LogLevel.Info);
}
private object GetLogObject(AuditEvent auditEvent, object eventId)
{
if (LogMessageBuilder == null)
{
if (eventId != null)
{
auditEvent.CustomFields["EventId"] = eventId;
}
return auditEvent.ToJson();
}
return LogMessageBuilder.Invoke(auditEvent, eventId);
}
private void Log(AuditEvent auditEvent, object eventId)
{
var logger = GetLogger(auditEvent);
var level = GetLogLevel(auditEvent);
var value = GetLogObject(auditEvent, eventId);
switch (level)
{
case NLog.LogLevel.Debug:
logger.Debug(value);
break;
case NLog.LogLevel.Warn:
logger.Warn(value);
break;
case NLog.LogLevel.Error:
logger.Error(value);
break;
case NLog.LogLevel.Fatal:
logger.Fatal(value);
break;
default:
logger.Info(value);
break;
}
}
/// <summary>
/// Stores an event via NLog
/// </summary>
/// <param name="auditEvent">The audit event.</param>
public override object InsertEvent(AuditEvent auditEvent)
{
var eventId = Guid.NewGuid();
Log(auditEvent, eventId);
return eventId;
}
/// <summary>
/// Stores an event related to a previous event, via NLog
/// </summary>
/// <param name="auditEvent">The audit event.</param>
/// <param name="eventId">The event id.</param>
public override void ReplaceEvent(object eventId, AuditEvent auditEvent)
{
Log(auditEvent, eventId);
}
}
}