Skip to content

Commit

Permalink
Added a field replica concept so the appender can be configured with …
Browse files Browse the repository at this point in the history
…the same value in two fields for the case when you are migrating from one field name to another.

Made the additional static setup use one method for passing the new settings down.
  • Loading branch information
tylerrbrown committed Oct 8, 2019
1 parent e499021 commit 41f76e6
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 7 deletions.
9 changes: 8 additions & 1 deletion src/log4net.ElasticSearch.Tests/UnitTests/UnitTestContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,16 @@ public static UnitTestContext Create(int bufferSize = BufferSize, bool? failSend
};

appender.AddFieldNameOverride(new FieldNameOverride
{
Original = "timetamp",
Replacement = "timestamp"
}
);

appender.AddFieldValueReplica(new FieldValueReplica
{
Original = "timeStamp",
Replacement = "@timestamp"
Replica = "@timestamp"
}
);

Expand Down
6 changes: 5 additions & 1 deletion src/log4net.ElasticSearch.Tests/logConfig.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
<lossy value="false" />
<fieldNameOverride type="log4net.ElasticSearch.FieldNameOverride, log4net.ElasticSearch">
<original value="timeStamp" />
<replacement value="@timestamp" />
<replacement value="timestamp" />
</fieldNameOverride>
<fieldValueReplica type="log4net.ElasticSearch.FieldValueReplica, log4net.ElasticSearch">
<original value="timeStamp" />
<replica value="@timestamp" />
</fieldValueReplica>
<rollingIndexNameDateFormat value="yyyy-MM-dd" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ALL" />
Expand Down
3 changes: 2 additions & 1 deletion src/log4net.ElasticSearch/CustomDataContractResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace log4net.ElasticSearch
public class CustomDataContractResolver : DefaultContractResolver
{
public Dictionary<string, string> FieldNameChanges { get; set; }
public List<FieldValueReplica> FieldValueReplica { get; set; }

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
Expand All @@ -21,5 +22,5 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ

return property;
}
}
}
}
27 changes: 24 additions & 3 deletions src/log4net.ElasticSearch/ElasticSearchAppender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ public class ElasticSearchAppender : BufferingAppenderSkeleton
const int DefaultOnCloseTimeout = 30000;
readonly ManualResetEvent workQueueEmptyEvent;

int queuedCallbackCount;
IRepository repository;
int queuedCallbackCount;
List<FieldNameOverride> fieldNameOverrides = new List<FieldNameOverride>();
List<FieldValueReplica> fieldValueReplicas = new List<FieldValueReplica>();

public ElasticSearchAppender()
{
Expand Down Expand Up @@ -62,6 +63,11 @@ public void AddFieldNameOverride(FieldNameOverride fieldNameOverride)
fieldNameOverrides.Add(fieldNameOverride);
}

public void AddFieldValueReplica(FieldValueReplica fieldValueReplica)
{
fieldValueReplicas.Add(fieldValueReplica);
}

protected override void SendBuffer(LoggingEvent[] events)
{
BeginAsyncSend();
Expand All @@ -83,7 +89,11 @@ protected virtual IRepository CreateRepository(string connectionString)
log4net.ElasticSearch.Models.Uri.Init(RollingIndexNameDateFormat, IndexTypeName);

var overrides = fieldNameOverrides.ToDictionary(x => x.Original, x => x.Replacement);
var resolver = new CustomDataContractResolver { FieldNameChanges = overrides };
var resolver = new CustomDataContractResolver
{
FieldNameChanges = overrides,
FieldValueReplica = fieldValueReplicas,
};
return Repository.Create(connectionString, resolver);
}

Expand Down Expand Up @@ -149,7 +159,7 @@ static void Validate(string connectionString)
}
}
}

public class FieldNameOverride : IOptionHandler
{
public string Original {get; set;}
Expand All @@ -160,4 +170,15 @@ public void ActivateOptions()
{
}
}

public class FieldValueReplica : IOptionHandler
{
public string Original {get; set;}

public string Replica {get; set;}

public void ActivateOptions()
{
}
}
}
16 changes: 15 additions & 1 deletion src/log4net.ElasticSearch/ExtensionMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data.Common;
using System.Dynamic;
using System.Linq;
using log4net.Core;
using log4net.ElasticSearch.Infrastructure;
Expand Down Expand Up @@ -32,7 +33,20 @@ public static IEnumerable<KeyValuePair<string, string>> Properties(this LoggingE

public static string ToJson<T>(this T self, CustomDataContractResolver resolver)
{
return JsonConvert.SerializeObject(self, new JsonSerializerSettings { ContractResolver = resolver });
var json = JsonConvert.SerializeObject(self, new JsonSerializerSettings { ContractResolver = resolver });

if (resolver.FieldValueReplica != null && resolver.FieldValueReplica.Count > 0)
{
resolver.FieldValueReplica.ForEach(x =>
{
var originalValue = self.GetType().GetProperty(x.Original)?.GetValue(self, null);
var obj = JsonConvert.DeserializeObject<ExpandoObject>(json) as IDictionary<string, Object>;
obj.Add(x.Replica, originalValue);
json = JsonConvert.SerializeObject(obj);
});
}

return json;
}

public static bool Contains(this StringDictionary self, string key)
Expand Down

0 comments on commit 41f76e6

Please sign in to comment.