Log4Net - 在单个Webform上使用

时间:2011-04-19 10:28:43

标签: c# asp.net log4net

我在单个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);

3 个答案:

答案 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。如果没有,这意味着之前的呼叫(配置)没有找到您的配置文件。