Вопрос

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

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

Мой 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 " и т.д., на всякий случай, если кому-то интересно, в этом ли проблема.


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

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

Однако даже с этим мне по-прежнему не везет.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Я только что потратил 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"/>

Раздражает!!

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

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

Простое руководство по настройке из CodeProject

У меня нет 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");

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

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

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

Это то, что у меня есть в 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top