我创建了一个 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;
}
}
}
在我实现这个写入数据库之后,内存似乎开始随着时间的推移缓慢增加,这在从文件更改为数据库之前没有发生。
有没有更好的方法配置实体框架?
内存问题毕竟不是问题,我的一个同事今天在另一个项目中发现了它。由于此设置在写入数据库之前积累了写入,因此内存会攀升。
注意:我对上面的代码表示歉意,因为它在我进行更改之前显示为 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>