diff --git a/VERSION b/VERSION
index 291d0de4a2..2f1a5aa9c1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.1.16
+2.1.17
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/Console/ConsoleLoggerProvider.cs b/src/VirtualClient/VirtualClient.Core/Logging/Console/ConsoleLoggerProvider.cs
index ea0a2d7924..96f4a20cd9 100644
--- a/src/VirtualClient/VirtualClient.Core/Logging/Console/ConsoleLoggerProvider.cs
+++ b/src/VirtualClient/VirtualClient.Core/Logging/Console/ConsoleLoggerProvider.cs
@@ -4,11 +4,13 @@
namespace VirtualClient.Logging
{
using Microsoft.Extensions.Logging;
+ using VirtualClient.Common;
///
/// A very thin settings passthrough provider as a stop gap to handle the missing obsoleted functionality .NET Core 2.2 and .NET Core 3.0 implementation.
/// See https://github.com/aspnet/EntityFramework.Docs/pull/1164 for full discussion of issue.
///
+ [LoggerAlias("Console")]
public sealed class ConsoleLoggerProvider : ILoggerProvider
{
///
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/Csv/MetricsCsvFileLoggerProvider.cs b/src/VirtualClient/VirtualClient.Core/Logging/Csv/MetricsCsvFileLoggerProvider.cs
index b1446d2154..b7428d61d1 100644
--- a/src/VirtualClient/VirtualClient.Core/Logging/Csv/MetricsCsvFileLoggerProvider.cs
+++ b/src/VirtualClient/VirtualClient.Core/Logging/Csv/MetricsCsvFileLoggerProvider.cs
@@ -5,6 +5,7 @@ namespace VirtualClient.Logging
{
using System;
using Microsoft.Extensions.Logging;
+ using VirtualClient.Common;
using VirtualClient.Common.Extensions;
using VirtualClient.Contracts;
using ILogger = Microsoft.Extensions.Logging.ILogger;
@@ -13,6 +14,7 @@ namespace VirtualClient.Logging
/// Provides methods for creating instances that can be used
/// to write metrics data to a CSV file.
///
+ [LoggerAlias("Csv,File")]
public sealed class MetricsCsvFileLoggerProvider : ILoggerProvider
{
private string filePath;
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/EventHub/EventHubTelemetryLoggerProvider.cs b/src/VirtualClient/VirtualClient.Core/Logging/EventHub/EventHubTelemetryLoggerProvider.cs
index 28d929fddc..f2e1c1160c 100644
--- a/src/VirtualClient/VirtualClient.Core/Logging/EventHub/EventHubTelemetryLoggerProvider.cs
+++ b/src/VirtualClient/VirtualClient.Core/Logging/EventHub/EventHubTelemetryLoggerProvider.cs
@@ -5,6 +5,7 @@ namespace VirtualClient.Logging
{
using System;
using Microsoft.Extensions.Logging;
+ using VirtualClient.Common;
using VirtualClient.Common.Extensions;
using VirtualClient.Common.Telemetry;
@@ -12,6 +13,7 @@ namespace VirtualClient.Logging
/// Provides methods for creating instances that can
/// be used to log events/messages to an Application Insights endpoint.
///
+ [LoggerAlias("Eventhub")]
[LoggerSpecialization(Name = SpecializationConstant.Telemetry)]
public sealed class EventHubTelemetryLoggerProvider : ILoggerProvider
{
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/LoggerAliasAttribute.cs b/src/VirtualClient/VirtualClient.Core/Logging/LoggerAliasAttribute.cs
new file mode 100644
index 0000000000..0852b5b6c1
--- /dev/null
+++ b/src/VirtualClient/VirtualClient.Core/Logging/LoggerAliasAttribute.cs
@@ -0,0 +1,31 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+
+namespace VirtualClient.Common
+{
+ using System;
+ using System.Collections.Generic;
+ using VirtualClient.Common.Extensions;
+
+ ///
+ /// Defines one or more aliases for ILoggerProvider class.
+ ///
+ [AttributeUsage(validOn: AttributeTargets.Class)]
+ public class LoggerAliasAttribute : Attribute
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Alias or aliases delimited by comma.
+ public LoggerAliasAttribute(string alias)
+ {
+ alias.ThrowIfNullOrEmpty(nameof(alias));
+ this.Aliases = alias.Split(',');
+ }
+
+ ///
+ /// The aliases for the logger provider.
+ ///
+ public IEnumerable Aliases { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/Serilog/SerilogFileLoggerProvider.cs b/src/VirtualClient/VirtualClient.Core/Logging/Serilog/SerilogFileLoggerProvider.cs
index 7b787322a9..84e0e40003 100644
--- a/src/VirtualClient/VirtualClient.Core/Logging/Serilog/SerilogFileLoggerProvider.cs
+++ b/src/VirtualClient/VirtualClient.Core/Logging/Serilog/SerilogFileLoggerProvider.cs
@@ -7,6 +7,7 @@ namespace VirtualClient.Logging
using System.Collections.Generic;
using global::Serilog;
using Microsoft.Extensions.Logging;
+ using VirtualClient.Common;
using VirtualClient.Common.Extensions;
using VirtualClient.Common.Telemetry;
using ILogger = Microsoft.Extensions.Logging.ILogger;
@@ -15,6 +16,7 @@ namespace VirtualClient.Logging
/// Provides methods for creating instances that can
/// be used to log events/messages to a local file.
///
+ [LoggerAlias("File")]
[LoggerSpecialization(Name = SpecializationConstant.StructuredLogging)]
public sealed class SerilogFileLoggerProvider : ILoggerProvider, IDisposable
{
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLogger.cs b/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLogger.cs
index ecfda1a656..f3b0ea01ff 100644
--- a/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLogger.cs
+++ b/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLogger.cs
@@ -313,12 +313,14 @@ private string CreateSucceededOrFailedMessage(EventContext context)
string scenarioName = context.Properties["scenarioName"].ToString();
string outcome = context.Properties["metricName"].ToString();
outcome = outcome == "Succeeded" ? "PASS" : "* Failed *";
- TimeSpan duration = (DateTime)context.Properties["scenarioEndTime"] - (DateTime)context.Properties["scenarioStartTime"];
+ DateTime scenarioStartTime = (DateTime)context.Properties["scenarioStartTime"];
+ DateTime scenarioEndTime = (DateTime)context.Properties["scenarioEndTime"];
+ TimeSpan duration = scenarioEndTime - scenarioStartTime;
messageBuilder.AppendLine();
messageBuilder.AppendMessage($"Component : {componentName} -> {scenarioName}");
messageBuilder.AppendMessage(SummaryFileLogger.DashLine);
- messageBuilder.AppendMessage($"Duration : {duration.ToString()}");
+ messageBuilder.AppendMessage($"Duration : {duration.ToString()}. Start Time : {scenarioStartTime}. End Time : {scenarioEndTime}.");
messageBuilder.AppendMessage($"Outcome : {outcome}");
messageBuilder.AppendLine();
diff --git a/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLoggerProvider.cs b/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLoggerProvider.cs
index 9ec1c0a59e..2aee44284c 100644
--- a/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLoggerProvider.cs
+++ b/src/VirtualClient/VirtualClient.Core/Logging/SummaryFile/SummaryFileLoggerProvider.cs
@@ -6,6 +6,7 @@ namespace VirtualClient.Logging
using System;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Logging;
+ using VirtualClient.Common;
using VirtualClient.Contracts;
using ILogger = Microsoft.Extensions.Logging.ILogger;
@@ -13,6 +14,7 @@ namespace VirtualClient.Logging
/// Provides methods for creating instances that can be used
/// to write summary log files.
///
+ [LoggerAlias("Summary,File")]
public sealed class SummaryFileLoggerProvider : ILoggerProvider
{
private string filePath;
diff --git a/src/VirtualClient/VirtualClient.Main/CommandBase.cs b/src/VirtualClient/VirtualClient.Main/CommandBase.cs
index f664d77cbf..bcaccbf724 100644
--- a/src/VirtualClient/VirtualClient.Main/CommandBase.cs
+++ b/src/VirtualClient/VirtualClient.Main/CommandBase.cs
@@ -32,6 +32,7 @@ namespace VirtualClient
using VirtualClient.Contracts.Metadata;
using VirtualClient.Contracts.Proxy;
using VirtualClient.Identity;
+ using VirtualClient.Logging;
using VirtualClient.Proxy;
///
@@ -443,13 +444,6 @@ protected virtual IEnumerable GetLoggerDefinitions()
loggerDefinitions.Add("console");
}
- // Add default file logging
- // e.g. (--logger=file)
- if (loggerDefinitions?.Any(l => Regex.IsMatch(l, "^file", RegexOptions.IgnoreCase)) != true)
- {
- loggerDefinitions.Add("file");
- }
-
// backward compatibility for --eventhub
if (!string.IsNullOrEmpty(this.EventHubStore))
{
@@ -688,6 +682,11 @@ protected virtual IList InitializeLoggerProviders(IConfiguratio
CommandBase.AddProxyApiLogging(loggingProviders, configuration, platformSpecifics, new Uri(loggerParameters), this.CertificateManager, source);
break;
+ case "summary":
+ ILoggerProvider summaryLoggerProvider = new SummaryFileLoggerProvider(string.Empty);
+ loggingProviders.Add(summaryLoggerProvider);
+ break;
+
default:
if (!ComponentTypeCache.Instance.TryGetComponentType(loggerName, out Type subcomponentType))
{