문제

ASP.NET 3.5에서 Log4Net이 작동하는 데 어려움이 있습니다. 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();
}

이 시점에서 나는 내가 잘못하고있는 다른 것을 생각할 수 없습니다. 로그인을 저장하려는 디렉토리는 쓰기가 가능하며, 다른 디렉토리를 시도하더라도 파일, 로그가 없음과 같은 결과를 얻습니다.

제안이 있습니까? :-)


편집 : 로그 파일의 경로 및 이름에 대해 몇 가지 다른 형식을 시도했는데 그 중 일부는 ".. .. , 누군가가 그것이 문제인지 궁금해하는 경우를 대비하여.


편집 : 루트 로거 노드를 Log4NET 섹션에 다시 추가했는데 샘플에서 복사 할 때 사고시이를 획득했습니다. 루트 로거 노드는 다음과 같습니다.

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

그러나 그럼에도 불구하고 나는 여전히 운이 없습니다.

도움이 되었습니까?

해결책

루트 로거는 필수입니다. 루트가 존재하지 않기 때문에 구성이 실패했다고 생각합니다.

또 다른 잠재적 인 문제는 구성이 web.config를 가리키지 않다는 것입니다.

대신 configure (server.mappath ( "~/web.config"))를 사용해보십시오.

다른 팁

파일 권한 문제와 매우 흡사합니다. 경로가없는 파일 이름을 지정하면 Log4Net은 웹 응용 프로그램의 루트 디렉토리에 씁니다. 시도해보십시오. 성공을 막기 위해 다음을 web.config에 넣어 내부 Log4Net 디버깅을 활성화하는 것이 좋습니다.

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

그런 다음 디버그 모드로 컴파일 된 앱을 배포하고 Visual Studio 원격 디버거 던지는 오류를 보려면.

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"/>

성가신!!

정보를 위해 : 파일 경로는 다음과 같이 형식화되어야합니다.

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

간단한 구성 튜토리얼 CodeProject

.NET 3.5에서 실행할 Global.asx가 없습니다.

이것은 내 코드입니다 ... 별도의 파일로 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 구성 섹션의 상단으로 옮겼으며 모두 작동했습니다. 또한, 나도 루거와 로거 요소가 있었기 때문에 로거를 호출 할 때마다 두 줄이 생겼습니다. 나는 로거 요소를 제거하고 단순히 뿌리와 그 일을 잘 유지합니다.

다음과 같은 페이지 유형으로 로거를 만드는 것은 어떻습니까?

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