Skip to content

Commit

Permalink
pipe grpc core logs through serilog with structuring
Browse files Browse the repository at this point in the history
  • Loading branch information
thefringeninja committed Dec 10, 2021
1 parent 18b9730 commit f1b04d5
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ private static void ConfigureLogging() {
.WriteTo.Observers(observable => observable.Subscribe(LogEventSubject.OnNext))
.WriteTo.Seq("http://localhost:5341/", period: TimeSpan.FromMilliseconds(1));
Log.Logger = loggerConfiguration.CreateLogger();

#if GRPC_CORE
GrpcEnvironment.SetLogger(new GrpcCoreSerilogLogger(Log.Logger.ForContext<GrpcCoreSerilogLogger>()));
#endif
AppDomain.CurrentDomain.DomainUnload += (_, e) => Log.CloseAndFlush();
}

Expand Down
91 changes: 91 additions & 0 deletions test/EventStore.Client.Tests.Common/GrpcCoreSerilogLogger.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#if GRPC_CORE
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using Grpc.Core.Logging;

namespace EventStore.Client {
internal class GrpcCoreSerilogLogger : ILogger {
private readonly Serilog.ILogger _inner;

public GrpcCoreSerilogLogger(Serilog.ILogger inner) => _inner = inner;
public ILogger ForType<T>() => new GrpcCoreSerilogLogger(_inner.ForContext<T>());
public void Debug(string format, params object[] formatArgs) => _inner.Debug(format, formatArgs);
public void Info(string format, params object[] formatArgs) => _inner.Information(format, formatArgs);
public void Warning(string format, params object[] formatArgs) => _inner.Warning(format, formatArgs);
public void Error(string format, params object[] formatArgs) => _inner.Error(format, formatArgs);

public void Debug(string message) {
var (format, formatArgs) = ConvertToMessageTemplate(message);
_inner.Debug(format, formatArgs);
}

public void Info(string message) {
var (format, formatArgs) = ConvertToMessageTemplate(message);
_inner.Information(format, formatArgs);
}

public void Warning(string message) {
var (format, formatArgs) = ConvertToMessageTemplate(message);
_inner.Warning(format, formatArgs);
}

public void Warning(Exception exception, string message) {
var (format, formatArgs) = ConvertToMessageTemplate(message);
_inner.Warning(exception, format, formatArgs);
}

public void Error(string message) {
var (format, formatArgs) = ConvertToMessageTemplate(message);
_inner.Error(format, formatArgs);
}

public void Error(Exception exception, string message) {
var (format, formatArgs) = ConvertToMessageTemplate(message);
_inner.Error(exception, format, formatArgs);
}

private static (string, object[]) ConvertToMessageTemplate(string rawMessage) {
var index = rawMessage.IndexOf(':');
if (index < 0) {
return (rawMessage, Array.Empty<object>());
}
var sourceFileRange = 16..index;
var lineNumberRange =
(sourceFileRange.End.Value + 1)..rawMessage.IndexOf(':', sourceFileRange.End.Value + 1);
var messageRange = (rawMessage.LastIndexOf(':') + 2)..;
var propertiesRange = (lineNumberRange.End.Value + 2)..(messageRange.Start.Value - 2);

var sourceFile = rawMessage[sourceFileRange];
var lineNumber = Convert.ToInt32(rawMessage[lineNumberRange]);
var message = rawMessage[messageRange];

var properties = propertiesRange.End.Value <= propertiesRange.Start.Value
? (IDictionary<string, string>)ImmutableDictionary<string, string>.Empty
: rawMessage[propertiesRange].Split(' ')
.Select(pair => pair.Split('='))
.ToDictionary(parts => parts[0], parts => parts[1]);

var messageTemplateBuilder = new StringBuilder("{sourceFile}:{lineNumber} ");
var formatArgs = new object[3 + properties.Count];
formatArgs[0] = sourceFile;
formatArgs[1] = lineNumber;
var i = 0;
using var enumerator = properties.GetEnumerator();
while (i < properties.Count) {
enumerator.MoveNext();
formatArgs[i + 2] = enumerator.Current.Value;
messageTemplateBuilder.Append($"{enumerator.Current.Key}={{{enumerator.Current.Key}}} ");
i++;
}

messageTemplateBuilder.Append(message);
formatArgs[^1] = rawMessage;

return (messageTemplateBuilder.ToString(), formatArgs);
}
}
}
#endif

0 comments on commit f1b04d5

Please sign in to comment.