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)) {