programing

Asp.net core 2.0에서 log4net을 사용하는 방법

topblog 2023. 6. 7. 22:05
반응형

Asp.net core 2.0에서 log4net을 사용하는 방법

는 니다합구를 구성합니다.log4net기사에서 언급한 것처럼 나의 asp.net 코어 2.0 애플리케이션에서 링크.

program.cs

public static void Main(string[] args)
{
    var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
    XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

    BuildWebHost(args).Run();
}

홈 컨트롤러

public class HomeController : Controller
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));

    public IActionResult Error()
    {
        log.Info("Hello logging world!");
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

log4net.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingFile" />
    </root>
    <appender name="RollingFile" type="log4net.Appender.FileAppender">
      <file value="‪C:\Temp\app.log" /> 
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

불행합니다! 생성된 파일을 보지 못했습니다.C:\Temp\app.log디렉토리입니다.무엇이 잘못되었습니까? log4net.netasp.net core 2.0의 경우?

ASP.NET Core 로깅 인터페이스에는 타사 log4net 어댑터가 있습니다.

당신이 해야 할 일은 단지 통과하는 것입니다.ILoggerFactory의 신에게에.Startup수업, 그리고 나서 전화하기

loggerFactory.AddLog4Net();

구성을 준비해야 합니다.그래서 당신은 보일러 플레이트 코드를 작성할 필요가 없습니다.

자세한 내용은 여기에 있습니다.

다음 코드를 사용하여 파일을 성공적으로 기록할 수 있습니다.

public static void Main(string[] args)
{
    XmlDocument log4netConfig = new XmlDocument();
    log4netConfig.Load(File.OpenRead("log4net.config"));
    var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
               typeof(log4net.Repository.Hierarchy.Hierarchy));
    log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

    BuildWebHost(args).Run();
}

웹 사이트 루트의 log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <file value="C:\Temp\" />
    <datePattern value="yyyy-MM-dd.'txt'"/>
    <staticLogFileName value="false"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <maxSizeRollBackups value="100"/>
    <maximumFileSize value="15MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level App  %newline %message %newline %newline"/>
    </layout>
  </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
</log4net>

아직도 해결책을 찾고 계십니까?는 이 링크에서 제 것을 얻었습니다.

제가 해야 할 일은 "프로그램 클래스"에서 "public static void main" 메서드의 맨 위에 이 두 줄의 코드를 추가하는 것이었습니다.

 var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
 XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

예, 다음을 추가해야 합니다.

  1. 마이크로소프트.내선 번호.로깅.Log4Net.NuGet을 사용하는 AsNetCore.
  2. log4net.config 이름을 가진 텍스트 파일로 파일의 속성(출력 디렉터리에 복사)을 "새로 복사" 또는 "항상 복사"로 변경합니다.

또한 출력 콘솔에 기록된 모든 내용이 원하는 appender에 기록되도록 asp.net 코어 응용 프로그램을 구성할 수 있습니다.또한 github에서 이 예제 코드를 다운로드하여 내가 어떻게 구성했는지 확인할 수 있습니다.

Microsoft를 설치해야 합니다.내선 번호.로깅.Log4Net.AsNetCore NuGet 패키지를 가져오고 log4net.config-file을 응용 프로그램에 추가합니다.그러면 다음과 같이 작동합니다.

public class Program
{
    private readonly ILogger<Program> logger;

    public Program()
    {
        var services = new ServiceCollection()
            .AddLogging(logBuilder => logBuilder.SetMinimumLevel(LogLevel.Debug))
            .BuildServiceProvider();


        logger = services.GetService<ILoggerFactory>()
            .AddLog4Net()
            .CreateLogger<Program>();
    }

    static void Main(string[] args)
    {
        Program program = new Program();

        program.Run();

        Console.WriteLine("\n\nPress any key to continue...");
        Console.ReadKey();
    }

    private void Run()
    {
        logger.LogInformation("Logging is working");
    }
}

의 . 2.사용하는 하여 Irfan의 . Core 2.1.300을 합니다../log폴더 및 콘솔에도 연결됩니다.에 하십시오.log4net.config솔루션 루트에 존재해야 합니다(제 경우에는 앱 루트가 하위 폴더입니다).

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %-5level %logger - %message%newline" />
      </layout>
  </appender>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <file value="logs/" />
    <datePattern value="yyyy-MM-dd.'txt'"/>
    <staticLogFileName value="false"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <maxSizeRollBackups value="100"/>
    <maximumFileSize value="15MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level App  %newline %message %newline %newline"/>
    </layout>
  </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ConsoleAppender"/>
    </root>
</log4net>

다참을사항은고설정전방법다니입인통적또는하른▁up▁another▁xml▁다▁theal▁way▁within 내에서 XML을 설정하는 입니다.app.config작동하지 않음:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net> ...

어떤 이유로 인해 다음을 통해 XML 문서에 액세스할 때 log4net 노드를 찾을 수 없습니다.log4netConfig["log4net"].

loggerFactory에서 네임스페이스가 모호하다는 것이 어떤 문제인지 알아냈습니다.Log4Net()을 추가합니다.다음은 제가 어떻게 log4Net을 ASP에 추가했는지에 대한 간단한 요약입니다.NetCore 프로젝트.

  1. 마이크로소프트 너겟 패키지를 추가합니다.내선 번호.로깅.Log4Net.AsNetCore
  2. 루트 응용 프로그램 폴더에 log4net.config 파일을 추가합니다.

  3. Startup.cs 파일을 열고 이 loggerFactory 라인을 사용하여 log4net 지원을 추가하도록 구성 방법을 변경합니다.Log4Net 추가

