如何防止Log4Net截断异常?

时间:2014-07-10 21:39:36

标签: c# logging log4net log4net-configuration log4net-appender

我将Log4Net事件插入SQL数据库。消息和异常字段都是8000个字符,但偶尔会有一个超过8000个字符的事件,并且数据会被截断。

是否有任何可配置的方法可以将事件分成多行?如果没有,我现在正在考虑实现我自己的ILog,它自动处理记录事件的分块,所以我不会得到任何截断的数据。有没有人有更好的主意?

编辑 - 记录配置/数据库列定义

这是我当前的参数配置:

<parameter>
  <parameterName value="@message"/>
  <dbType value="String"/>
  <size value="8000"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message"/>
  </layout>
</parameter>
<parameter>
  <parameterName value="@exception"/>
  <dbType value="String"/>
  <size value="8000"/>
  <layout type="log4net.Layout.ExceptionLayout"/>
</parameter>

数据库表定义如下:

[Message] [nvarchar](max) NULL,
[Exeception] [ntext] NULL,

2 个答案:

答案 0 :(得分:4)

您必须将size value属性设置为-1。这将保存整个例外。

答案 1 :(得分:0)

检查存储过程中的参数大小:

CREATE PROCEDURE [dbo].[Log4net_Insert] 
(
    @Date DATETIME,
    @Thread VARCHAR(255),
    @Level VARCHAR(50),
    @Logger VARCHAR(255),
    @Message VARCHAR(4000),
    @Exception VARCHAR(2000)  /* Set this to MAX to prevent truncation! */
) 
AS

BEGIN

    INSERT INTO [dbo].[Log4Net] 
    ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 
    VALUES (@Date, @Thread, @Level, @Logger, @Message, @Exception)

END

此外,Microsoft建议您使用NTEXT将任何内容转换为更新的内容:ntext, text, and image (Transact-SQL)

  

重要!将删除ntext,text和image数据类型   SQL Server的未来版本。避免在新的中使用这些数据类型   开发工作,并计划修改当前使用的应用程序   他们。请改用nvarchar(max),varchar(max)和varbinary(max)。