Skip to content

Commit

Permalink
Allow configuration of log level severity (#158 closes #149)
Browse files Browse the repository at this point in the history
  • Loading branch information
luigiberrettini authored Oct 29, 2018
1 parent 89011d6 commit 4f57fd2
Show file tree
Hide file tree
Showing 11 changed files with 192 additions and 55 deletions.
18 changes: 18 additions & 0 deletions src/NLog.Targets.Syslog.Schema/NLog.Targets.Syslog.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,24 @@
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="facility" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="perLogLevelSeverity" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="fatal" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="error" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="warn" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="info" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="debug" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="trace" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:choice>
<xs:attribute name="fatal" type="xs:string" />
<xs:attribute name="error" type="xs:string" />
<xs:attribute name="warn" type="xs:string" />
<xs:attribute name="info" type="xs:string" />
<xs:attribute name="debug" type="xs:string" />
<xs:attribute name="trace" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="rfc" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="rfc3164" minOccurs="0" maxOccurs="1">
<xs:complexType>
Expand Down
28 changes: 28 additions & 0 deletions src/NLog.Targets.Syslog/MessageCreation/LogLevelSeverityMapping.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Licensed under the BSD license
// See the LICENSE file in the project root for more information

using System.Collections.Generic;
using NLog.Targets.Syslog.Settings;

namespace NLog.Targets.Syslog.MessageCreation
{
internal class LogLevelSeverityMapping
{
private readonly IDictionary<LogLevel, Severity> logLevelSeverityMapping;

public LogLevelSeverityMapping(LogLevelSeverityConfig logLevelSeverityConfig)
{
logLevelSeverityMapping = new Dictionary<LogLevel, Severity>
{
{ LogLevel.Fatal, logLevelSeverityConfig.Fatal },
{ LogLevel.Error, logLevelSeverityConfig.Error },
{ LogLevel.Warn, logLevelSeverityConfig.Warn },
{ LogLevel.Info, logLevelSeverityConfig.Info },
{ LogLevel.Debug, logLevelSeverityConfig.Debug },
{ LogLevel.Trace, logLevelSeverityConfig.Trace }
};
}

public Severity this[LogLevel logLevel] => logLevelSeverityMapping[logLevel];
}
}
12 changes: 8 additions & 4 deletions src/NLog.Targets.Syslog/MessageCreation/MessageBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ internal abstract class MessageBuilder

private readonly SplitOnNewLinePolicy splitOnNewLinePolicy;
private readonly Facility facility;
private readonly LogLevelSeverityMapping logLevelSeverityMapping;

static MessageBuilder()
{
BuilderFactory = new Dictionary<RfcNumber, Func<MessageBuilderConfig, EnforcementConfig, MessageBuilder>>
{
{ RfcNumber.Rfc3164, (msgBuilderCfg, enforcementCfg) => new Rfc3164(msgBuilderCfg.Facility, msgBuilderCfg.Rfc3164, enforcementCfg) },
{ RfcNumber.Rfc5424, (msgBuilderCfg, enforcementCfg) => new Rfc5424(msgBuilderCfg.Facility, msgBuilderCfg.Rfc5424, enforcementCfg) }
{ RfcNumber.Rfc3164, (msgBuilderCfg, enforcementCfg) =>
new Rfc3164(msgBuilderCfg.Facility, msgBuilderCfg.PerLogLevelSeverity, msgBuilderCfg.Rfc3164, enforcementCfg) },
{ RfcNumber.Rfc5424, (msgBuilderCfg, enforcementCfg) =>
new Rfc5424(msgBuilderCfg.Facility, msgBuilderCfg.PerLogLevelSeverity, msgBuilderCfg.Rfc5424, enforcementCfg) }
};
}

Expand All @@ -31,9 +34,10 @@ public static MessageBuilder FromConfig(MessageBuilderConfig messageBuilderConfi
return BuilderFactory[messageBuilderConfig.Rfc](messageBuilderConfig, enforcementConfig);
}

protected MessageBuilder(Facility facility, EnforcementConfig enforcementConfig)
protected MessageBuilder(Facility facility, LogLevelSeverityConfig logLevelSeverityConfig, EnforcementConfig enforcementConfig)
{
this.facility = facility;
logLevelSeverityMapping = new LogLevelSeverityMapping(logLevelSeverityConfig);
splitOnNewLinePolicy = new SplitOnNewLinePolicy(enforcementConfig);
}

Expand All @@ -46,7 +50,7 @@ public string[] BuildLogEntries(LogEventInfo logEvent, Layout layout)
public void PrepareMessage(ByteArray buffer, LogEventInfo logEvent, string logEntry)
{
buffer.Reset();
var pri = Pri(facility, (Severity)logEvent.Level);
var pri = Pri(facility, logLevelSeverityMapping[logEvent.Level]);
PrepareMessage(buffer, logEvent, pri, logEntry);
}

Expand Down
2 changes: 1 addition & 1 deletion src/NLog.Targets.Syslog/MessageCreation/Rfc3164.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ internal class Rfc3164 : MessageBuilder
private readonly PlainContentPolicySet plainContentPolicySet;
private readonly AsciiMessagePolicy asciiMessagePolicy;

public Rfc3164(Facility facility, Rfc3164Config rfc3164Config, EnforcementConfig enforcementConfig) : base(facility, enforcementConfig)
public Rfc3164(Facility facility, LogLevelSeverityConfig logLevelSeverityConfig, Rfc3164Config rfc3164Config, EnforcementConfig enforcementConfig) : base(facility, logLevelSeverityConfig, enforcementConfig)
{
hostnamePolicySet = new PlainHostnamePolicySet(enforcementConfig);
tagPolicySet = new TagPolicySet(enforcementConfig);
Expand Down
2 changes: 1 addition & 1 deletion src/NLog.Targets.Syslog/MessageCreation/Rfc5424.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ internal class Rfc5424 : MessageBuilder
private readonly MsgIdPolicySet msgIdPolicySet;
private readonly Utf8MessagePolicy utf8MessagePolicy;

public Rfc5424(Facility facility, Rfc5424Config rfc5424Config, EnforcementConfig enforcementConfig) : base(facility, enforcementConfig)
public Rfc5424(Facility facility, LogLevelSeverityConfig logLevelSeverityConfig, Rfc5424Config rfc5424Config, EnforcementConfig enforcementConfig) : base(facility, logLevelSeverityConfig, enforcementConfig)
{
version = rfc5424Config.Version;
hostnameLayout = rfc5424Config.Hostname;
Expand Down
49 changes: 0 additions & 49 deletions src/NLog.Targets.Syslog/MessageCreation/Severity.cs

This file was deleted.

73 changes: 73 additions & 0 deletions src/NLog.Targets.Syslog/Settings/LogLevelSeverityConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Licensed under the BSD license
// See the LICENSE file in the project root for more information

using System;
using System.ComponentModel;

namespace NLog.Targets.Syslog.Settings
{
/// <inheritdoc cref="NotifyPropertyChanged" />
/// <summary>Log level to severity configuration</summary>
public class LogLevelSeverityConfig : NotifyPropertyChanged
{
private Severity fatal;
private Severity error;
private Severity warn;
private Severity info;
private Severity debug;
private Severity trace;

/// <summary>The Syslog severity for log level fatal</summary>
public Severity Fatal
{
get => fatal;
set => SetProperty(ref fatal, value);
}

/// <summary>The Syslog severity for log level error</summary>
public Severity Error
{
get => error;
set => SetProperty(ref error, value);
}

/// <summary>The Syslog severity for log level warn</summary>
public Severity Warn
{
get => warn;
set => SetProperty(ref warn, value);
}

/// <summary>The Syslog severity for log level info</summary>
public Severity Info
{
get => info;
set => SetProperty(ref info, value);
}

/// <summary>The Syslog severity for log level debug</summary>
public Severity Debug
{
get => debug;
set => SetProperty(ref debug, value);
}

/// <summary>The Syslog severity for log level trace</summary>
public Severity Trace
{
get => trace;
set => SetProperty(ref trace, value);
}

/// <summary>Builds a new instance of the LogLevelSeverityConfig class</summary>
public LogLevelSeverityConfig()
{
fatal = Severity.Emergency;
error = Severity.Error;
warn = Severity.Warning;
info = Severity.Informational;
debug = Severity.Debug;
trace = Severity.Notice;
}
}
}
14 changes: 14 additions & 0 deletions src/NLog.Targets.Syslog/Settings/MessageBuilderConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ namespace NLog.Targets.Syslog.Settings
public class MessageBuilderConfig : NotifyPropertyChanged, IDisposable
{
private Facility facility;
private LogLevelSeverityConfig perLogLevelSeverity;
private readonly PropertyChangedEventHandler perLogLevelSeverityPropsChanged;
private RfcNumber rfc;
private Rfc3164Config rfc3164;
private readonly PropertyChangedEventHandler rfc3164PropsChanged;
Expand All @@ -25,6 +27,13 @@ public Facility Facility
set => SetProperty(ref facility, value);
}

/// <summary>Log level Syslog severity related fields</summary>
public LogLevelSeverityConfig PerLogLevelSeverity
{
get => perLogLevelSeverity;
set => SetProperty(ref perLogLevelSeverity, value);
}

/// <summary>The Syslog protocol RFC to be followed</summary>
public RfcNumber Rfc
{
Expand All @@ -49,7 +58,11 @@ public Rfc5424Config Rfc5424
/// <summary>Builds a new instance of the MessageBuilderConfig class</summary>
public MessageBuilderConfig()
{
perLogLevelSeverity = new LogLevelSeverityConfig();
perLogLevelSeverityPropsChanged = (sender, args) => OnPropertyChanged(nameof(PerLogLevelSeverity));

rfc = RfcNumber.Rfc5424;

rfc3164 = new Rfc3164Config();
rfc3164PropsChanged = (sender, args) => OnPropertyChanged(nameof(Rfc3164));
rfc3164.PropertyChanged += rfc3164PropsChanged;
Expand All @@ -63,6 +76,7 @@ public MessageBuilderConfig()
/// <summary>Disposes the instance</summary>
public void Dispose()
{
perLogLevelSeverity.PropertyChanged -= perLogLevelSeverityPropsChanged;
rfc3164.PropertyChanged -= rfc3164PropsChanged;
rfc5424.PropertyChanged -= rfc5424PropsChanged;
rfc5424.Dispose();
Expand Down
33 changes: 33 additions & 0 deletions src/NLog.Targets.Syslog/Settings/Severity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Licensed under the BSD license
// See the LICENSE file in the project root for more information

namespace NLog.Targets.Syslog.Settings
{
/// <summary>Syslog severities</summary>
public enum Severity
{
/// <summary>Emergency severity</summary>
Emergency = 0,

/// <summary>Alert severity</summary>
Alert = 1,

/// <summary>Critical severity</summary>
Critical = 2,

/// <summary>Error severity</summary>
Error = 3,

/// <summary>Warning severity</summary>
Warning = 4,

/// <summary>Notice severity</summary>
Notice = 5,

/// <summary>Informational severity</summary>
Informational = 6,

/// <summary>Debug severity</summary>
Debug = 7
}
}
8 changes: 8 additions & 0 deletions src/TestAppWithGUI/NLog.config
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,14 @@
</sl:enforcement>
<sl:messageCreation>
<sl:facility>Local4</sl:facility>
<sl:perLogLevelSeverity>
<sl:fatal>Alert</sl:fatal>
<sl:error>Error</sl:error>
<sl:warn>Warning</sl:warn>
<sl:info>Informational</sl:info>
<sl:debug>Debug</sl:debug>
<sl:trace>Alert</sl:trace>
</sl:perLogLevelSeverity>
<sl:rfc>Rfc5424</sl:rfc>
<sl:rfc3164 hostname="notUsedHostname" tag="notUsedTag" />
<sl:rfc5424>
Expand Down
8 changes: 8 additions & 0 deletions src/TestAppWithTUI/NLog.config
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,14 @@
</sl:enforcement>
<sl:messageCreation>
<sl:facility>Local4</sl:facility>
<sl:perLogLevelSeverity>
<sl:fatal>Critical</sl:fatal>
<sl:error>Error</sl:error>
<sl:warn>Warning</sl:warn>
<sl:info>Informational</sl:info>
<sl:debug>Debug</sl:debug>
<sl:trace>Alert</sl:trace>
</sl:perLogLevelSeverity>
<sl:rfc>Rfc5424</sl:rfc>
<sl:rfc3164 hostname="notUsedHostname" tag="notUsedTag" />
<sl:rfc5424>
Expand Down

0 comments on commit 4f57fd2

Please sign in to comment.