我用 Entity Framework 6 配置了 Log4Net,内存慢慢爬起来了?

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

我创建了一个 CSV 文件拆分器,以便能够在处理之前操作文件。 我想从 Log4Net 中删除文件附加程序并将其放入数据库中,因为这是 作为服务安装。

我使用了这个线程中的一些信息如何在 log4net 中使用实体框架连接字符串?

在此之前我发现的所有内容都会对我想避免的构造函数进行更改。

这里是 SQL 创建表脚本,用于在 SQL 中创建日志记录表,并将其添加到实体 .edmx

CREATE TABLE [dbo].[Log4NetLog](  
    [Id] [int] IDENTITY(1,1) NOT NULL,  
    [Date] [datetime] NOT NULL,  
    [Thread] [varchar](255) NOT NULL,  
    [Level] [varchar](50) NOT NULL,  
    [Logger] [varchar](255) NOT NULL,  
    [Message] [varchar](4000) NOT NULL,  
    [Exception] [varchar](2000) NULL,  
 CONSTRAINT [PK_Log4NetLog] PRIMARY KEY CLUSTERED   
(  
    [Id] ASC  
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]  
) ON [PRIMARY] 

这是我在 app.config 文件中的 log4net 部分:

<log4net>
      <appender name="EFNetAppender" type="CSCFileService.EFNetAppender">
          <bufferSize value="1" />
          <connectionType value="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <connectionStringName value="EDIEntities" />
          <commandText value="INSERT INTO dbo.Log4NetLog ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level,@logger, @message, @exception)" />
          <parameter>
              <parameterName value="@log_date" />
              <dbType value="DateTime" />
              <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>
          <parameter>
              <parameterName value="@thread" />
              <dbType value="String" />
              <size value="255" />
              <layout type="log4net.Layout.PatternLayout">
                  <conversionPattern value="%thread" />
              </layout>
          </parameter>
          <parameter>
              <parameterName value="@log_level" />
              <dbType value="String" />
              <size value="50" />
              <layout type="log4net.Layout.PatternLayout">
                  <conversionPattern value="%level" />
              </layout>
          </parameter>
          <parameter>
              <parameterName value="@logger" />
              <dbType value="String" />
              <size value="255" />
              <layout type="log4net.Layout.PatternLayout">
                  <conversionPattern value="%logger" />
              </layout>
          </parameter>
          <parameter>
              <parameterName value="@message" />
              <dbType value="String" />
              <size value="4000" />
              <layout type="log4net.Layout.PatternLayout">
                  <conversionPattern value="%message" />
              </layout>
          </parameter>
          <parameter>
              <parameterName value="@exception" />
              <dbType value="String" />
              <size value="2000" />
              <layout type="log4net.Layout.ExceptionLayout" />
          </parameter>
      </appender>
      <appender name="MyFileAppender" type="log4net.Appender.rollingFileAppender">
          <file value="${ProgramData}\CSCFileService\Log\CSCFileService_"/>
          <datepattern value="yyyyMMdd'_${USERNAME}.log'"/>
          <threshold value="ALL"/>
          <appendToFile value="true"/>
          <maximumFileSize value="1MB"/>
          <MaxSizeRollBackups value="10"/>
          <RollingStyle value="size,date"/>
          <staticLogFileName value="false"/>
          <preserveLogFileNameExtension value="true"/>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%identity] | %message%newline"/>
          </layout>
      </appender>
    <root>
      <level value="ALL"/>
      <!--<appender-ref ref="MyFileAppender"/>-->
      <appender-ref ref="EFNetAppender"/>
    </root>
  </log4net>

这是来自链接线程的类,用于重构实体连接字符串:

using System;
using System.Data;
using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Infrastructure;

namespace CSCFileService
{
    public class EFNetAppender : log4net.Appender.AdoNetAppender
    {
        protected override IDbConnection CreateConnection(Type connectionType, string connectionString)
        {
            var factory = (IDbConnectionFactory)Activator.CreateInstance(connectionType);
            var builder = new EntityConnectionStringBuilder();
            var providerConnectionString = new EntityConnectionStringBuilder(connectionString).ProviderConnectionString;
            IDbConnection instance = factory.CreateConnection(providerConnectionString);
            instance.ConnectionString = providerConnectionString;
            return instance;
        }
    }
}

在我实现这个写入数据库之后,内存似乎开始随着时间的推移缓慢增加,这在从文件更改为数据库之前没有发生。

有没有更好的方法配置实体框架?

这里是完整的解决方案https://github.com/robinhood1995/CSCFileService

c# entity-framework service log4net
1个回答
0
投票

内存问题毕竟不是问题,我的一个同事今天在另一个项目中发现了它。由于此设置在写入数据库之前积累了写入,因此内存会攀升。

注意:我对上面的代码表示歉意,因为它在我进行更改之前显示为 1 但已更改为 1000.

原始设置累积1000条日志写入数据库。

<bufferSize value="1000" />
变更后
<bufferSize value="1" />

这现在具有与 OFF 或文件编写器附加程序相同的内存使用量。

我还添加了清除数据库中的数据库日志条目,这样数据库就不会继续增长。

这是原文

<commandText value="INSERT INTO dbo.Log4NetLog ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level,@logger, @message, @exception)" />

这是 7 天前也被清除的更改线。

<commandText> <![CDATA[INSERT INTO dbo.Log4NetLog ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level,@logger, @message, @exception);DELETE FROM dbo.Log4NetLog WHERE Date < DATEADD(Day, -7, GETDATE())]]></commandText>
© www.soinside.com 2019 - 2024. All rights reserved.