log4net이 작동하지 않습니다.


123

내 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파일을 찾을 수 없습니다. 어디에 있습니까?


이 역시 확인해야합니다 stackoverflow.com/a/24617269/114029
Leniel Maccaferri

답변:


298

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

[assembly: log4net.Config.XmlConfigurator]

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


5
이 방법은 사용 내 프로젝트에서 일을하지만, 어떻게 든 작동을 멈췄습니다. 이 메서드를 사용하여 다시 작동하도록해야했습니다. stackoverflow.com/a/1479343/193634 .
Rosdi Kasim 2013

다시 시도했는데 제대로 작동합니다. AssemblyInfo생각하자마자 를 포함하는 어셈블리를 참조 /로드하지 않을 가능성이 큽니다 .
Kirk Woll 2013

ELMAH appender를 사용하는 사람들에게는 이것이 갈 길입니다. 나는 'log4net.Config.XmlConfigurator.Configure ();' global.asax.cs에서 파일 어 펜더에서는 제대로 작동했지만 ELMAH 어 펜더에서는 작동하지 않았습니다.
user3885927

나는이 답변을 올렸고`[assembly : log4net.Config.XmlConfigurator (Watch = true)]`
David Savage

49

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

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

XmlConfigurator.Configure()

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

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


33

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

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


기록을 위해 두 방법 모두 콘솔 응용 프로그램에서 저에게 효과적이었습니다.
rageit

위의 솔루션을 확인했습니다. log4net.Config.XmlConfigurator.Configure (); 내 코드에서 (app.config를 사용하여 log4net이 효과적으로 작동하도록합니다. 효과적으로 인쇄되는 줄은 Configure () 메서드를 실행 한 다음 줄입니다.
luisa rosi

19

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

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

3
"빌드 할 때 log4net.config 파일이 bin \ 폴더에 복사되었는지 확인하십시오 (컴파일러에서 '최신 인 경우 복사'로 설정)"-> 하루를 절약하십시오! 너무 많이 Thks!
Hoang Nguyen Huu 2014 년

8

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();
    }
}

1
이것과 관련하여 매우 이상한 문제가 있었는데, 생산과 상사의 컴퓨터에서 로거는 이렇게 잘 작동했지만 Kirk의 대답이 내 컴퓨터에서 작동하지 않았습니다. 비슷한 문제가있는 경우 사람들에게 알리겠다고 생각했습니다 (MVC 프로젝트 btw).
Shelby115 2015

@ Shelby115, 많은 감사합니다! 내 log4Net 항목을 ELMAH에 넣으려고했습니다. web.config에서 모든 것이 정확했습니다. 이미 'log4net.Config.XmlConfigurator.Configure ();'가 있습니다. 내 global.asax.cs에서 작동하지만 작동하지 않습니다. 이 SO 게시물에 와서 Kirk를 기반으로하는 assemblyInfo.cs에 줄을 추가했습니다. 여전히 작동하지 않았습니다!. 귀하의 의견을 읽은 후 global.asax.cs에서 이전 항목을 삭제하고 작동하기 시작했습니다. 나는 이것에 몇 시간을 보냈고 귀하의 의견은 큰 도움이되었습니다. 다시 한 번 감사드립니다!
user3885927

global.asax.cs의 항목은 파일 어 펜더에서는 제대로 작동했지만 ELMAH 어 펜더에서는 작동하지 않았습니다. Kirk의 방식은 ELMAH appender에서 작동했습니다 (특히 global.asax.cs에서 제거해야 함)
user3885927

log4net에 로그 파일 용으로 구성된 디렉토리에 대한 쓰기 권한이 있는지도 확인할 수 있습니다.
Oladipo Olasemo 2015

@ Shelby115 Dang, 해결책을 잊고 자신의 의견으로 문제를 해결할 때 좋아해야합니다. 이미 추천 한 답변이있는 페이지를 방문하는 것도 좋은 지표입니다.
Shelby115

7

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

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

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

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

<add key = "log4net.Internal.Debug"value = "true"/> 문제를 해결하는 데 도움이되었습니다. 감사합니다
Ravi Khambhati

디렉토리의 권한은 나에게있어 무엇인가
오마르 Himada을

6

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

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

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


2

내 쪽에서는 앱이 컴파일되는 동안 복사 할 구성 파일을 표시하는 것을 잊었습니다.

구성 파일을 출력 디렉토리에 복사

log4net.config 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 다음 XXXX를 복사 할 출력 디렉토리에 복사를 선택하십시오.


1

위의 모든 것을 시도했지만 아무것도 작동하지 않았습니다. 이 줄을 app.config configSections 섹션 에 추가하면 저에게 효과적 이었습니다.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

VersionPublicKeyToken올바른지 확인 하십시오.


0
<param name="File" value="mylog.log" />

"mylog.log를 실제 폴더에 쓰기"라고 말합니다. 즉, 웹앱이 IIS에있는 경우 로그가 C : \ inetpub \ wwwroot \ appname \ mylog.log에 기록됩니다.

로그 파일이 없으면 앱이 실행중인 계정에 폴더에 대한 쓰기 권한이 없을 수 있습니다. SysInternals에서 프로세스 모니터를 실행하여 파일 작성 여부와 위치를 확인할 수 있습니다.

또한 디버그 모드에서 VS를 실행하여 예외가 throw되는지 확인합니다 (Debug-> Exceptions-> CLR Exceptions, Thrown 확인).


0

제 경우에는 log4Net.config 파일 속성을 "Content"로 설정하는 것을 잊었으므로 파일이 배포에 포함되지 않았습니다. 그래서 그것에주의를 기울이십시오 :

Compile action : Content

0

불행히도 위의 어느 것도 도움이되지 않았습니다. 이전 설정 제안에 추가로 기록되는 클래스의 명시 적 구성이 나를 위해 트릭을 수행했습니다.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

-7

또한 몇 시간 후에 나는 그것이 나를 위해 작동하지 않는 이유를 알아 냈습니다.

나는 :

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

하지만 다음과 같아야합니다.

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

따라서 ILog가 첫 번째 줄에 있는지 확인하십시오 ....


1
이것은 확실히 원인이 아닙니다. 로깅 메서드를 호출하기 전에 ILog 개체를 초기화하는 경우에는 중요하지 않습니다. 즉 _log.Info; _log.error 등
Oladipo Olasemo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.