【问题标题】:Log4net not inserting into the database?Log4net 没有插入数据库?
【发布时间】:2011-04-05 18:04:35
【问题描述】:

我有 log4net 设置并配置为插入到 sql server 2005 表中。我的表称为日志。当我调用 log4net 方法时,它不会将任何数据输入到 sql server 的日志数据库中。我的客户端 C# 代码没有收到任何错误。我需要将用户添加到sql中的日志表吗?现在我正在使用 Windows 身份验证。

<configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
   <bufferSize value="100" />
   <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
connectionString value="Data Source=V-FIN-SQL-D\SQL2005;Initial Catalog=DevMHAIC;Integrated Security=True;Connection Timeout=360" />
  <commandText value="INSERT INTO Log ([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="32" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
 </layout>
 </parameter>
   <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="512" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%p" />
    </layout>
  </parameter>
   <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="512" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%c" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <size value="4000" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%m" />
    </layout>
  </parameter>
   <parameter>
    <parameterName value="@exception" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="log4net.Layout.ExceptionLayout" />
  </parameter>
</appender>
<root>
  <level value="DEBUG" />
  <appender-ref ref="ADONetAppender" />
</root>
</log4net>

这是我的日志数据库的 sql 代码:

CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NULL,
[Thread] [varchar](255) NULL,
[Level] [varchar](50) NULL,
[Logger] [varchar](255) NULL,
[Message] [varchar](4000) NULL,
[Exception] [varchar](2000) NULL
) ON [PRIMARY] 

这是我用来调用 log4net 的类。

public class ErrorLog : ILog
{
    log4net.ILog _Log;

    /// <summary>
    /// Initializes a new instance of the <see cref="ErrorLog"/> class.
    /// </summary>
    /// <param name="log">The log.</param>
    public ErrorLog(log4net.ILog log) : this()
    {
        _Log = log;
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="ErrorLog"/> class.
    /// </summary>
    public ErrorLog()
    {
        _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        log4net.Config.XmlConfigurator.Configure(); 
    }

    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void informational(string message)
    {
        _Log.Info(message);
    }

    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void informational(string message, Exception innerException)
    {
        _Log.Info(message, innerException);
    }

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void debug(string message)
    {
        _Log.Debug(message);
    }

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void debug(string message, Exception innerException)
    {
        _Log.Debug(message, innerException);
    }

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void error(string message)
    {
        _Log.Error(message);
    }

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void error(string message, Exception innerException)
    {
        _Log.Error(message, innerException);
    }

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void warning(string message)
    {
        _Log.Warn(message);
    }

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void warning(string message, Exception innerException)
    {
        _Log.Warn(message, innerException);
    }
}

这是我的界面:

public interface ILog
{
    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void informational(string message);

    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void informational(string message, Exception innerException);

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void debug(string message);

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void debug(string message, Exception innerException);

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void error(string message);

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void error(string message, Exception innerException);

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void warning(string message);

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void warning(string message, Exception innerException);
}

【问题讨论】:

  • 你能发布你的 Log4Net 配置文件吗?

标签: sql-server-2005 log4net


【解决方案1】:
<bufferSize value="100" />

据说它将在内存中保留 100 条日志直到写入数据库。也许这就是您在 DB 中看不到任何内容的原因?

【讨论】:

  • 这是最有可能的罪魁祸首。将该缓冲区设置为 1,您每次都会写入数据库。实际上,它正在等待累积 100 个日志条目,然后将它们一批写入数据库。
  • 如果没有指定,有人知道这个值的默认值吗?
  • @MikeCole Docs 说 500,但是为什么你还没有在调试器中检查呢?
  • 终于,经过 1000 次搜索,我找到了你。谢谢!
  • 我在数据库级别尝试了所有可以想象的方法来解决这个问题。这个属性完全把我绊倒了。谢谢!
【解决方案2】:

仅通过查看您的配置,我并不能真正了解您的问题,但您可以尝试将其添加到您的应用设置中,看看 log4net 是否可以告诉您出了什么问题:

<appSettings>         
  <add key="log4net.Internal.Debug" value="true"/> 
</appSettings> 

请参阅标题为 "How do I enable log4net internal debugging?" 的部分,了解如何捕获 log4net 的内部日志记录。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。就我而言,我不得不从插入中删除 [Exception] 和 @exception 的使用。

    所以,我也不得不更改我的日志记录。我基本上必须创建一个很好的异常转储并将其传递给 message 参数。

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      除非您在连接字符串中特别设置用户,否则 Log4Net 将尝试使用分配给进程的任何用户帐户(如果是这种情况,则为 ASP.NET 工作进程)登录。如果您无法登录,Log4Net 也不会抛出异常。你可以打开调试看看是什么问题。

      【讨论】:

      • 如何开启调试?
      • @barrypicker
      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2012-06-16
      相关资源
      最近更新 更多