log4net 用于sqlserver2008 express 不成功

jimu8130 2010-01-08 02:06:49
配置节选:

<!-- 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类库写过。想请问各位这到底怎么来解决让日志信息写入到数据库里?
...全文
296 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimu8130 2010-02-01
  • 打赏
  • 举报
回复
仍然不行啊,由于时间问题,先改成直接写入了,等以后再来改。
Dobzhansky 2010-01-08
  • 打赏
  • 举报
回复
BufferingAppenderSkeleton 的属性

public ITriggeringEventEvaluator Evaluator
{
get { return m_evaluator; }
set { m_evaluator = value; }
}

在库内好像没有被赋值, 这个接口的唯一实现 LevelEvaluator, ctor 也没有构造

是不是需要自己弄?


试试去掉 <bufferSize value="30" /> 配置项呢?
jimu8130 2010-01-08
  • 打赏
  • 举报
回复
:)没用过这个玩意。不过要解决还是很方便。既然可以写成文件,不知道是不是csv文件?做个file monitor让它自动导入到你的数据库里吧。
------------------------
如果这样做,我还不如直接写到数据库了,何必为了使用这个log4net工具又得专门弄个文件监控?主要是因为这个工具有这个功能,所以我才要使用。
leonbyron 2010-01-08
  • 打赏
  • 举报
回复
:)没用过这个玩意。不过要解决还是很方便。既然可以写成文件,不知道是不是csv文件?做个file monitor让它自动导入到你的数据库里吧。
jimu8130 2010-01-08
  • 打赏
  • 举报
回复
你要写 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,
Dobzhansky 2010-01-08
  • 打赏
  • 举报
回复
我修改了 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>
Dobzhansky 2010-01-08
  • 打赏
  • 举报
回复
你要写 AssemblyFullName

assemblyname, version , language, publickeytoken


完整的程序集名称那里, 你写的不够,

这个dll 在此时未加载.

"System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
jimu8130 2010-01-08
  • 打赏
  • 举报
回复
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”或它的某一个依赖项。系统找不到指定的文件”
Dobzhansky 2010-01-08
  • 打赏
  • 举报
回复
log4net 有源码, 找找原因?
我第一次也没成功(Npgsql - PostgreSQL).
sito_hongta 2010-01-08
  • 打赏
  • 举报
回复
3星答3星啊,路過~~
vrhero 2010-01-08
  • 打赏
  • 举报
回复
data source=.\sqlexpress

SQL Server实例名不对...
kensouterry 2010-01-08
  • 打赏
  • 举报
回复
受教了!
Dobzhansky 2010-01-08
  • 打赏
  • 举报
回复
刚才看了下, 那个
// 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();
}
jimu8130 2010-01-08
  • 打赏
  • 举报
回复
试试去掉 <bufferSize value="30" /> 配置项呢?
--------------
依然没用,我也看了他的代码,对这个也很疑惑,但是单步调试的时候由于本身线程运行和正常运行是不一样的,容易造成偏差。

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