我正在使用最新版本的NLog(來自nuget),並以編程方式進行配置。 目前它保存在我的數據庫中,但我希望它能加密我的stacktrace參數。NLog - 如何加密數據庫中記錄的堆棧跟蹤
NLog是否有任何方法自動執行此操作? 鑑於我有一個簡單的函數來加密堆棧跟蹤是否有一個簡單的方法來應用它?
我正在使用最新版本的NLog(來自nuget),並以編程方式進行配置。 目前它保存在我的數據庫中,但我希望它能加密我的stacktrace參數。NLog - 如何加密數據庫中記錄的堆棧跟蹤
NLog是否有任何方法自動執行此操作? 鑑於我有一個簡單的函數來加密堆棧跟蹤是否有一個簡單的方法來應用它?
我建議寫LayoutRendererWrapper。一個LayoutRendererWrapper允許你「包裝」一個LayoutRenderer,這樣你就可以對輸出進行處理。在對堆棧跟蹤進行加密的情況下,您可以配置NLog以將StackTrace添加到輸出,但可以將StackTrace佈局渲染器包裝起來,以便應用加密。
您會在NLog's source code repository中看到LayuoutRendererWrappers的示例。
實際上,LayoutRendererWrapper的一般性質意味着您可以編寫一個加密包裝並將其應用於任何LayoutRenderer。因此,例如,您可以加密堆棧跟蹤和消息,但將其餘字段保留爲明文。
這裏是一個如何編寫一個加密LayoutRendererWrapper一個例子(未經測試):
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.
}
}
}
我認爲它會在NLog.config文件進行配置是這樣的:
${longdate} | ${logger} | ${level} | ${encrypt:${stacktrace}} | ${message}
我不知道如何以編程方式配置它,因爲我通常不使用編程配置。
假設你有一個擴展方法稱爲Encrypt
您可以在String
對象調用,
我看到了兩個解決方案:
logger.Trace("Sample trace message".Encrypt());
NLog.Log()
方法:
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);
}
}
這是一個體面的替代 –
謝謝,我認爲這是它。 –
謝謝。你必須添加到你的main:'ConfigurationItemFactory.Default.LayoutRenderers .RegisterDefinition(「Encrypt」,typeof(NLog.LayoutRenderers.Wrappers.EncryptLayoutRendererWrapper));' – daniel