Serilog 中的内存泄漏

问题描述 投票:0回答:1

我有一个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;
    }
memory memory-leaks .net-6.0 serilog worker-service
1个回答
0
投票

这是由于您执行日志语句的方式所致:

_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

© www.soinside.com 2019 - 2024. All rights reserved.