我如何加密数据库中记录的堆栈跟踪
本文关键字:记录 堆栈 跟踪 数据库 何加密 加密 | 更新日期: 2023-09-27 18:12:25
我使用的是最新版本的NLog(来自nuget),我以编程方式配置它。目前它保存在我的数据库中,但我希望它加密我的stacktrace参数。
是否有任何方法NLog自动做到这一点?假设我有一个简单的函数来加密堆栈跟踪,是否有一种简单的方法来应用它?
我建议写一个LayoutRendererWrapper。LayoutRendererWrapper允许你"包装"LayoutRenderer,这样你就可以对输出应用处理。在加密堆栈跟踪的情况下,你可以配置NLog将StackTrace添加到输出中,但是你可以包装StackTrace布局渲染器,以便你可以应用你的加密。
你可以在NLog的源代码库中看到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中这样配置。配置文件:
${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);
}
}
Nlog没有内置机制来执行加密其日志,但它提供了一个简单的包装器,就像将原始文本转换为加密文本的管道一样。
https://icefoxes.github.io/2018/01/05/How-to-Encrypt-NLog/