NLog - how can I encrypt registered stacks in a database

I am using the latest version of NLog (from nuget) and I am programming it. It currently saves in my database, but I would like it to encrypt my stacktrace parameter.

Is there a way NLog does this automatically? Given that I have a simple function to encrypt stacktrace, is there an easy way to use it?

+6
source share
2 answers

I would suggest writing LayoutRendererWrapper . LayoutRendererWrapper allows you to β€œwrap” LayoutRenderer so that you can apply processing to the output. For stack trace encryption, you can configure NLog to add StackTrace to the output, but you can wrap the StackTrace layout renderer so you can apply your encryption.

You see examples of LayuoutRendererWrappers in the NLog Source Code Repository .

Actually, the general nature of LayoutRendererWrapper means that you can write an encryption shell and apply it to any LayoutRenderer. Thus, you can, for example, encrypt the stack trace and message, but leave the remaining fields as clear text.

Here is an example (untested) about how you can write LayoutRendererWrapper encryption:

namespace NLog.LayoutRenderers.Wrappers { using System.ComponentModel; using System.Globalization; using NLog.Config; [LayoutRenderer("Encrypt")] [AmbientProperty("Encrypt")] [ThreadAgnostic] public sealed class EncryptLayoutRendererWrapper : WrapperLayoutRendererBase { public EncryptLayoutRendererWrapper() { this.Culture = CultureInfo.InvariantCulture; this.Encrypt = true; } [DefaultValue(true)] public bool Encrypt { get; set; } public CultureInfo Culture { get; set; } protected override string Transform(string text) { return this.Encrypt ? Encrypt(text) : text; } protected string Encrypt(string text) { //Encrypt your text here. } } } 

I think it will be configured like this in the NLog.config file:

 ${longdate} | ${logger} | ${level} | ${encrypt:${stacktrace}} | ${message} 

I am not sure how you will program it programmatically, since I usually do not use software configuration.

+7
source

Assuming you have an extension method called Encrypt that you can call on a String object,

I see two solutions:

  • Or you call your encryption function when entering your code:

 logger.Trace("Sample trace message".Encrypt()); 

  • Or you can create new methods for registering events and call them instead of the main NLog.Log() methods:

 class Log { public static void TraceEncrypt(Logger logger, String message) { LogEncrypt(logger, LogLevel.Trace, message); } public static void DebugEncrypt(Logger logger, String message) { LogEncrypt(logger, LogLevel.Debug, message); } public static void InfoEncrypt(Logger logger, String message) { LogEncrypt(logger, LogLevel.Info, message); } public static void WarnEncrypt(Logger logger, String message) { LogEncrypt(logger, LogLevel.Warn, message); } public static void ErrorEncrypt(Logger logger, String message) { LogEncrypt(logger, LogLevel.Error, message); } public static void FatalEncrypt(Logger logger, String message) { LogEncrypt(logger, LogLevel.Fatal, message); } public static void LogEncrypt(Logger logger, LogLevel logLevel, String message) { // Prepare log event LogEventInfo logEvent = new LogEventInfo(logLevel, logger.Name, message.Encrypt()); // Log data logger.Log(logEvent); } } 
+1
source

Source: https://habr.com/ru/post/900029/


All Articles