외부 파일의 Log4Net 구성이 작동하지 않습니다.


91

log4net을 사용하고 있으며 다른 섹션에서 수행 한 것처럼 외부 구성 파일에 구성을 지정하려고합니다. 이를 위해 App.config의 log4net 섹션을 다음과 같이 변경했습니다.

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

그리고 Log.Config 파일 (App.config와 동일한 디렉토리)에는 다음이 있습니다.

<log4net>
  <appender name="General" type="log4net.Appender.FileAppender">
    <file value="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

그러나 앱을 실행할 때 로그 파일이 생성되지 않고 로깅이 수행되지 않습니다. 콘솔에 출력되는 오류 메시지가 없습니다.

Log.config 파일의 내용을 App.config로 다시 이동하면 (위의 첫 번째 코드 줄 대체) 예상대로 작동합니다. 왜 외부 파일에서 작동하지 않는지 아십니까?


나는 똑같은 문제에 부딪혔다-우리는 아마도 같은 (잘못 안내 된) 가이드를 따랐을 것이다!
Zach Burlingame

14
이것이 내가 log4net에 대해 싫어하는 것입니다. 로깅 프레임 워크는 내 생각에 앱에서 가장 견고한 부분 중 하나 여야하지만 log4net은 종종 약간 결함이있는 것처럼 보입니다.
UpTheCreek

답변:


113

AssemblyInfo.cs파일에 다음 속성이 있습니까?

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

로깅 기능이 필요한 각 클래스의 시작 부분에 다음과 같이 코드를 작성합니다.

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

여기 에이 정보와 기타 정보가 포함 된 블로그 게시물이 있습니다 .


17
이것은 작동합니다. log4net.config 파일을 작성하여 "항상 복사"에서 "출력 디렉토리로 복사"특성을 설정하는지 확인하십시오.
E. van der Spoel

@mitchwheat 절대적으로 하나님처럼, 나는 이것이 하루 종일 정확히 무엇을하기 위해 ninject 기반 솔루션과 싸우고 있었습니까 ... 감사합니다!
전쟁

39

있습니다 열려있는 결함 이 문제에 대한이. Log4Net은 구성 요소의 configSource 속성을 지원하지 않습니다. 순전히 구성 파일 솔루션을 사용하려면 appSettings에서 log4net.Config 키를 사용합니다.

1 단계 : 일반 구성 섹션 정의 포함 :

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

2 단계 : appSettings에서 매직 log4net.Config 키를 사용합니다.

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

3 단계 : configSource 처리를 수정하는 패치를 제공합니다.


5
log4net.Config.XmlConfigurator.Configure ();에 대한 호출 configSource를 읽지
않고이

이것은 나를 위해 아무것도 변경하지 않았습니다. 아직 문제를 파악하지 못했지만 후속 조치를 취하겠습니다.
Don Rolling

5
log4net 구성 파일을 "최신 인 경우 복사"로 표시하는 것이 중요합니다. 구성 파일이 bin 폴더에 복사되지 않으면 작동하지 않습니다.
Francisco Goldenstein 2015

이것은 그대로 저에게 효과가 있었으며 일부 라이브러리는 별도의 log4net.config에서 로깅이 구성되고 때로는 로깅이있는 독립형 앱에서 사용되는 웹 앱에서 일부 라이브러리가 사용되기 때문에 허용되는 솔루션보다 선호합니다. app.exe.config에서 구성됩니다. 이렇게하면 어셈블리 정보 대신 구성에 모두 포함됩니다. log4net.config에 "하드 코딩"하고 싶지 않습니다
Danny

27

놓친 단계는

log4net.Config.XmlConfigurator.Configure(); 

그러면 configSource가 사용됩니다. GetLogger ()를 호출하기 전에 한 번 호출해야합니다.


Mitch Wheat의 솔루션을 사용하는 경우이 작업을 수행 할 필요가 없습니다.
Robert Wagner

4
@Robert : 물론, Mitch Wheat의 솔루션은 app.config 외부에서 구성 파일을 하드 코딩해야하지만 원래 질문은 configSource가 작동하지 않는 이유를 읽었습니다.이 추가 단계를 따르면 작동합니다.
Greg Domjan 2011

