Serilog、NLog 日志加密

本文最后更新于 2025-11-21 20:31:45

Serilog、NLog 日志加密

采用AES方式加密

Serilog 日志加密

通过继承ITextFormatter,重新定义日志内部逻辑;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class EncryptTextFormatter : Serilog.Formatting.ITextFormatter
{
private static byte[] Key = Encoding.UTF8.GetBytes("xxx");

private static byte[] IV = Encoding.UTF8.GetBytes("xxx");

public void Format(LogEvent logEvent, TextWriter output)
{
var logMessage =
$"{logEvent.Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{logEvent.Level}] {logEvent.RenderMessage()}{logEvent.Exception}";
var encryptedMessage = Encrypt(logMessage);
output.WriteLine(encryptedMessage);
}

private string Encrypt(string text)
{
using (var aes = Aes.Create())
{
aes.Key = Key;
aes.IV = IV;

using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
using (var sw = new StreamWriter(cs))
{
sw.Write(text);
}
return Convert.ToBase64String(ms.ToArray());
}
}
}
}

注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void AddLogger(this IServiceCollection serviceCollection)
{
serviceCollection.AddSingleton<Serilog.ILogger>(_ =>
{
return new Serilog.LoggerConfiguration()
.Enrich.WithThreadId()
.MinimumLevel.Verbose()
.WriteTo.File(
formatter: new EncryptTextFormatter(),
path: "./log/log.txt",
rollingInterval: Serilog.RollingInterval.Day
)
.CreateLogger();
});
}

NLog 日志加密

通过继承LayoutRenderer,重新定义日志内部逻辑;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[NLog.LayoutRenderers.LayoutRenderer("message")]
public sealed class EncryptedMessage : NLog.LayoutRenderers.LayoutRenderer
{
private static byte[] Key = System.Text.Encoding.UTF8.GetBytes(
"xxx"
);

private static byte[] IV = System.Text.Encoding.UTF8.GetBytes("xxx");

protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent)
{
/// 此处加密包含时间、其它属性、消息等所有信息
/// 若只加密消息,自行修改
builder.Append(logEvent.Message);

string logMessage = builder.ToString();

string encryptedMessage = Encrypt(logMessage);

builder.Clear();

builder.Append(encryptedMessage);
}

private string Encrypt(string text)
{
using (var aes = System.Security.Cryptography.Aes.Create())
{
aes.Key = Key;
aes.IV = IV;

using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
using (var ms = new System.IO.MemoryStream())
{
using (
var cs = new System.Security.Cryptography.CryptoStream(
ms,
encryptor,
System.Security.Cryptography.CryptoStreamMode.Write
)
)
using (var sw = new System.IO.StreamWriter(cs))
{
sw.Write(text);
}
return Convert.ToBase64String(ms.ToArray());
}
}
}
}

注册 EncryptedMessage

1
2
3
4
5
6
7
8
9
10
11
12
public static void AddLogger(this IServiceCollection serviceCollection)
{
NLog.LogManager.Setup()
.SetupExtensions(s =>
s.RegisterLayoutRenderer("message", typeof(EncryptedMessage))
);

serviceCollection.AddSingleton<NLog.ILogger>(_ =>
{
return NLog.LogManager.GetCurrentClassLogger();
});
}

Serilog、NLog 日志加密
https://njit-77.github.io/2025/08/16/日志加密/
作者
njit-77
发布于
2025年8月16日
许可协议