【问题标题】:Logging large messages with Log4Net AdoNetAppender使用 Log4Net AdoNetAppender 记录大消息
【发布时间】:2014-01-17 00:38:37
【问题描述】:

我有一个库,其中有几个 Web 服务调用。现在需要记录对外部 Web 服务的所有请求并记录收到的所有响应。这是为了以后的内部审计。

我的sql表是这样的。

CREATE TABLE [dbo].[WebServiceLog](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [nvarchar](255) NOT NULL,
    [Level] [nvarchar](50) NOT NULL,
    [Logger] [nvarchar](255) NOT NULL,
    [Message] [ntext] NOT NULL,
    [SessionID] [nvarchar](50) NOT NULL,
    [SearchID] [nvarchar](25) NULL
)

请注意,Message 字段是存储来自 Web 服务的请求和响应的位置。响应有时非常大,超过 90k 个字符,有时甚至更多。 (航班/酒店可用性搜索 - 可能会返回大量数据)

我的 appender 配置如下。

<appender name="InfoAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="1"/>
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        <connectionString value="Data Source=tcexpress;Initial Catalog=test;Persist Security Info=True;User ID=testUser;Password=**"/>
        <commandText value="INSERT INTO WebServiceLog ([Date],[Thread],[Level],[Logger],[Message],[SessionID], [SearchID]) VALUES (@log_date, @thread, @log_level, @logger, @message, @session_id, @search_id)"/>
        <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="454751"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%message"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@session_id"/>
            <dbType value="String"/>
            <size value="50"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%X{sessionID}"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@search_id"/>
            <dbType value="String"/>
            <size value="25"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%X{searchID}"/>
            </layout>
        </parameter>
    </appender>

有没有办法告诉附加程序我的字段是nText 并且可以给它任何数量的数据?我确实尝试使用字符串为字段长度设置一个非常高的值,但它似乎总是截断为 454751。
有没有人遇到过这个问题?或者有没有更好的方法使用 log4net 将大消息记录到数据库?任何帮助都感激不尽。

【问题讨论】:

  • 你试过设置 size = -1 吗?此外,454751 似乎是一个很大的数字(400K ?)。在将数据插入数据库之前,最好先压缩数据。
  • 我没有成功将大小设置为-1。当我这样做时,日志消息无法显示在数据库中(可能是由于内部错误)。
  • 设置为 -1 对我不起作用。我的消息被截断为 42k

标签: log4net log4net-appender


【解决方案1】:

也许这不能正确回答您的问题,但如果您使用 nvarchar(max) 而不是 nText 那么这对您来说应该可以正常工作:

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

这是我用来记录异常的(使用堆栈跟踪)。将其设置为 -1 也应该像 Dmitriy 建议的那样工作。

【讨论】:

  • 更改为 nvarchar(max) 对我不起作用。然而 size=-1 就像一个魅力。 (使用 sql server 2012 后端)
  • ntextnvarchar(max) 是同义词。更改列类型将无效。这个答案有效,因为它没有指定大小,而不是因为nvarchar(max)
  • 这些答案仍然有效吗?我试过没有大小节点,大小值 = -1,但我的列仍然被截断。
  • 我不知道这是否仍然有效,但我建议的配置当时确实对我有用。不过,显然不是每个人都有这种经历。
猜你喜欢
  • 2012-10-23
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多