먼저 Microsoft를 사용하여 패키지를 가져와야 합니다.내선 번호.로깅; 사용 문 사용

전체 메서드입니다. 네임스페이스를 사용하여 ILoggerFactory 인터페이스 앞에 붙여야 합니다.

public void Configure(IApplicationBuilder 앱, IHostingEnvironment, NorthwindContext 컨텍스트, Microsoft).내선 번호.로깅.I Logger 공장 로거 공장){로거 팩토리.Log4Net() 추가;....
}

저는 다음과 같은 방법으로 대응할 수 있었습니다.

1-Install-Package log4net
2-Install-Package MicroKnights.Log4NetAdoNetAppender
3-Install-Package System.Data.SqlClient

먼저 다음 코드를 사용하여 데이터베이스 및 테이블을 만듭니다.

CREATE DATABSE Log4netDb
CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

두 번째로, 프로그램에 log4net.config 파일을 만듭니다.다음은 로그 메시지에 대한 사용자 지정 없이 간단한 구성입니다.

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
  <!-- definition of the RollingLogFileAppender goes here -->
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Logs/WebApp.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <!-- Format is [date/time] [log level] [thread] message-->
      <conversionPattern value="[%date] [%level] [%thread] %m%n" />
    </layout>
  </appender>
  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
    <connectionStringName value="log4net" />
    <connectionStringFile value="appsettings.json" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingLogFileAppender" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

셋째, 아래 코드를 '로 바꿉니다.IHost Builder':

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        // clear default logging providers
        logging.ClearProviders();
        logging.AddConsole();  
        logging.AddDebug();
        logging.AddEventLog();
        // add more providers here
    })
    .UseStartup<Startup>();

넷째, appsettings.json에 다음 코드를 삽입합니다.

{
  "connectionStrings": {
    "log4net": "Server=MICKO-PC;Database=Log4netDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

마지막으로 다음 명령을 사용하여 로그인을 즐기십시오.

public class ValuesController : Controller
{
    private static readonly ILog log = LogManager.GetLogger(typeof(ValuesController));
    
    [HttpPost]
    public async Task<IActionResult> Login(string userName, string password)
    {
        log.Info("Action start");
        
        // More code here ...
        log.Info("Action end");
    }
    
    // More code here...
} 

행운을 빌어요.

.NET Core 2.2에서 log4net을 구현하는 방법을 알아보려면 여기를 클릭하십시오.

다음 단계는 위 링크에서 수행한 것으로, .NET Core 2.2 프로젝트에 log4net을 추가하는 방법을 설명합니다.

먼저 Package-Manager 콘솔에서 다음 명령을 실행합니다.

Install-Package Log4Net_Logging -Version 1.0.0

그런 다음 다음과 같은 정보를 사용하여 log4net.config를 추가합니다(설정과 일치하도록 편집하십시오).

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="logfile.log" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d [%t] %-5p - %m%n" />
      </layout>
    </appender>
    <root>
      <!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>
</configuration>

그런 다음 다음 코드를 컨트롤러에 추가합니다(이 예는 컨트롤러에 추가하기 전에 편집하십시오).

public ValuesController()
{
    LogFourNet.SetUp(Assembly.GetEntryAssembly(), "log4net.config");
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
    LogFourNet.Info(this, "This is Info logging");
    LogFourNet.Debug(this, "This is Debug logging");
    LogFourNet.Error(this, "This is Error logging");    
    return new string[] { "value1", "value2" };
}

그런 다음 관련 컨트롤러 조치를 호출합니다(위의 예를 사용하여 콜)./Values/GetHTTP GET)를 사용하면 다음과 일치하는 출력을 수신할 수 있습니다.

2019-06-05 19:58:45,103 [9] INFO-[Log4NetLogging_Project]컨트롤러.Values Controller.Get:23] - 정보 로깅입니다.

나는 a를 포팅합니다.NetFramework 콘솔 앱에서 .NetCore에서 특정 상황에서 로그 파일이 생성되지 않는 유사한 문제를 발견했습니다.

"CreateRepository"를 사용할 때 .net 프레임워크와 .net 표준 사이에 차이가 있는 것으로 나타납니다.

.Net Framework에서 이 작업은 log4net.config의 동일한 속성을 사용하여 고유한 파일 이름으로 고유한 로그 인스턴스를 만듭니다.

GlobalContext.Properties["LogName"] = LogName;
var loggerRepository = LogManager.CreateRepository(LogName);
XmlConfigurator.Configure(loggerRepository);

.Net Standard에서는 이 작업이 수행되지 않았으며 추적을 설정하면 구성 파일 ".config"를 찾을 수 없습니다.이전에 알려진 구성을 로드하지 않았습니다.구성자에 구성을 추가한 후에도 로그가 기록되지 않았으며 이에 대한 불만도 없었습니다.

그것을 작동시키기 위해.이전과 유사한 동작을 하는 Net Standard, 이것이 제가 한 일입니다.

var loggerRepository = LogManager.CreateRepository(LogName);
XmlConfigurator.Configure(loggerRepository,new FileInfo("log4net.config"));
var hierarchy = (Hierarchy) loggerRepository;
var appender = (RollingFileAppender)hierarchy.Root.GetAppender("RollingLogFileAppender");
appender.File = Path.Combine(Directory.GetCurrentDirectory(), "logs", $"{LogName}.log");

모든 레포에 대한 구성 파일을 만들고 싶지 않았기 때문에 이 작업이 가능합니다.아마도 더 나은 방법이 있을 것입니다.이전과 같은 Net Framework 동작과 만약 있다면 아래에 알려주시기 바랍니다.

언급URL : https://stackoverflow.com/questions/46169606/how-to-use-log4net-in-asp-net-core-2-0

반응형