配置节选:<!-- 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类库写过。想请问各位这到底怎么来解决让日志信息写入到数据库里?
<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类库写过。想请问各位这到底怎么来解决让日志信息写入到数据库里?
我第一次也没成功(Npgsql - PostgreSQL).
-------------------------------
这个是我单独的配置文件加载的,数据库文件名我用来sql操控类访问都可以进行操作,我判定应该不是这个实例名的问题把?log4net 有源码, 找找原因?
我第一次也没成功(Npgsql - PostgreSQL).
-----
我用源码调试的时候发现
执行到这里的时候“return Type.GetType(typeName, throwOnError, ignoreCase);我直接把log4net配置载入后其弄成成Type.GetType("System.Data.SqlClient.SqlConnection,System.Data", true, false)在单独的程序运行的时候会抛出异常“未能加载文件或程序集“System.Data”或它的某一个依赖项。系统找不到指定的文件”
完整的程序集名称那里, 你写的不够,这个dll 在此时未加载."System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
来配置,每种 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>
完整的程序集名称那里, 你写的不够, 这个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,
------------------------
如果这样做,我还不如直接写到数据库了,何必为了使用这个log4net工具又得专门弄个文件监控?主要是因为这个工具有这个功能,所以我才要使用。
{
get { return m_evaluator; }
set { m_evaluator = value; }
}在库内好像没有被赋值, 这个接口的唯一实现 LevelEvaluator, ctor 也没有构造是不是需要自己弄?
试试去掉 <bufferSize value="30" /> 配置项呢?
--------------
依然没用,我也看了他的代码,对这个也很疑惑,但是单步调试的时候由于本身线程运行和正常运行是不一样的,容易造成偏差。
// 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();
}