Log4Net - Использование в единой веб-форме - PullRequest
1 голос
/ 19 апреля 2011

Я использую Log4Net на одной странице aspx - я имею в виду, что эта страница не имеет 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 ]

1 голос
/ 20 апреля 2011

Я получил это работает.Проблема была с последним параметром - В БД тип данных для этого столбца - «текст», и я получал исключение при включении трассировки:

log4net: ОШИБКА [AdoNetAppender] Не удалось подготовитькоманда базы данных [INSERT INTO [tblLogs] ([timeoccURcted], [calltype], [severity], [message]) VALUES (@timeoccurred, @calltype, @severity, @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>

Спасибо, чемпионыдля ваших указателей ...

1 голос
/ 19 апреля 2011

Автономный файл конфигурации не нуждается в узле configSections:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
   ...
</log4net>

Несколько дополнительных советов: используйте контекст потока вместо MDC, который устарел, и рассмотрите возможность получения своих регистраторов следующим образом:

log = log4net.LogManager.GetLogger(typeof(YourClass));
0 голосов
/ 19 апреля 2011

Вы изменили строку подключения?:)

<connectionString value="XXX/>

Если строка подключения не является проблемой, то установите точку останова после вашего звонка на log4net.Config.XmlConfigurator.Configure и проверьте эту переменную

var loggers = log4net.LogManager.GetCurrentLoggers();

и проверьте регистраторы,Если нет, это означает, что предыдущий вызов (Configure) не нашел ваш файл конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...