diff --git a/README.md b/README.md index 4cbde6d..e8b0e5e 100644 --- a/README.md +++ b/README.md @@ -8,21 +8,17 @@ This is the NLog integration plugin for Akka.NET. ### Configuration via code ```C# // Step 1. Create configuration object -var config = new LoggingConfiguration(); +var config = new NLog.Config.LoggingConfiguration(); -// Step 2. Create targets and add them to the configuration -var consoleTarget = new ColoredConsoleTarget(); -config.AddTarget("console", consoleTarget); +// Step 2. Create targets and configure properties +var logconsole = new NLog.Targets.ConsoleTarget("logconsole"); +logconsole.Layout = @"${date:format=HH\:mm\:ss} ${level} ${logger} ${message}"; -// Step 3. Set target properties -consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"; - -// Step 4. Define rules -var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget); -config.LoggingRules.Add(rule1); - -// Step 5. Activate the configuration -LogManager.Configuration = config; +// Step 3. Define filtering rules +config.AddRule(LogLevel.Debug, LogLevel.Fatal, logconsole); + +// Step 4. Activate the configuration +NLog.LogManager.Configuration = config; Config myConfig = @"akka.loglevel = DEBUG akka.loggers=[""Akka.Logger.NLog.NLogLogger, Akka.Logger.NLog""]"; @@ -36,7 +32,7 @@ Add NLog.config file to your project  - + diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 13306e5..8bcdc4a 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,8 +1,18 @@ -#### 1.3.5 Januari 12 2020 #### +#### 1.4.5 May 4 2020 #### + +- Update Akka to 1.4.5 +- Update NLog to 4.7.0 + +#### 1.4.2 March 14 2020 #### + +Updated to Akka 1.4.2 +Changed TargetFramework to NetStandard2.0 + +#### 1.3.5 January 28 2020 #### Changed TargetFramework from net462 to net452 -#### 1.3.4 Januari 12 2020 #### +#### 1.3.4 January 12 2020 #### Update to Akka 1.3.17 Update to NLog 4.5.11 @@ -27,7 +37,7 @@ Support for Akka 1.3.0 and .NET Core Support for Akka 1.2.0 Updated to NLog 4.4.6 -#### 1.1.3 Januari 26 2017 #### +#### 1.1.3 January 26 2017 #### Support for Akka 1.1.3 Updated to NLog 4.3.2 diff --git a/build-system/windows-pr-validation.yaml b/build-system/windows-pr-validation.yaml index 47f6ea3..0b50b03 100644 --- a/build-system/windows-pr-validation.yaml +++ b/build-system/windows-pr-validation.yaml @@ -17,6 +17,6 @@ jobs: - template: azure-pipeline.template.yaml parameters: name: Windows - vmImage: 'vs2017-win2016' + vmImage: 'windows-2019' scriptFileName: build.cmd scriptArgs: all \ No newline at end of file diff --git a/src/Akka.Logger.NLog.Tests/Akka.Logger.NLog.Tests.csproj b/src/Akka.Logger.NLog.Tests/Akka.Logger.NLog.Tests.csproj index 0968de5..86a5a2b 100644 --- a/src/Akka.Logger.NLog.Tests/Akka.Logger.NLog.Tests.csproj +++ b/src/Akka.Logger.NLog.Tests/Akka.Logger.NLog.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Akka.Logger.NLog.Tests/NLogFormattingSpecs.cs b/src/Akka.Logger.NLog.Tests/NLogFormattingSpecs.cs index 8b7c422..5962e67 100644 --- a/src/Akka.Logger.NLog.Tests/NLogFormattingSpecs.cs +++ b/src/Akka.Logger.NLog.Tests/NLogFormattingSpecs.cs @@ -1,31 +1,30 @@ -using System; using System.Linq; +using System.Threading; using Akka.Actor; using Akka.Configuration; using Akka.Event; using Xunit; using Xunit.Abstractions; +using LogLevel = Akka.Event.LogLevel; -namespace Akka.Logger.Serilog.Tests +namespace Akka.Logger.NLog.Tests { public class NLogFormattingSpecs : TestKit.Xunit2.TestKit { - public static readonly Config Config = @"akka.loglevel = DEBUG"; + private static readonly Config Config = @"akka.loglevel = DEBUG"; private readonly ILoggingAdapter _loggingAdapter; - private readonly global::NLog.Targets.MemoryTarget _loggingTarget = new global::NLog.Targets.MemoryTarget() { Layout = "${level}|${message}" }; + const string ActorSystemName = "my-test-system"; public NLogFormattingSpecs(ITestOutputHelper helper) : base(Config, output: helper) { Config myConfig = @"akka.loglevel = DEBUG akka.loggers=[""Akka.Logger.NLog.NLogLogger, Akka.Logger.NLog""]"; - var system = ActorSystem.Create("my-test-system", myConfig); + var system = ActorSystem.Create(ActorSystemName, myConfig); _loggingAdapter = Logging.GetLogger(system.EventStream, system.Name); - global::NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(_loggingTarget); - Sys.EventStream.Subscribe(TestActor, typeof(LogEvent)); } @@ -38,19 +37,49 @@ public NLogFormattingSpecs(ITestOutputHelper helper) : base(Config, output: help [InlineData(LogLevel.ErrorLevel, "test case {c}", new object[] { 3.0 }, "Error|test case 3")] public void LoggingTest(LogLevel level, string formatStr, object[] formatArgs, string resultStr) { - _loggingTarget.Logs.Clear(); + var loggingTarget = new global::NLog.Targets.MemoryTarget { Layout = "${level}|${message}" }; + global::NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(loggingTarget); + + loggingTarget.Logs.Clear(); + _loggingAdapter.Log(level, formatStr, formatArgs); + + for (var i = 0; i < 100; ++i) + { + if (loggingTarget.Logs.Count != 0) + break; + + Thread.Sleep(10); + } + + Assert.NotEmpty(loggingTarget.Logs); + Assert.Equal(resultStr, loggingTarget.Logs.Last()); + } + + [Theory] + [InlineData(LogLevel.InfoLevel, "test case {0}", new object[] { 1 }, "{0}|{1}|test case 1")] + public void LoggingTestWithEventProperties(LogLevel level, string formatStr, object[] formatArgs, string resultStr) + { + _loggingAdapter.Log(level, formatStr, formatArgs); + var loggingTarget = new global::NLog.Targets.MemoryTarget + {Layout = "${event-properties:item=logSource}|${event-properties:item=threadId:format=D4}|${message}" }; + global::NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(loggingTarget); + + loggingTarget.Logs.Clear(); _loggingAdapter.Log(level, formatStr, formatArgs); - for (int i = 0; i < 100; ++i) + for (var i = 0; i < 100; ++i) { - if (_loggingTarget.Logs.Count != 0) + if (loggingTarget.Logs.Count != 0) break; - System.Threading.Thread.Sleep(10); + Thread.Sleep(10); } - Assert.NotEmpty(_loggingTarget.Logs); - Assert.Equal(resultStr, _loggingTarget.Logs.Last()); + var formattedResultString = string.Format(resultStr, ActorSystemName, + Thread.CurrentThread.ManagedThreadId.ToString().PadLeft(4, '0')); + + Assert.NotEmpty(loggingTarget.Logs); + Assert.Equal(formattedResultString, loggingTarget.Logs.Last()); } } } diff --git a/src/Akka.Logger.NLog/Akka.Logger.NLog.csproj b/src/Akka.Logger.NLog/Akka.Logger.NLog.csproj index 6b691c9..f2776bb 100644 --- a/src/Akka.Logger.NLog/Akka.Logger.NLog.csproj +++ b/src/Akka.Logger.NLog/Akka.Logger.NLog.csproj @@ -1,12 +1,12 @@  - net452;netstandard1.6 + netstandard2.0 NLog logging adapter for Akka.NET. true - - + + diff --git a/src/Akka.Logger.NLog/NLog.Example.config b/src/Akka.Logger.NLog/NLog.Example.config index caf2d94..7166512 100644 --- a/src/Akka.Logger.NLog/NLog.Example.config +++ b/src/Akka.Logger.NLog/NLog.Example.config @@ -2,7 +2,7 @@ - + diff --git a/src/Akka.Logger.NLog/NLogLogger.cs b/src/Akka.Logger.NLog/NLogLogger.cs index a6c89c3..ee148ef 100644 --- a/src/Akka.Logger.NLog/NLogLogger.cs +++ b/src/Akka.Logger.NLog/NLogLogger.cs @@ -39,10 +39,10 @@ private static void Log(LogEvent logEvent, Action logStatemen /// public NLogLogger() { - Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Error, logEvent.LogSource, m.Cause, logEvent.Message))); - Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Warn, logEvent.LogSource, logEvent.Message))); - Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Info, logEvent.LogSource, logEvent.Message))); - Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Debug, logEvent.LogSource, logEvent.Message))); + Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Error, logEvent.Cause, logEvent))); + Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Warn, logEvent.Cause, logEvent))); + Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Info, logEvent.Cause, logEvent))); + Receive(m => Log(m, (logger, logEvent) => LogEvent(logger, NLogLevel.Debug, logEvent.Cause, logEvent))); Receive(m => { _log.Info("NLogLogger started"); @@ -50,22 +50,20 @@ public NLogLogger() }); } - private static void LogEvent(NLogger logger, NLogLevel level, string logSource, object message) - { - LogEvent(logger, level, logSource, null, message); - } - - private static void LogEvent(NLogger logger, NLogLevel level, string logSource, Exception exception, object message) + private static void LogEvent(NLogger logger, NLogLevel level, Exception exception, LogEvent logEvent) { if (logger.IsEnabled(level)) { - LogMessage logMessage = message as LogMessage; - var logEvent = (logMessage != null && logMessage.Args?.Length > 0) ? + LogMessage logMessage = logEvent.Message as LogMessage; + var logEventInfo = (logMessage != null && logMessage.Args?.Length > 0) ? new LogEventInfo(level, logger.Name, null, logMessage.Format, logMessage.Args, exception) : - new LogEventInfo(level, logger.Name, null, "{0}", new[] { message }, exception); - logEvent.Properties["logSource"] = logSource; // TODO logSource is the same as logger.Name, now adding twice - logEvent.Properties["SourceContext"] = Context?.Sender?.Path?.ToString() ?? string.Empty; // Same as Serilog - logger.Log(logEvent); + new LogEventInfo(level, logger.Name, null, "{0}", new[] { logEvent.Message.ToString() }, exception); + if (logEventInfo.TimeStamp.Kind == logEvent.Timestamp.Kind) + logEventInfo.TimeStamp = logEvent.Timestamp; // Timestamp of original LogEvent (instead of async Logger thread timestamp) + logEventInfo.Properties["logSource"] = logEvent.LogSource; + logEventInfo.Properties["actorPath"] = Context?.Sender?.Path?.ToString() ?? string.Empty; // Same as Serilog + logEventInfo.Properties["threadId"] = logEvent.Thread.ManagedThreadId; // ThreadId of the original LogEvent (instead of async Logger threadid) + logger.Log(logEventInfo); } } } diff --git a/src/common.props b/src/common.props index 8213bed..a5745ff 100644 --- a/src/common.props +++ b/src/common.props @@ -3,8 +3,9 @@ akka;actors;actor model;Akka;concurrency;nlog Copyright © 2013-2020 Akka.NET Contrib Team Akka.NET Contrib Team - Dependency update for Akka 1.3.17 and NLog 4.5.11 for net452 - 1.3.0 + - Update Akka to 1.4.5 +- Update NLog to 4.7.0 + 1.4.5 https://getakka.net/images/akkalogo.png https://github.com/AkkaNetContrib/Akka.Logger.Nlog https://github.com/AkkaNetContrib/Akka.Logger.Nlog/blob/master/LICENSE