配置节选:<!-- Define Sqlserver OperationLog-->
  <appender name="DBAppender" type="log4net.Appender.AdoNetAppender">
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="INFO" />
      <levelMax value="INFO" />
    </filter>
    <bufferSize value="30" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Culture=neutral" />
    <connectionString value="data source=127.0.0.1;initial catalog=taishandb;User ID=disp;Password=disp" /> 
    <commandText value="INSERT INTO [taishandb].[dbo].DWSOperationLog ([OpTime],[Msg]) VALUES (@log_date, @msg)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
    </parameter> 
    <parameter>
      <parameterName value="@msg" />
      <dbType value="String" />
      <size value="200" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter> 
  </appender>首先测试了写文件均是可写的,但是一旦连接上数据库就无法写入值了,数据库连接字符串没问题的,因为我用sql类库写过。想请问各位这到底怎么来解决让日志信息写入到数据库里?

解决方案 »

  1.   

    data source=.\sqlexpressSQL Server实例名不对...
      

  2.   

    log4net 有源码, 找找原因?
    我第一次也没成功(Npgsql - PostgreSQL).
      

  3.   

    data source=.\sqlexpress SQL Server实例名不对...-
    -------------------------------
    这个是我单独的配置文件加载的,数据库文件名我用来sql操控类访问都可以进行操作,我判定应该不是这个实例名的问题把?log4net 有源码, 找找原因? 
    我第一次也没成功(Npgsql - PostgreSQL).
    -----
    我用源码调试的时候发现
    执行到这里的时候“return Type.GetType(typeName, throwOnError, ignoreCase);我直接把log4net配置载入后其弄成成Type.GetType("System.Data.SqlClient.SqlConnection,System.Data", true, false)在单独的程序运行的时候会抛出异常“未能加载文件或程序集“System.Data”或它的某一个依赖项。系统找不到指定的文件”
      

  4.   

    你要写 AssemblyFullNameassemblyname, version , language,  publickeytoken 
    完整的程序集名称那里, 你写的不够,这个dll 在此时未加载."System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      

  5.   

    我修改了 AdoNetAppender 不再使用连接类型, 而是使用 Ado.net Provider Factory 的 InvariantName
    来配置,每种 ado.net provider 都有一个不变的名字,机器级别的配置在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config,
    下面是我的, 通过 invariantname 来获取连接对象比较方便参考
    System.Data.Common.DbProviderFactories
      <system.data>
        <DbProviderFactories>
          <add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
          <add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
          <add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
          <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
          <add name="Oracle Data Provider" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.6.20, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
          <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Framework Data Provider for Npgsql" type="Npgsql.NpgsqlFactory, Npgsql, Version=1.98.4.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
        </DbProviderFactories>
      </system.data>
      

  6.   

    你要写 AssemblyFullName assemblyname, version , language,  publickeytoken 
    完整的程序集名称那里, 你写的不够, 这个dll 在此时未加载. "System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    ----------------------
    按照你的写后,找不到程序集问题解决了,但是跟踪后发现到这个BufferingAppenderSkeleton类的时候
    // Buffer is not yet full // Check if the event should trigger the whole buffer to be sent
    if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent))
    {
    SendFromBuffer(null, m_cb);
    }
    这里就不能执行到sendfrombuffer了,因为evaluator为null,
      

  7.   

    :)没用过这个玩意。不过要解决还是很方便。既然可以写成文件,不知道是不是csv文件?做个file monitor让它自动导入到你的数据库里吧。
      

  8.   

    :)没用过这个玩意。不过要解决还是很方便。既然可以写成文件,不知道是不是csv文件?做个file monitor让它自动导入到你的数据库里吧。
    ------------------------
    如果这样做,我还不如直接写到数据库了,何必为了使用这个log4net工具又得专门弄个文件监控?主要是因为这个工具有这个功能,所以我才要使用。
      

  9.   

    BufferingAppenderSkeleton 的属性    public ITriggeringEventEvaluator Evaluator
        {
          get { return m_evaluator; }
          set { m_evaluator = value; }
        }在库内好像没有被赋值, 这个接口的唯一实现 LevelEvaluator, ctor 也没有构造是不是需要自己弄?
    试试去掉 <bufferSize value="30" />  配置项呢?
      

  10.   

    试试去掉 <bufferSize value="30" />  配置项呢?
    --------------
    依然没用,我也看了他的代码,对这个也很疑惑,但是单步调试的时候由于本身线程运行和正常运行是不一样的,容易造成偏差。
      

  11.   

    刚才看了下, 那个
              // Check if the event should trigger the whole buffer to be sent
              if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent))
              {
                SendFromBuffer(null, m_cb);
              }是不走这个途径的.程序退出时会写入库, 
    也可以主动调用刷新操作入库.
          log = LogManager.GetLogger(typeof(Form1));
          log.Info("button6_click");
          if (appenders[0] is log4net.Appender.BufferingAppenderSkeleton)
          {
            log4net.Appender.BufferingAppenderSkeleton app = appenders[0] as log4net.Appender.BufferingAppenderSkeleton;
            app.Flush();
          }