Skip to content

Commit 183c35e

Browse files
Adapt code to conform to v1.5.0 logging changes (#213)
* Adapt code to conform to v1.5.0 logging changes * upgraded to Akka.NET v1.5.0-beta5 --------- Co-authored-by: Aaron Stannard <[email protected]>
1 parent a4267e7 commit 183c35e

File tree

7 files changed

+100
-127
lines changed

7 files changed

+100
-127
lines changed

NuGet.config

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<configuration>
3+
<packageSources>
4+
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
5+
<clear />
6+
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
7+
</packageSources>
8+
</configuration>

RELEASE_NOTES.md

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,2 @@
1-
#### 1.4.42 September 23 2022 ####
2-
* Updated to [Akka.NET v1.4.42](https://github.com/akkadotnet/akka.net/releases/tag/1.4.42)
3-
* [Bump Serilog from 2.10.0 to 2.12.0](https://github.com/akkadotnet/Akka.Logger.Serilog/pull/191)
4-
5-
#### 1.4.26 October 7 2021 ####
6-
* Updated to [Akka.NET v1.4.26](https://github.com/akkadotnet/akka.net/releases/tag/1.4.26)
7-
8-
#### 1.4.25 September 9 2021 ####
9-
* Updated to [Akka.NET v1.4.25](https://github.com/akkadotnet/akka.net/releases/tag/1.4.25)
10-
11-
#### 1.4.17 March 17 2021 ####
12-
* Updated to [Akka.NET v1.4.17](https://github.com/akkadotnet/akka.net/releases/tag/1.4.17)
13-
* Resolved a Akka.Remote LogSource race condition
1+
#### 1.5.0-beta5 February 28 2023 ####
2+
* Updated to [Akka.NET v1.5.0-beta5](https://github.com/akkadotnet/akka.net/releases/tag/1.5.0-beta5)

src/Akka.Logger.Serilog/SerilogMessageFormatter.cs renamed to src/Akka.Logger.Serilog/SerilogLogMessageFormatter.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class SerilogLogMessageFormatter : ILogMessageFormatter
1515
{
1616
private readonly MessageTemplateCache _templateCache;
1717

18-
public static readonly SerilogLogMessageFormatter Instance = new SerilogLogMessageFormatter();
18+
public static readonly SerilogLogMessageFormatter Instance = new();
1919

2020
/// <summary>
2121
/// Initializes a new instance of the <see cref="SerilogLogMessageFormatter"/> class.
@@ -52,5 +52,18 @@ public string Format(string format, params object[] args)
5252

5353
return template.Render(properties);
5454
}
55+
56+
/// <summary>
57+
/// Converts the specified template string to a text string using the specified
58+
/// token array to match replacements.
59+
/// </summary>
60+
/// <param name="format">The template string used in the conversion.</param>
61+
/// <param name="args">The <see cref="IEnumerable{T}"/> that contains values to replace in the template.</param>
62+
/// <returns>
63+
/// A text string where the template placeholders have been replaced with
64+
/// their corresponding values.
65+
/// </returns>
66+
public string Format(string format, IEnumerable<object> args)
67+
=> Format(format, args.ToArray());
5568
}
5669
}

src/Akka.Logger.Serilog/SerilogLogger.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//-----------------------------------------------------------------------
77

88
using System.Linq;
9+
using System.Runtime.CompilerServices;
910
using Akka.Actor;
1011
using Akka.Dispatch;
1112
using Akka.Event;
@@ -25,6 +26,7 @@ public class SerilogLogger : ReceiveActor, IRequiresMessageQueue<ILoggerMessageQ
2526
{
2627
private readonly ILoggingAdapter _log = Logging.GetLogger(Context.System.EventStream, "SerilogLogger");
2728

29+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2830
private static string GetFormat(object message)
2931
{
3032
return message is LogMessage logMessage ? logMessage.Format : "{Message:l}";
@@ -33,7 +35,7 @@ private static string GetFormat(object message)
3335
private static object[] GetArgs(object message)
3436
{
3537
var logMessage = message as LogMessage;
36-
return logMessage?.Args.Where(a => !(a is PropertyEnricher)).ToArray() ?? new[] { message };
38+
return logMessage?.Parameters().Where(a => a is not PropertyEnricher).ToArray() ?? new[] { message };
3739
}
3840

3941
private static ILogger GetLogger(LogEvent logEvent) {
@@ -42,46 +44,44 @@ private static ILogger GetLogger(LogEvent logEvent) {
4244
.ForContext("ActorPath", Context.Sender.Path)
4345
.ForContext("Timestamp", logEvent.Timestamp)
4446
.ForContext("LogSource", logEvent.LogSource)
45-
.ForContext("Thread", logEvent.Thread.ManagedThreadId.ToString().PadLeft( 4, '0' ));
47+
.ForContext("Thread", logEvent.Thread.ManagedThreadId.ToString("0000"));
4648

47-
var logMessage = logEvent.Message as LogMessage;
48-
if (logMessage != null)
49+
if (logEvent.Message is SerilogPayload logMessage)
4950
{
50-
logger = logMessage.Args.OfType<PropertyEnricher>().Aggregate(logger, (current, enricher) => current.ForContext(enricher));
51+
logger = logMessage.Enrichers.OfType<PropertyEnricher>().Aggregate(logger, (current, enricher) => current.ForContext(enricher));
5152
}
5253

5354
return logger;
5455
}
5556

5657
private static void Handle(Error logEvent) {
57-
5858
GetLogger(logEvent).Error(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
5959
}
6060

6161
private static void Handle(Warning logEvent) {
62-
GetLogger(logEvent).Warning(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
62+
GetLogger(logEvent).Warning(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
6363
}
6464

6565
private static void Handle(Info logEvent)
6666
{
67-
GetLogger(logEvent).Information(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
67+
GetLogger(logEvent).Information(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
6868
}
6969

7070
private static void Handle(Debug logEvent)
7171
{
72-
GetLogger(logEvent).Debug(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
72+
GetLogger(logEvent).Debug(logEvent.Cause, GetFormat(logEvent.Message), GetArgs(logEvent.Message));
7373
}
7474

7575
/// <summary>
7676
/// Initializes a new instance of the <see cref="SerilogLogger"/> class.
7777
/// </summary>
7878
public SerilogLogger()
7979
{
80-
Receive<Error>(m => Handle(m));
81-
Receive<Warning>(m => Handle(m));
82-
Receive<Info>(m => Handle(m));
83-
Receive<Debug>(m => Handle(m));
84-
Receive<InitializeLogger>(m =>
80+
Receive<Error>(Handle);
81+
Receive<Warning>(Handle);
82+
Receive<Info>(Handle);
83+
Receive<Debug>(Handle);
84+
Receive<InitializeLogger>(_ =>
8585
{
8686
_log.Info("SerilogLogger started");
8787
Sender.Tell(new LoggerInitialized());

src/Akka.Logger.Serilog/SerilogLoggingAdapter.cs

Lines changed: 57 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,25 @@
77

88
namespace Akka.Logger.Serilog
99
{
10-
public class SerilogLoggingAdapter : BusLogging
10+
internal readonly struct SerilogPayload
11+
{
12+
public SerilogPayload(object message, IReadOnlyList<ILogEventEnricher> enrichers)
13+
{
14+
Message = message;
15+
Enrichers = enrichers;
16+
}
17+
18+
public IReadOnlyList<ILogEventEnricher> Enrichers { get; }
19+
20+
public object Message { get; }
21+
22+
public override string ToString()
23+
{
24+
return Message.ToString();
25+
}
26+
}
27+
28+
public class SerilogLoggingAdapter : LoggingAdapterBase
1129
{
1230
private readonly LoggingBus _bus;
1331
private readonly Type _logClass;
@@ -29,98 +47,36 @@ public SerilogLoggingAdapter(LoggingBus bus, string logSource, Type logClass) :
2947
{
3048
}
3149

32-
private SerilogLoggingAdapter(LoggingBus bus, string logSource, Type logClass, ContextNode enricher) : base(bus, logSource, logClass, SerilogLogMessageFormatter.Instance)
50+
private SerilogLoggingAdapter(LoggingBus bus, string logSource, Type logClass, ContextNode enricher) : base(SerilogLogMessageFormatter.Instance)
3351
{
3452
_bus = bus;
3553
_logSource = logSource;
3654
_logClass = logClass;
3755
_enricherNode = enricher;
56+
57+
IsErrorEnabled = bus.LogLevel <= LogLevel.ErrorLevel;
58+
IsWarningEnabled = bus.LogLevel <= LogLevel.WarningLevel;
59+
IsInfoEnabled = bus.LogLevel <= LogLevel.InfoLevel;
60+
IsDebugEnabled = bus.LogLevel <= LogLevel.DebugLevel;
3861
}
62+
63+
private LogEvent CreateLogEvent(LogLevel logLevel, object message, Exception cause = null)
64+
=> logLevel switch
65+
{
66+
LogLevel.DebugLevel => new Debug(cause, _logSource, _logClass, BuildMessage(message)),
67+
LogLevel.InfoLevel => new Info(cause, _logSource, _logClass, BuildMessage(message)),
68+
LogLevel.WarningLevel => new Warning(cause, _logSource, _logClass, BuildMessage(message)),
69+
LogLevel.ErrorLevel => new Error(cause, _logSource, _logClass, BuildMessage(message)),
70+
_ => throw new ArgumentOutOfRangeException(nameof(logLevel), logLevel, null)
71+
};
3972

40-
/// <summary>
41-
/// Logs a <see cref="F:Akka.Event.LogLevel.DebugLevel" /> message.
42-
/// </summary>
43-
/// <param name="format">The message that is being logged.</param>
44-
/// <param name="args">An optional list of items used to format the message.</param>
45-
public override void Debug(string format, params object[] args)
46-
{
47-
base.Debug(format, BuildArgs(args));
48-
}
49-
50-
/// <summary>
51-
/// Logs a <see cref="F:Akka.Event.LogLevel.InfoLevel" /> message.
52-
/// </summary>
53-
/// <param name="format">The message that is being logged.</param>
54-
/// <param name="args">An optional list of items used to format the message.</param>
55-
public override void Info(string format, params object[] args)
56-
{
57-
base.Info(format, BuildArgs(args));
58-
}
59-
60-
public override void Info(Exception cause, string format, params object[] args)
61-
{
62-
base.Info(cause, format, BuildArgs(args));
63-
}
64-
65-
public override void Debug(Exception cause, string format, params object[] args)
66-
{
67-
base.Debug(cause, format, BuildArgs(args));
68-
}
69-
70-
/// <summary>
71-
/// Obsolete. Use <see cref="M:Akka.Event.ILoggingAdapter.Warning(System.String,System.Object[])" /> instead!
72-
/// </summary>
73-
/// <param name="format">The message that is being logged.</param>
74-
/// <param name="args">An optional list of items used to format the message.</param>
75-
public override void Warn(string format, params object[] args)
76-
{
77-
base.Warning(format, BuildArgs(args));
78-
}
79-
80-
public override void Warning(Exception cause, string format, params object[] args)
81-
{
82-
base.Warning(cause, format, BuildArgs(args));
83-
}
84-
85-
/// <summary>
86-
/// Logs a <see cref="F:Akka.Event.LogLevel.WarningLevel" /> message.
87-
/// </summary>
88-
/// <param name="format">The message that is being logged.</param>
89-
/// <param name="args">An optional list of items used to format the message.</param>
90-
public override void Warning(string format, params object[] args)
91-
{
92-
base.Warning(format, BuildArgs(args));
93-
}
94-
95-
/// <summary>
96-
/// Logs a <see cref="F:Akka.Event.LogLevel.ErrorLevel" /> message.
97-
/// </summary>
98-
/// <param name="format">The message that is being logged.</param>
99-
/// <param name="args">An optional list of items used to format the message.</param>
100-
public override void Error(string format, params object[] args)
101-
{
102-
base.Error(format, BuildArgs(args));
103-
}
104-
105-
/// <summary>
106-
/// Logs a <see cref="F:Akka.Event.LogLevel.ErrorLevel" /> message and associated exception.
107-
/// </summary>
108-
/// <param name="cause">The exception associated with this message.</param>
109-
/// <param name="format">The message that is being logged.</param>
110-
/// <param name="args">An optional list of items used to format the message.</param>
111-
public override void Error(Exception cause, string format, params object[] args)
112-
{
113-
base.Error(cause, format, BuildArgs(args));
114-
}
73+
protected override void NotifyLog(LogLevel logLevel, object message, Exception cause = null)
74+
=> _bus.Publish(CreateLogEvent(logLevel, message, cause));
11575

116-
/// <summary>Logs a message with a specified level.</summary>
117-
/// <param name="logLevel">The level used to log the message.</param>
118-
/// <param name="format">The message that is being logged.</param>
119-
/// <param name="args">An optional list of items used to format the message.</param>
120-
public override void Log(LogLevel logLevel, string format, params object[] args)
121-
{
122-
base.Log(logLevel, format, BuildArgs(args));
123-
}
76+
public override bool IsDebugEnabled { get; }
77+
public override bool IsInfoEnabled { get; }
78+
public override bool IsWarningEnabled { get; }
79+
public override bool IsErrorEnabled { get; }
12480

12581
public ILoggingAdapter SetContextProperty(string name, object value, bool destructureObjects = false)
12682
{
@@ -134,20 +90,26 @@ public ILoggingAdapter SetContextProperty(string name, object value, bool destru
13490

13591
return new SerilogLoggingAdapter(_bus, _logSource, _logClass, contextNode);
13692
}
93+
94+
private object BuildMessage(object message)
95+
{
96+
return new SerilogPayload(message, BuildArgs());
97+
}
13798

138-
private object[] BuildArgs(IEnumerable<object> args)
99+
private IReadOnlyList<ILogEventEnricher> BuildArgs()
139100
{
140-
var newArgs = args.ToList();
141-
if (_enricherNode != null)
101+
if (_enricherNode == null)
102+
return Array.Empty<ILogEventEnricher>();
103+
104+
var newArgs = new List<ILogEventEnricher>();
105+
var currentNode = _enricherNode;
106+
while (currentNode != null)
142107
{
143-
var currentNode = _enricherNode;
144-
while (currentNode != null)
145-
{
146-
newArgs.Add(currentNode.Enricher);
147-
currentNode = currentNode.Next;
148-
}
108+
newArgs.Add(currentNode.Enricher);
109+
currentNode = currentNode.Next;
149110
}
150-
return newArgs.ToArray();
111+
112+
return newArgs;
151113
}
152114
}
153115
}

src/Akka.Logger.Serilog/SerilogLoggingAdapterExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static class SerilogLoggingAdapterExtensions
1515
/// <param name="destructureObjects">If true, the value will be serialized as a structured object if possible; if false, the object will be recorded as a scalar or simple array.</param>
1616
public static ILoggingAdapter ForContext(this ILoggingAdapter adapter, string propertyName, object value, bool destructureObjects = false)
1717
{
18-
return !(adapter is SerilogLoggingAdapter customAdapter) ? adapter : customAdapter.SetContextProperty(propertyName, value, destructureObjects);
18+
return adapter is not SerilogLoggingAdapter customAdapter ? adapter : customAdapter.SetContextProperty(propertyName, value, destructureObjects);
1919
}
2020

2121
/// <summary>

src/common.props

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@
33
<PackageTags>akka;actors;actor model;Akka;concurrency;serilog</PackageTags>
44
<Copyright>Copyright © 2013-2021 Akka.NET Team</Copyright>
55
<Authors>Akka.NET Team</Authors>
6-
<PackageReleaseNotes>Updated Akka.Logger.Serilog to [Akka.NET v1.4.3](https://getakka.net/community/whats-new/akkadotnet-v1.4.html)</PackageReleaseNotes>
7-
<VersionPrefix>1.4.3</VersionPrefix>
6+
<PackageReleaseNotes>Updated to [Akka.NET v1.5.0-beta5](https://github.com/akkadotnet/akka.net/releases/tag/1.5.0-beta5)</PackageReleaseNotes>
7+
<VersionPrefix>1.5.0</VersionPrefix>
88
<PackageIconUrl>http://getakka.net/images/akkalogo.png</PackageIconUrl>
99
<PackageProjectUrl>https://github.com/akkadotnet/Akka.Logger.Serilog</PackageProjectUrl>
1010
<PackageLicenseUrl>https://github.com/akkadotnet/Akka.Logger.Serilog/blob/master/LICENSE</PackageLicenseUrl>
1111
<NoWarn>$(NoWarn);CS1591</NoWarn>
12+
<LangVersion>10</LangVersion>
1213
</PropertyGroup>
1314
<PropertyGroup>
1415
<XunitVersion>2.4.2</XunitVersion>
1516
<XunitRunnerVersion>2.4.5</XunitRunnerVersion>
1617
<TestSdkVersion>17.4.1</TestSdkVersion>
1718
<NBenchVersion>2.0.1</NBenchVersion>
18-
<AkkaVersion>1.4.49</AkkaVersion>
19+
<AkkaVersion>1.5.0-beta5</AkkaVersion>
1920
<NetCoreTestVersion>netcoreapp3.1</NetCoreTestVersion>
2021
<NetFrameworkTestVersion>net471</NetFrameworkTestVersion>
2122
<NetStandardLibVersion>netstandard2.0</NetStandardLibVersion>

0 commit comments

Comments
 (0)