[C#] log4net이 작동하지 않습니다.

내 web.config에이 구성이 있습니다.

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

그러나 log4net은 작동하지 않습니다. 내 프로젝트가 잘 컴파일되고 디버깅 오류도 발생하지 않습니다. 내가 말한 줄 log.debug("somemessage")은 잘 실행되지만 mylog.log파일을 찾을 수 없습니다. 어디에 있습니까?



답변

이 유형의 문제 중 하나 XmlConfigurator는 다음 줄을 배치하여 어셈블리에 속성을 추가하는 것입니다 AssemblyInfo.cs.

[assembly: log4net.Config.XmlConfigurator]

그렇지 않으면 log4net이 활성화되지 않습니다.


답변

log4net이 전혀 로깅하지 않거나 파일이 예상대로 끝나지 않는 것 같습니다.

첫째, 실제로 전화를 했습니까?

XmlConfigurator.Configure()

코드 어디에서나? 위의 xml 스 니펫이 애플리케이션 구성 파일에있는 경우이 호출이 트릭을 수행합니다. xml 스 니펫이 자체 파일 .Configure(string)에있는 경우 파일 경로를 가져 오는 오버로드 를 사용해야 합니다. 이 호출 (또는 Kirk Woll이 언급 한 어셈블리 수준 특성)이 없으면 log4net은 전혀 로깅하지 않습니다.

이 모든 작업이 완료되었다고 생각하고 log4net이 로깅 중이어야한다면 추가로 디버그하는 동안 로그 파일에 대한 정규화 된 경로를 입력해야 할 수 있습니다. 그러면 파일 어디에 있는지 확인할 수 있습니다.


답변

또 다른 작은 문제가 있습니다. http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]메서드는 app.config에서 작동하지 않습니다. app.config에서 log4net을 구성하는 경우 log4net.Config.XmlConfigurator.Configure()방법을 사용해야합니다 .


답변

다음은 log4net이 난해한 것으로 판명되는 경우에 대한 체크리스트입니다.

  • 빌드 할 때 log4net.config 파일이 bin \ 폴더에 복사되었는지 확인합니다 (컴파일러에서 ‘최신 인 경우 복사’로 설정).
    • 설치된 코드를 처리 할 때 log4net.config가 함께 제공되는지 확인하십시오 (컴파일러에서 ‘Content’로 설정).
  • 프로세스가 실행되는 사용자에게 로그가 기록 될 폴더에 대한 쓰기 권한이 있는지 확인하십시오.
  • 확실하지 않은 경우 c : \ temp \에 무차별 권한을 부여하고 모든 것을 거기에 기록하십시오 ().
  • Sysinternal / Dbgview.exe를 실행하여 그것이 무엇을 말하는지 확인하십시오.

답변

ASP.NET MVC 프로젝트 추가

log4net.Config.XmlConfigurator.Configure();

Global.asax.cs에 다음과 같은 도움이됩니다.

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}


답변

다음은 결국 내 파일 로깅이 작동하는 단계입니다.

  • -Check AssemblyInfo.cs에는 다음 속성이 포함되어 있습니다.
    [어셈블리 : log4net.Config.XmlConfigurator] . 이것은 log4net을로드합니다.
  • 로그 디렉토리에 쓰기 권한이 있는지 확인하십시오.
  • 로거에 지정된 형식이 있는지 확인하십시오. 이는 구성의 각 요소에 지정된 레이아웃 요소 가 있는지 확인하여 수행됩니다 . 예 :

<appender name="MainLogger"...
<layout type="log4net.Layout.SimpleLayout"/>

  • 마지막으로 log4net 내부 로깅을 켜서 콘솔 로깅을 활성화하고 콘솔을 확인하십시오. 이렇게하려면 추가, <add key="log4net.Internal.Debug" value="true"/>당신에게 appSettings.

답변

로깅 시스템이 예외를 일으키지 않고 조용히 실패하는 경험이 있습니다. 로거가 오류를 로깅하는 경우 로깅을 수행 할 수 없다는 오류를 어떻게 로깅 할 수 있습니까?

따라서 파일이 디스크에 생성되지 않은 경우 파일 시스템 권한 을 조사하여 애플리케이션을 실행중인 사용자가 해당 디스크 위치에 새 파일을 쓸 수 있는지 확인하십시오.

테스트 목적으로 디스크에 기록해야하는 파일을 수동으로 만들고 모든 사람이 쓸 수있는 권한을 열 수 있습니다. 로거가 쓰기를 시작하면 구성 기반이 아닌 권한 기반임을 알 수 있습니다.