diff --git a/Source/EasyGelf.Core/GelfMessageSerializer.cs b/Source/EasyGelf.Core/GelfMessageSerializer.cs index 03fcf5c..5bc0567 100644 --- a/Source/EasyGelf.Core/GelfMessageSerializer.cs +++ b/Source/EasyGelf.Core/GelfMessageSerializer.cs @@ -10,23 +10,40 @@ public interface IGelfMessageSerializer public sealed class GelfMessageSerializer : IGelfMessageSerializer { + private readonly IEasyGelfLogger _logger; + + public GelfMessageSerializer(IEasyGelfLogger logger) + { + _logger = logger; + } + public byte[] Serialize(GelfMessage message) { var duration = message.Timestamp.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); var result = new JsonObject - { - {"version", message.Version}, - {"host", message.Host}, - {"short_message", message.ShortMessage}, - {"full_message", message.FullMessage}, - {"timestamp", Math.Round(duration.TotalSeconds, 3, MidpointRounding.AwayFromZero)}, - {"level", (int)message.Level} - }; + { + {"version", message.Version}, + {"host", message.Host}, + {"short_message", message.ShortMessage}, + {"full_message", message.FullMessage}, + {"timestamp", Math.Round(duration.TotalSeconds, 3, MidpointRounding.AwayFromZero)}, + {"level", (int) message.Level} + }; foreach (var additionalField in message.AdditionalFields) { var key = additionalField.Key; var value = additionalField.Value; - result.Add(key.StartsWith("_") ? key : "_" + key, value); + var prefixedKey = key.StartsWith("_") ? key : "_" + key; + if (!result.ContainsKey(prefixedKey)) + { + result.Add(prefixedKey, value); + } + else + { + _logger.Debug(string.Format( + "Duplicate key {0} found. Key collisions are resolved by favoring the first key-value to be added.", + prefixedKey)); + } } return Encoding.UTF8.GetBytes(result.ToString()); } diff --git a/Source/EasyGelf.Core/Transports/Tcp/TcpTransportFactory.cs b/Source/EasyGelf.Core/Transports/Tcp/TcpTransportFactory.cs index 6e24f29..d8f7d8e 100644 --- a/Source/EasyGelf.Core/Transports/Tcp/TcpTransportFactory.cs +++ b/Source/EasyGelf.Core/Transports/Tcp/TcpTransportFactory.cs @@ -9,16 +9,11 @@ namespace EasyGelf.Core.Transports.Tcp { public class TcpTransportFactory { - public static ITransport Produce(TcpTransportConfiguration configuration) + public static ITransport Produce(TcpTransportConfiguration configuration, IEasyGelfLogger logger) { - if (configuration.Ssl) - { - return new TcpTransport(configuration, new GelfMessageSerializer(), () => new TcpSslConnection(configuration)); - } - else - { - return new TcpTransport(configuration, new GelfMessageSerializer(), () => new TcpConnection(configuration)); - } + return configuration.Ssl + ? new TcpTransport(configuration, new GelfMessageSerializer(logger), () => new TcpSslConnection(configuration)) + : new TcpTransport(configuration, new GelfMessageSerializer(logger), () => new TcpConnection(configuration)); } } } diff --git a/Source/EasyGelf.Log4Net/GelfAmqpAppender.cs b/Source/EasyGelf.Log4Net/GelfAmqpAppender.cs index 97a0ef7..ece8f55 100644 --- a/Source/EasyGelf.Log4Net/GelfAmqpAppender.cs +++ b/Source/EasyGelf.Log4Net/GelfAmqpAppender.cs @@ -44,7 +44,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) Persistent = Persistent, }; var encoder = new CompositeEncoder(new GZipEncoder(), new ChunkingEncoder(new MessageBasedIdGenerator(), MessageSize)); - return new AmqpTransport(configuration, encoder, new GelfMessageSerializer()); + return new AmqpTransport(configuration, encoder, new GelfMessageSerializer(logger)); } } } \ No newline at end of file diff --git a/Source/EasyGelf.Log4Net/GelfTcpAppender.cs b/Source/EasyGelf.Log4Net/GelfTcpAppender.cs index c919bb0..cd44d65 100644 --- a/Source/EasyGelf.Log4Net/GelfTcpAppender.cs +++ b/Source/EasyGelf.Log4Net/GelfTcpAppender.cs @@ -36,7 +36,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) Timeout = Timeout }; - return TcpTransportFactory.Produce(configuration); + return TcpTransportFactory.Produce(configuration, logger); } } } \ No newline at end of file diff --git a/Source/EasyGelf.Log4Net/GelfUdpAppender.cs b/Source/EasyGelf.Log4Net/GelfUdpAppender.cs index ff5cf7e..ba5c103 100644 --- a/Source/EasyGelf.Log4Net/GelfUdpAppender.cs +++ b/Source/EasyGelf.Log4Net/GelfUdpAppender.cs @@ -29,7 +29,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) RemoteAddress = RemoteAddress, RemotePort = RemotePort }; - return new UdpTransport(configuration, encoder, new GelfMessageSerializer()); + return new UdpTransport(configuration, encoder, new GelfMessageSerializer(logger)); } } } \ No newline at end of file diff --git a/Source/EasyGelf.NLog.Example/EntryPoint.cs b/Source/EasyGelf.NLog.Example/EntryPoint.cs index 2a419d1..fed1a2b 100644 --- a/Source/EasyGelf.NLog.Example/EntryPoint.cs +++ b/Source/EasyGelf.NLog.Example/EntryPoint.cs @@ -22,7 +22,7 @@ public static void Main() } catch (Exception ex) { - Log.Error("Descriptive message example", ex); + Log.Error(ex, "Descriptive message example"); } Thread.Sleep(TimeSpan.FromSeconds(0.5)); diff --git a/Source/EasyGelf.NLog/GelfAmqpTarget.cs b/Source/EasyGelf.NLog/GelfAmqpTarget.cs index 7c3e8e3..6bc3ed2 100644 --- a/Source/EasyGelf.NLog/GelfAmqpTarget.cs +++ b/Source/EasyGelf.NLog/GelfAmqpTarget.cs @@ -46,7 +46,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) RoutingKey = RoutingKey, Persistent = Persistent }; - return new AmqpTransport(configuration, encoder, new GelfMessageSerializer()); + return new AmqpTransport(configuration, encoder, new GelfMessageSerializer(logger)); } } } \ No newline at end of file diff --git a/Source/EasyGelf.NLog/GelfHttpTarget.cs b/Source/EasyGelf.NLog/GelfHttpTarget.cs index 1b12d74..8359df8 100644 --- a/Source/EasyGelf.NLog/GelfHttpTarget.cs +++ b/Source/EasyGelf.NLog/GelfHttpTarget.cs @@ -34,7 +34,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) Port = RemotePort }; - return new HttpTransport(configuration, new GelfMessageSerializer()); + return new HttpTransport(configuration, new GelfMessageSerializer(logger)); } } } diff --git a/Source/EasyGelf.NLog/GelfTcpTarget.cs b/Source/EasyGelf.NLog/GelfTcpTarget.cs index f18fc94..3878973 100644 --- a/Source/EasyGelf.NLog/GelfTcpTarget.cs +++ b/Source/EasyGelf.NLog/GelfTcpTarget.cs @@ -38,7 +38,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) Timeout = Timeout }; - return TcpTransportFactory.Produce(configuration); + return TcpTransportFactory.Produce(configuration, logger); } } } \ No newline at end of file diff --git a/Source/EasyGelf.NLog/GelfUdpTarget.cs b/Source/EasyGelf.NLog/GelfUdpTarget.cs index 3984409..38552d0 100644 --- a/Source/EasyGelf.NLog/GelfUdpTarget.cs +++ b/Source/EasyGelf.NLog/GelfUdpTarget.cs @@ -31,7 +31,7 @@ protected override ITransport InitializeTransport(IEasyGelfLogger logger) RemoteAddress = RemoteAddress, RemotePort = RemotePort }; - return new UdpTransport(configuration, encoder, new GelfMessageSerializer()); + return new UdpTransport(configuration, encoder, new GelfMessageSerializer(logger)); } } } \ No newline at end of file diff --git a/Source/EasyGelf.Tests/Core/GelfMessageSerializerTests.cs b/Source/EasyGelf.Tests/Core/GelfMessageSerializerTests.cs index 93466c0..617d31a 100644 --- a/Source/EasyGelf.Tests/Core/GelfMessageSerializerTests.cs +++ b/Source/EasyGelf.Tests/Core/GelfMessageSerializerTests.cs @@ -13,7 +13,7 @@ public class GelfMessageSerializerTests [SetUp] public void SetUp() { - serializer = new GelfMessageSerializer(); + serializer = new GelfMessageSerializer(new SilentLogger()); } [Test]