From 8fbb5b1b773914dff5ce07672447baa6194986c1 Mon Sep 17 00:00:00 2001 From: Rolf Kristensen Date: Mon, 20 Jun 2022 17:53:06 +0200 Subject: [PATCH] AssemblyVersionLayoutRenderer - Support override of Default value --- .../AssemblyVersionLayoutRenderer.cs | 62 +++++++++++++------ .../AssemblyVersionType.cs | 2 +- .../AssemblyVersionTests.cs | 18 ++++++ 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionLayoutRenderer.cs b/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionLayoutRenderer.cs index 686df43a51..342f3907a5 100644 --- a/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionLayoutRenderer.cs +++ b/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionLayoutRenderer.cs @@ -52,14 +52,6 @@ namespace NLog.LayoutRenderers [ThreadAgnostic] public class AssemblyVersionLayoutRenderer : LayoutRenderer { - /// - /// Initializes a new instance of the class. - /// - public AssemblyVersionLayoutRenderer() - { - _format = DefaultFormat; - } - /// /// The (full) name of the assembly. If null, using the entry assembly. /// @@ -77,9 +69,12 @@ public AssemblyVersionLayoutRenderer() /// public AssemblyVersionType Type { get; set; } = AssemblyVersionType.Assembly; - private const string DefaultFormat = "major.minor.build.revision"; - - private string _format; + /// + /// The default value to render if the Version is not available + /// + /// + public string Default { get => _default ?? GenerateDefaultValue(); set => _default = value; } + private string _default; /// /// Gets or sets the custom format of the assembly version output. @@ -94,8 +89,11 @@ public AssemblyVersionLayoutRenderer() public string Format { get => _format; - set => _format = value?.ToLowerInvariant(); + set => _format = value?.ToLowerInvariant() ?? string.Empty; } + private string _format = DefaultFormat; + + private const string DefaultFormat = "major.minor.build.revision"; /// protected override void InitializeLayoutRenderer() @@ -117,17 +115,26 @@ protected override void CloseLayoutRenderer() protected override void Append(StringBuilder builder, LogEventInfo logEvent) { var version = _assemblyVersion ?? (_assemblyVersion = ApplyFormatToVersion(GetVersion())); - - if (string.IsNullOrEmpty(version)) - { - version = $"Could not find value for {(string.IsNullOrEmpty(Name) ? "entry" : Name)} assembly and version type {Type}"; - } - + if (version is null) + version = GenerateDefaultValue(); builder.Append(version); } private string ApplyFormatToVersion(string version) { + if (version is null) + { + return _default; + } + else if (StringHelpers.IsNullOrWhiteSpace(version)) + { + return _default ?? GenerateDefaultValue(); + } + else if (version == "0.0.0.0" && _default != null) + { + return _default; + } + if (Format.Equals(DefaultFormat, StringComparison.OrdinalIgnoreCase) || string.IsNullOrEmpty(version)) { return version; @@ -142,6 +149,11 @@ private string ApplyFormatToVersion(string version) return version; } + private string GenerateDefaultValue() + { + return $"Could not find value for {(string.IsNullOrEmpty(Name) ? "entry" : Name)} assembly and version type {Type}"; + } + #if NETSTANDARD1_3 private string GetVersion() @@ -166,8 +178,18 @@ private System.Reflection.Assembly GetAssembly() private string GetVersion() { - var assembly = GetAssembly(); - return GetVersion(assembly); + try + { + var assembly = GetAssembly(); + return GetVersion(assembly) ?? string.Empty; + } + catch (Exception ex) + { + NLog.Common.InternalLogger.Warn(ex, "${assembly-version} - Failed to load assembly {0}", Name); + if (ex.MustBeRethrown()) + throw; + return null; + } } /// diff --git a/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionType.cs b/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionType.cs index 339555479a..d97f865f36 100644 --- a/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionType.cs +++ b/src/NLog/LayoutRenderers/ApplicationEnvironment/AssemblyVersionType.cs @@ -49,7 +49,7 @@ public enum AssemblyVersionType File, /// - /// Gets additional version information. + /// Gets the product version, extracted from the additional version information. /// Informational } diff --git a/tests/NLog.UnitTests/LayoutRenderers/ApplicationEnvironment/AssemblyVersionTests.cs b/tests/NLog.UnitTests/LayoutRenderers/ApplicationEnvironment/AssemblyVersionTests.cs index a71e4fa2b9..d99d3be94d 100644 --- a/tests/NLog.UnitTests/LayoutRenderers/ApplicationEnvironment/AssemblyVersionTests.cs +++ b/tests/NLog.UnitTests/LayoutRenderers/ApplicationEnvironment/AssemblyVersionTests.cs @@ -63,12 +63,30 @@ public void EntryAssemblyVersionTest() AssertLayoutRendererOutput("${assembly-version}", assemblyVersion); } + [Fact] + public void EntryAssemblyVersionDefaultTest() + { + var assembly = Assembly.GetEntryAssembly(); + var assemblyVersion = assembly is null + ? "1.2.3.4" + : assembly.GetName().Version.ToString(); + AssertLayoutRendererOutput("${assembly-version:default=1.2.3.4}", assemblyVersion); + } + [Fact] public void AssemblyNameVersionTest() { AssertLayoutRendererOutput("${assembly-version:NLogAutoLoadExtension}", "2.0.0.0"); } + [Fact] + public void AssemblyNameUnknownVersionTest() + { + using (new NoThrowNLogExceptions()) + AssertLayoutRendererOutput("${assembly-version:FooBar:default=1.2.3.4}", "1.2.3.4"); + } + + [Fact] public void AssemblyNameVersionTypeTest() {