1

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

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>

它实际上是apache 页面上 SQL Server 示例的完整副本。我只更改了连接字符串。连接本身应该可以正常工作,我已经用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");

如果我用我通常的“日志到文件”配置替换配置,日志记录工作正常,所以我猜错误必须在配置中的某个地方,但配置是主页中的默认示例。

你能在某处看到错误吗?

4

3 回答 3

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 配置器,这不是您应该这样做的方式。它应该只在您第一次启动应用程序(静态 Main 方法)或网站(global.asax applicationStart)时调用。

那么你的类应该有只读的 ILog 属性:

private static ILog logger = LogManager.GetLogger(typeof(MyClass));
于 2013-10-28T14:23:38.873 回答
3
<bufferSize value="100" />

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

这是为了限制往返数据库的设计。尝试设置<bufferSize value="1" />或者可能 0 可以工作。

于 2013-10-28T12:59:11.297 回答
0

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

例如。

    <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>
于 2015-08-14T07:02:25.130 回答