我有一个Net6工作者服务项目。使用 Serilog.ILogger 记录 txt 文件上的错误,但最近内存使用量增加(8GB) Worker仅使用Dapper从数据库获取数据,返回数据并发送邮件。 这是版本
<PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
当捕获 SqlConnection 类型的异常且日志上的注册表时,内存使用量会增加,但是当我遇到其他类型的异常时,不会发生这种情况。
_logger.LogError("InterfaceLogsCleanerWorker executed with exceptions" + ex.Message);
这是获取数据的代码
public async Task<List<SetupDTO>> Get()
{
var map = new Sys_SetupMap();
var result = new TransacResult(true, MessageTransactResult.OK);
List<Sys_Setup> entityList;
List<SetupDTO> list = new List<SetupDTO>();
using (var conn = new SqlConnection(this.connectionString))
{
var parameters = new DynamicParameters();
parameters.Add("Result", string.Empty, DbType.String, ParameterDirection.Output);
entityList = (await conn.QueryAsync<Sys_Setup>("GetSys_Setup", parameters, commandType: CommandType.StoredProcedure)).AsList();
}
foreach (var entity in entityList)
{
list.Add(map.EntityToDTO(entity));
}
return list;
}
这是由于您执行日志语句的方式所致:
_logger.LogError("InterfaceLogsCleanerWorker executed with exceptions" + ex.Message);
这需要是:
_logger.LogError(ex, "InterfaceLogsCleanerWorker executed with exceptions");
或者,最坏的情况:
_logger.LogError("InterfaceLogsCleanerWorker executed with exceptions {message}",
ex.Message);
文档涵盖了这一点(概念是每条消息都应该是一个消息模板 - 即任何给定的应用程序应该只具有数十到数千个消息模板;并且这些模板会被解析和缓存)
Serilog 分析器可以警告如下使用错误:https://github.com/Suchiman/SerilogAnalyzer