[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
.
답변
로깅 시스템이 예외를 일으키지 않고 조용히 실패하는 경험이 있습니다. 로거가 오류를 로깅하는 경우 로깅을 수행 할 수 없다는 오류를 어떻게 로깅 할 수 있습니까?
따라서 파일이 디스크에 생성되지 않은 경우 파일 시스템 권한 을 조사하여 애플리케이션을 실행중인 사용자가 해당 디스크 위치에 새 파일을 쓸 수 있는지 확인하십시오.
테스트 목적으로 디스크에 기록해야하는 파일을 수동으로 만들고 모든 사람이 쓸 수있는 권한을 열 수 있습니다. 로거가 쓰기를 시작하면 구성 기반이 아닌 권한 기반임을 알 수 있습니다.