2

我正在尝试将 SQL Server Compact Edition (v4.0) 与 log4net 一起使用。这里有一个很棒的指南。它使用 Compact Edition 3.5,但大部分步骤应该相同。

因此,我在“App_Data”中创建了一个 SQL Server CE 4.0 数据库,并在我的 MVC Web 应用程序中创建了一个“Log”表,并确保System.Data.SqlServerCe “copy local” 为true。我还更改了连接字符串以说明 app_data 文件夹。

我的附加程序看起来像这样:

<appender name="SqlCeAppender" type="log4net.Appender.AdoNetAppender">
    <connectionType value="System.Data.SqlServerCe.SqlCeConnection, System.Data.SqlServerCe" />
    <connectionString value="Data Source=|DataDirectory|\='log4net.sdf'" />
    <commandText
    value="INSERT INTO Log 
      ([Date],[Thread],[Level],[Logger],[Message],
      [Exception], [UserName], [Custom]) 
      VALUES 
      (@log_date, @thread, @log_level, @logger, @message, 
      @exception, @username, @custom)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawUtcTimeStampLayout" />
    </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>
    <parameter>
      <parameterName value="@username" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%username" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@custom" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{Custom}" />
      </layout>
    </parameter>
  </appender>

而且......什么也没有发生 - 没有日志。当我换出我的文本文件附加程序时,我得到了日志,所以这与这个附加程序有关——但我不知道是什么。任何人都可以帮忙吗?

4

3 回答 3

1

我实际上遇到了同样的问题,但设法解决了。

我在您的示例中发现了几个问题:

<connectionString value="Data Source=|DataDirectory|\='log4net.sdf'" />

必须改为:

<connectionString value="Data Source=|DataDirectory|log4net.sdf" />

而且我还删除了那些不在默认 log4net 表模式(用户名和自定义)中的自定义字段,因此查询变为:

INSERT INTO Log 
      ([Date],[Thread],[Level],[Logger],[Message],
      [Exception]) 
      VALUES 
      (@log_date, @thread, @log_level, @logger, @message, 
      @exception)

当然,我删除了 2 个相关的<parameter>块。

我还<bufferSize>按照@BiggsTRC 的建议添加了节点。

然后一切都开始工作了。

于 2011-10-25T10:19:59.810 回答
1

我相信您遇到的问题是未设置 bufferSize。将 bufferSize 选项设置为如下所示:

<bufferSize value="1" />

把它放在你的 appender 中,你应该很高兴。

于 2011-05-28T20:09:18.080 回答
0

好的 - 我最终放弃了这个并决定通过编写一个自定义 Appender 来做到这一点,它使用 Entity Framework 来编写日志 - 实际上对我来说效果更好,因为我可以在我的自定义附加程序中添加有关错误的更多信息。

于 2011-05-27T09:35:29.737 回答