配置Log4Net与Entity Framework 6后内存缓慢攀升,求优化方案
CSV拆分工具日志方案优化问题
我开发了一个CSV文件拆分工具,用于处理前置操作文件。由于程序以服务形式部署,我将Log4Net的文件日志追加器替换为数据库存储日志,参考Stack Overflow相关方案实现了无需修改构造函数的版本。
但切换到数据库日志后,程序内存开始缓慢攀升,使用文件日志时则无此问题。想请教是否有更优的Log4Net与Entity Framework配置方式。
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>
自定义EF连接处理类
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; } } }
内容的提问来源于stack exchange,提问作者robinhood1995
相关产品推荐
相关产品推荐

