diff --git a/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs b/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs
index 45c4517..cef90c7 100644
--- a/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs
+++ b/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs
@@ -54,7 +54,7 @@ private bool IsDefaultMask()
private object FormatMaskedValue(string val)
{
if (string.IsNullOrEmpty(val))
- return val;
+ return PreserveLength ? val : Text;
if (ShowFirst == 0 && ShowLast == 0)
{
diff --git a/test/Destructurama.Attributed.Tests/MaskedAttributeTests.cs b/test/Destructurama.Attributed.Tests/MaskedAttributeTests.cs
index f7afc76..dbfad31 100644
--- a/test/Destructurama.Attributed.Tests/MaskedAttributeTests.cs
+++ b/test/Destructurama.Attributed.Tests/MaskedAttributeTests.cs
@@ -28,6 +28,12 @@ public class CustomizedMaskedLogs
[LogMasked(PreserveLength = true)]
public string? DefaultMaskedPreserved { get; set; }
+ ///
+ /// "" results in "***"
+ ///
+ [LogMasked]
+ public string? DefaultMaskedNotPreservedOnEmptyString { get; set; }
+
///
/// 123456789 results in "#"
///
@@ -207,6 +213,33 @@ public void LogMaskedAttribute_Replaces_Value_With_DefaultStars_Mask_And_Preserv
Assert.AreEqual("*********", props["DefaultMaskedPreserved"].LiteralValue());
}
+ [Test]
+ public void LogMaskedAttribute_Replaces_Value_With_DefaultStars_Mask_And_Not_Preserve_Length_On_Empty_String()
+ {
+ // [LogMasked]
+ // "" -> "***"
+
+ LogEvent evt = null!;
+
+ var log = new LoggerConfiguration()
+ .Destructure.UsingAttributes()
+ .WriteTo.Sink(new DelegatingSink(e => evt = e))
+ .CreateLogger();
+
+ var customized = new CustomizedMaskedLogs
+ {
+ DefaultMaskedNotPreservedOnEmptyString = ""
+ };
+
+ log.Information("Here is {@Customized}", customized);
+
+ var sv = (StructureValue)evt.Properties["Customized"];
+ var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value);
+
+ Assert.IsTrue(props.ContainsKey("DefaultMaskedNotPreservedOnEmptyString"));
+ Assert.AreEqual("***", props["DefaultMaskedNotPreservedOnEmptyString"].LiteralValue());
+ }
+
[Test]
public void LogMaskedAttribute_Replaces_Value_With_Provided_Mask()
{