我在单个aspx页面上使用Log4Net - 我的意思是此页面没有web.config并且取决于默认的machine.config设置。我正在尝试使用数据库日志记录,但没有记录任何内容。我通过代码调试时没有看到任何异常。我尝试使用winform应用程序,但它仍然无法正常工作。任何指针都将不胜感激!
这是我的代码和配置文件:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net debug="true">
<root>
<level value="ALL" />
<appender-ref ref="ADONetAppender" />
</root>
<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="XXX/>
<commandText value="INSERT INTO [tblLogs] ([timeoccurred],[calltype],[severity],[message]) VALUES (@timeoccurred, @calltype, @severity, @message)" />
<parameter>
<parameterName value="@timeoccurred"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value="@calltype"/>
<dbType value="String"/>
<size value="20"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%calltype"/>
</layout>
</parameter>
<parameter>
<parameterName value="@severity"/>
<dbType value="String"/>
<size value="50"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
</appender>
</log4net>
代码在这里:
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Log4Net.Config")));
log4net.MDC.Set("calltype", callType);
log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
答案 0 :(得分:1)
独立配置文件不需要configSections
节点:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
...
</log4net>
一些其他建议:使用thread context代替不推荐使用的MDC,并考虑按以下方式获取记录器:
log = log4net.LogManager.GetLogger(typeof(YourClass));
答案 1 :(得分:1)
我得到了它的工作。问题在于最后一个参数 - 在DB中,该列的数据类型是'text',当我启用跟踪时,我收到了异常:
log4net:错误[AdoNetAppender]无法准备数据库命令[INSERT INTO [tblLogs]([timeoccurred],[calltype],[severity],[message])VALUES(@ timeoccurred,@ calltype,@ sever,@ message )] System.InvalidOperationException:SqlCommand.Prepare方法要求所有可变长度参数都具有显式设置的非零大小。
最后,我更改了参数定义并明确提供了大小并且它有效..
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="1024"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
谢谢你的支持者......
答案 2 :(得分:0)
您是否更改了连接字符串? :)
<connectionString value="XXX/>
如果连接字符串不是问题,那么在调用log4net.Config.XmlConfigurator.Configure
之后设置断点并检查此变量
var loggers = log4net.LogManager.GetCurrentLoggers();
并检查您的记录器Appender是一个ADONetAppender。如果没有,这意味着之前的呼叫(配置)没有找到您的配置文件。