This package makes it possible to manipulate how objects are logged to Serilog using attributes.
Install from NuGet:
Install-Package Destructurama.Attributed
Modify logger configuration:
var log = new LoggerConfiguration()
.Destructure.UsingAttributes()
...
Apply the NotLogged
attribute:
public class LoginCommand
{
public string Username { get; set; }
[NotLogged]
public string Password { get; set; }
}
When the object is passed using {@...}
syntax the attributes will be consulted.
var command = new LoginCommand { Username = "logged", Password = "not logged" };
log.Information("Logging in {@Command}", command);
To prevent destructuring of a type or property at all, apply the [LoggedAsScalar]
attribute.
Apply the LogMasked
attribute with various settings:
- Text: If set the properties value will be set to this text.
- ShowFirst: Shows the first x characters in the property value
- ShowLast: Shows the last x characters in the property value
- PreserveLength: If set it will swap out each character with the default value. Note that this property will be ignored if Text has been set to custom value.
Examples
public class CreditCard
{
/// <summary>
/// 123456789 results in "*********"
/// </summary>
[LogMasked]
public string DefaultMasked { get; set; }
/// <summary>
/// 123456789 results in "REMOVED"
/// </summary>
[LogMasked(Text="REMOVED")]
public string CustomMasked { get; set; }
/// <summary>
/// 123456789 results in "123***"
/// </summary>
[LogMasked(ShowFirst=3)]
public string ShowFirstThreeThenDefaultMasked { get; set; }
/// <summary>
/// 123456789 results in "123******"
/// </summary>
[LogMasked(ShowFirst=3, PreserveLength=true)]
public string ShowFirstThreeThenDefaultMaskedPreserveLength { get; set; }
/// <summary>
/// 123456789 results in "***789"
/// </summary>
[LogMasked(ShowLast=3)]
public string ShowLastThreeThenDefaultMasked { get; set; }
/// <summary>
/// 123456789 results in "******789"
/// </summary>
[LogMasked(ShowLast=3, PreserveLength=true)]
public string ShowLastThreeThenDefaultMaskedPreserveLength { get; set; }
/// <summary>
/// 123456789 results in "123REMOVED"
/// </summary>
[LogMasked(Text="REMOVED", ShowFirst=3)]
public string ShowFirstThreeThenCustomMask { get; set; }
/// <summary>
/// 123456789 results in "REMOVED789"
/// </summary>
[LogMasked(Text="REMOVED", ShowLast=3)]
public string ShowLastThreeThenCustomMask { get; set; }
/// <summary>
/// 123456789 results in "******789"
/// </summary>
[LogMasked(ShowLast=3, PreserveLength=true)]
public string ShowLastThreeThenCustomMaskPreserveLength { get; set; }
/// <summary>
/// 123456789 results in "123******"
/// </summary>
[LogMasked(ShowFirst=3, PreserveLength=true)]
public string ShowFirstThreeThenCustomMaskPreserveLength { get; set; }
/// <summary>
/// 123456789 results in "123***789"
/// </summary>
[LogMasked(ShowFirst=3, ShowLast=3)]
public string ShowFirstAndLastThreeAndDefaultMaskeInTheMiddle { get; set; }
/// <summary>
/// 123456789 results in "123REMOVED789"
/// </summary>
[LogMasked(Text="REMOVED", ShowFirst=3, ShowLast=3)]
public string ShowFirstAndLastThreeAndCustomMaskInTheMiddle { get; set; }
/// <summary>
/// NOTE PreserveLength=true is ignored in this case
/// 123456789 results in "123REMOVED789"
/// </summary>
[LogMasked(Text="REMOVED", ShowFirst=3, ShowLast=3, PreserveLength=true)]
public string ShowFirstAndLastThreeAndCustomMaskInTheMiddle { get; set; }
}
Apply the LogReplaced
attribute on a string, in which you want to apply a RegEx replacement during Logging.
This is applicable in scenarios which a string contains both Sensitive and Non-Sensitive information. An example of this could be a string such as "Sensitive|NonSensitive". Then you can apply the attibute like the following snippet:
[LogReplaced(@"([a-zA-Z0-9]+)\|([a-zA-Z0-9]+)", "***|$2")]
public property Information { get; set; }
// Will log: "***|NonSensitive"
LogReplaced
attribute is available with two constructors:
LogReplaced(string pattern, string replacement)
LogReplaced(string pattern, string replacement, RegexOptions regexOptions)
- Pattern: The pattern that should be applied on value..
- Replacement: The string that will be applied by RegEx.
- RegexOptions: The RegexOptions that will be applied. Defaults to RegexOptions.None
Examples
public class CreditCard
{
const string RegexWithVerticalBars = @"([a-zA-Z0-9]+)\|([a-zA-Z0-9]+)\|([a-zA-Z0-9]+)";
/// <summary>
/// 123|456|789 results in "***|456|789"
/// </summary>
[LogReplaced(RegexWithVerticalBars, "***|$2|$3")]
public string RegexReplaceFirst { get; set; }
/// <summary>
/// 123|456|789 results in "123|***|789"
/// </summary>
[LogReplaced(RegexWithVerticalBars, "$1|***|$3")]
public string RegexReplaceSecond { get; set; }
}