Log4net с проблемами ASP.NET 3.5

У меня возникли проблемы с работой log4net для работы с ASP.NET 3.5. Это первый раз, когда я пытался использовать log4net, я чувствую, что мне не хватает части головоломки.

Мой проект ссылается на сборку log4net, и, насколько я могу судить, он успешно развертывается на моем сервере.

My web.config содержит следующее:

  <configSections>
    <section name="log4net"
      type="log4net.Config.Log4NetConfigurationSectionHandler
      , log4net"
      requirePermission="false"/>
  </configSections>

  <log4net>
    <appender name="InfoAppender" type="log4net.Appender.FileAppender">
      <file value="..\..\logs\\InfoLog.html" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
          value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
    <logger name="_Default">
      <level value="INFO" />
      <appender-ref ref="InfoAppender" />
    </logger>
  </log4net>

Я использую следующий код для проверки регистратора:

using log4net;
using log4net.Config;

public partial class _Default : System.Web.UI.Page
{
    private static readonly ILog log = LogManager.GetLogger("_Default");

    protected void Page_Load(object sender, EventArgs e)
    {
        log.Info("Hello logging world!");
    }
}

В моем Global.asax я делаю следующее:

void Application_Start(object sender, EventArgs e) 
{
    log4net.Config.XmlConfigurator.Configure();
}

В этот момент я не могу придумать, что еще я могу сделать неправильно. Каталог, в котором я пытаюсь сохранить журнал, доступен для записи, и даже если я пытаюсь использовать разные каталоги, я получаю тот же результат: нет файла, никаких журналов.

Любые предложения?: -)


Изменить: я пробовал несколько разных форматов для пути и имени файла журнала, некоторые из которых включают ".. \..\InfoLog.html", "InfoLog.html", "logs\InfoLog.html" "и т.д., на всякий случай, если кто-то задается вопросом, есть ли эта проблема.


Изменить: я добавил корневой журнал node обратно в раздел log4net, я пропустил это при аварии при копировании из образцов. Корневой регистратор node выглядит следующим образом:

<root>
  <level value="INFO" />
  <appender-ref ref="InfoAppender" />
</root>

Даже с этим мне все равно не повезло.

Ответы

Ответ 1

Корневой регистратор является обязательным, я думаю. Я подозреваю, что конфигурация не работает, потому что корень не существует.

Другая потенциальная проблема заключается в том, что Configure не указывает на Web.config.

Попробуйте настроить (Server.MapPath( "~/web.config" )).

Ответ 2

Звучит очень похоже на проблему с правами доступа к файлам. Если вы укажете имя файла без какого-либо пути, log4net будет записываться в корневую директорию веб-приложения. Попробуй это. Если не удастся добиться успеха, я бы рекомендовал включить внутреннюю отладку log4net, поместив в свой web.config следующее:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

Затем разверните приложение, скомпилированное в режиме отладки, и запустите визуальный студийный удаленный отладчик, чтобы увидеть любые ошибки, которые были выброшены.

Ответ 3

Iv просто потратил 3 часа, пытаясь исправить эту проблему, в конце концов это было форматирование web.config.

У меня было это, и это не сработало:

<section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
      <section name="log4net"
        type="log4net.Config.Log4NetConfigurationSectionHandler
      , log4net"
        requirePermission="false"/>

изменив его на это, он зафиксировал его:

 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" requirePermission="false"/>

раздражающий!!

Ответ 4

Только для информации: путь к файлу должен быть отформатирован следующим образом:

<file value="..\\..\\logs\\InfoLog.html" />

Ответ 5

Простой учебник по настройке из CodeProject

Ответ 6

У меня нет Global.asx для запуска в .net 3.5

это мой код... Я настраиваю log4net в отдельный файл log4net.config

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

//My Web Services class name
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Service1");

Ответ 7

У меня была такая же (расстраивающая) проблема. я переместил корень в начало раздела конфигурации log4net, и все это сработало. Кроме того, у меня тоже был корень и элемент журнала, это приводило к двум строкам каждый раз, когда я звонил в журнал. я удалил элемент журнала и просто оставил корень и отлично работал.

Ответ 8

Это то, что у меня есть в Global.ASX. Все это работает в asp.net 3.5

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
         log4net.Config.XmlConfigurator.Configure(); 
    }

    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown
        log4net.LogManager.Shutdown();
    }

    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs
    }

    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started
    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer 
        // or SQLServer, the event is not raised.
    }
</script>

Ответ 9

Как создать регистратор с типом страницы, например:

private static readonly ILog log = LogManager.GetLogger(typeof(_Default));