특히 내부적으로 log4net (나중에 대체 가능)을 사용하는 래퍼 로그 처리기를 만든 다음이 래퍼 로그 처리기에서 log4net.Config.XmlConfigurator.Configure ()를 호출합니다. 이런 식으로 자체 app.config가있는 모든 프로젝트는 assembler.cs를 변경할 필요없이이 래퍼 로그 처리기를 사용할 수 있습니다.
zheng yu

19

log4net.config 파일이 다음 속성으로 설정되어 있는지 확인합니다.

빌드 액션 : 콘텐츠

출력 디렉토리에 복사 : 항상 복사


10

어느 쪽이든,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

아니면 그냥

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

두 경우 모두 Log4Net.config 파일이 출력 디렉토리에 있어야합니다. 솔루션 탐색기에서 Log4Net.config 파일 속성을 설정하여이를 수행 할 수 있습니다. 빌드 조치-컨텐츠 및 출력 디렉토리에 복사-항상 복사


첫 번째 경우에는 <configSections> 태그가 필요하지 않습니다
disklosr

2

이 문제를 조심하세요 ...

제 경우에는 모든 것이 올바르게 구성되었습니다. 문제는 Visual Studio 2013 내에서 Web Deploy를 사용하여 사이트를 WinHost.com 에 업로드 하고 서버 에서 ACL 을 재설정한다는 것 입니다. 이것은 차례로 폴더와 파일에 대한 모든 권한을 취소했습니다. log4net은 파일을 쓸 수 없습니다.

여기에서 자세한 내용을 읽을 수 있습니다.

웹 배포 / MSBuild가 서버 권한을 엉망으로 만드는 방법

나는 그곳의 지원 팀에 ACL을 재설정하도록 요청한 다음 log4net이 로그를 뱉어 내기 시작했습니다. :)


1

배포 디렉터리에 복사 된 log4net.config라는 외부 구성 파일이 있다고 가정하면 다음과 같이 구성 할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

using log4net;

namespace MyAppNamespace {
    static class Program {
        //declare it as static and public so all classes in the project can access it
        //like so: Program.log.Error("got an error");
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
             //configure it to use external file
            log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
            //use it
            log.Debug("#############   STARING APPLICATION    #################");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}

1

나는 똑같은 문제가 있었다.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

실행중인 프로젝트에서 참조 프로젝트에 다음 줄이 있습니다.

[assembly: log4net.Config.XmlConfigurator]

참조 된 프로젝트에서이 줄을 제거하면 로그가 나타나기 시작합니다.


1

에 대한 디버그 모드를 켤 수도 있습니다 log4net. 다음을 App.config 파일에 삽입하십시오.

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

그리고 최소한 정확히 무엇이 잘못되었는지 도출 할 수있는 오류 메시지를 받게됩니다. 제 경우에는로 설정 Copy to output directory하는 것을 잊었습니다 Copy Always.


0

@Mitch, [assembly : ...] 선언이있는 파일이 있지만 ConfigFile 속성이 없습니다.

그것을 추가하고 Log.config를 가리키면 작동하기 시작했습니다. 다른 모든 구성 섹션 (예 : AppSettings)처럼 작동하고 수정없이 외부 구성 파일을 허용 할 것이라고 생각했을 것입니다.

글로벌 정적 로그 공급자로 래핑하므로 두 번째 설명이 없습니다.


0

제 경우에는 다음과 같은 오류 메시지가 나타납니다.

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

그리고 log4net.config파일은 Visual Studio 2017 프로젝트에 있었지만 bin\Debug폴더 의 파일을 확인했을 때 찾을 수 없었습니다.

내 원래 어셈블리 설정은 다음과 같습니다.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

약간의 연구 시간 후 다음과 같이 변경하면 작동합니다.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]

0
  1. AssemblyInfo.cs 에 다음을 추가하십시오.

[어셈블리 : log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]

  1. log4net.config가 프로젝트에 포함되어 있는지 확인하십시오.
  2. log4net.config의 속성에서

복사를 출력 디렉토리 로 변경 하여 최신 인 경우 복사로 변경

  1. 로그 레벨 레벨 값 "ALL"을 다시 확인하십시오.

0

또한 웹 앱에서는 bin 폴더가 아닌 루트 디렉터리를 참조하므로 해당 위치에 구성 파일을 저장해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.