Log4Net在SQL Server数据库中没有写入任何内容

时间:2013-10-28 12:54:40

标签: c# sql-server log4net

我发现了类似的问题,但答案没有。

Log4Net在日志数据库中没有写任何内容,我真的不知道如何找到错误。

这是我的配置文件:

<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=sqlServer;initial catalog=Logging;integrated security=false;persist security info=True;User ID=logUser;Password=logPassword" />
    <commandText value="INSERT INTO dbo.myLogTable ([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>
</log4net>

它实际上是SQL Server example on the apache page的完整副本。我只更改了连接字符串。连接本身应该可以正常工作,我已经使用SqlConnection测试了连接字符串。

这是我创建日志记录对象并加载配置的方法:

public static class LogFactory
{
    public const string Log4NetConfig = "log4net.config";

    public static ILog GetLogger()
    {
        var uri = new Uri(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase), Log4NetConfig));
        var configFile = new FileInfo(Path.GetFullPath(uri.LocalPath));
        XmlConfigurator.ConfigureAndWatch(configFile);
        ILog log = LogManager.GetLogger(typeof(LogFactory));
        return log;
    }
}

记录本身:

private static readonly ILog Log = LogFactory.GetLogger();
[...]
Log.Info("Test 123");

如果我用通常的“log to file”配置替换配置,则日志工作正常,所以我猜错误必须在配置中的某处,但是配置是主页的默认示例。

你能在某个地方看到错误吗?

3 个答案:

答案 0 :(得分:4)

您没有定义何时应该使用appender,也没有定义bufferSize您推迟写入数据库。

<log4net>
    <root>
        <level value="ALL" /> <!--send all logs to appenders-->
        <appender-ref ref="AdoNetAppender" />
    </root>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="100" /> <!--THIS WILL POSTPONE DB WRITING UNTIL A BUFFER OF 100 LOG IS REACHED-->
        <threshold value="INFO"/> <!--log when >= INFO -->
        .....
    </appender>
</log4net>

最后的想法:

每次需要记录器时,您都在调用log4net配置程序,而这不是您应该如何操作的。 它应该仅在您启动应用程序(静态主方法)或网站(global.asax applicationStart)时第一次调用。

然后你的类应该有readonly ILog属性:

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

答案 1 :(得分:3)

<bufferSize value="100" />

这意味着Log4Net在插入数据库之前会在内存中保留100条记录。

这是设计用于限制数据库的往返。尝试设置<bufferSize value="1" />或者0可能有效。

答案 2 :(得分:0)

使用AdoNetAppender时,我无法将日志详细信息写入数据库。 以下是为使其成为可行解决方案所做的更改: 1)使用bufferSize值=&#34; 1&#34;或bufferSize值=&#34; 0&#34; 2)&#39; root&#39;目录应该在所有使用过的Appender之前使用

EG。     

    <root>
      <level value="ALL"></level>
      <appender-ref ref="AdoNetAppender"></appender-ref>
      <appender-ref ref="RollingFileAppender"></appender-ref>
    </root>

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="mylogfile.txt" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>

    <appender name="AdoNetAppender" 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=server_name; initial catalog=database_name;integrated security=false; persist security info=True;User ID=user_id;Password=password" />
      <commandText value="INSERT INTO ErrorLog ([Logger]) VALUES (@logger)" />
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
 </appender>

  </log4net>