2017-11-09 18 views
1

그래서 최근에 ASP.NET Core 2.0 응용 프로그램을 만들고 프로그래밍하는 작업부터 시작했습니다. Serilog를 사용하여 로깅이 작동하고 로컬 컴퓨터의 .txt 로그 파일에 쓸 수 있습니다. 이 파일의 경로는 내 Startup.ConfigureServices 메소드에서 읽은 appsettings.json 파일에 기록됩니다.내 ASP.NET 핵심 응용 프로그램이 성공적으로 시작될 때 또는 수행하지 않을 때의 로그

그러나 내 ASP.NET 핵심 응용 프로그램이 성공적으로 시작되거나 실행되지 않을 때 내 프로그램 클래스에서 로그인하려고합니다. 문제는 다음과 같습니다. appsettings.json 파일을 읽고 Program 클래스에서 로그 파일 경로를 가져 와서 해당 파일에 로그 할 수 있습니까? 내 Program.cs에서

var builder = new ConfigurationBuilder() 
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var configuration = builder.Build(); 

Log.Logger = new LoggerConfiguration() 
    .MinimumLevel 
    .Information(). 
    WriteTo.RollingFile(configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information) 
    //.WriteTo.Log4Net() 
    .CreateLogger(); 

을하지만 내 appsettings.json를 읽을 수 없습니다 :

나는 시도했습니다. GetValue가 올바른 키를 사용하는지 두 번 확인했습니다.

답변

0

이 같은 수행 할 수 있습니다

public static void Main(string[] args) 
{ 
    var host = BuildWebHost(args); 
    using (var scope = host.Services.CreateScope()) 
    { 
     var services = scope.ServiceProvider; 

     var logger = services.GetRequiredService<ILogger<Program>>(); 

     //Do some logging 
    } 

    host.Run(); 
} 
+0

WebHost를 빌드 한 후 시작 프로그램에 Logger.Logger를 정의하고 프로그램에 로그인하여 문제를 해결했습니다. 고마워요, 대답 – Jeroen

+0

그걸 해결해 줘요! 어쩌면 다른 사람들이 볼 수 있도록 답변을 게시 할 수 있습니까? – Verendus

1

내가 이런 loggerconfiguration와 정적 로그 클래스를 사용하여 고정 :

내부 Startup.ConfigureServices()를

 Log.Logger = new LoggerConfiguration() 
      .MinimumLevel 
      .Information(). 
      WriteTo.RollingFile(Configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information) 
      .CreateLogger(); 
     //all the services.add code... 

내 프로그램 .cs에서

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var host = BuildWebHost(args); 

     using (var scope = host.Services.CreateScope()) 
     { 
      var services = scope.ServiceProvider; 
      try 
      { 
       var context = services.GetRequiredService<UpdateServerContext>(); 
       DbInitializer.Initialize(context); 
      } 
      catch (Exception ex) 
      { 
       Log.Error(ex, "An error occurred while seeding the database."); 
      } 
     } 

     try 
     { 
      Log.Information("Starting web host"); 
      host.Run(); 
      BuildWebHost(args).Run(); 
     } 
     catch (Exception ex) 
     { 
      Log.Fatal(ex, "Starting web host failed."); 
     } 
    } 

    public static IWebHost BuildWebHost(string[] args) => 
     WebHost.CreateDefaultBuilder(args) 
      .UseSerilog() 
      .UseStartup<Startup>() 
      .Build(); 
} 

이러한 방식으로 로그는 이미 Startup 클래스에서 만든 경우에만 사용됩니다.

2

ConfigurationBuilderSetBasePath이 누락되었을 수 있습니다 (간단한 구성 섹션 here 참조). 아래 예제를 참고하면 환경 설정에 따라 appsettings를 재정의 할 수 있습니다.

public class Program 
{ 
    public static int Main(string[] args) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(System.IO.Directory.GetCurrentDirectory()) 
      .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true) 
      .AddEnvironmentVariables(); 

     var configuration = builder.Build(); 

     Log.Logger = new LoggerConfiguration() 
      .MinimumLevel.Information() 
      .WriteTo.RollingFile(configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information) 
      .CreateLogger(); 

     try 
     { 
      Log.Information("Starting web host"); 
      BuildWebHost(args).Run(); 
      return 0; 
     } 
     catch (Exception ex) 
     { 
      Log.Fatal(ex, "Web Host terminated unexpectedly"); 
      return 1; 
     } 
     finally 
     { 
      Log.CloseAndFlush(); 
     } 
    } 

    public static IWebHost BuildWebHost(string[] args) => 
     WebHost.CreateDefaultBuilder(args) 
     .ConfigureLogging((ctx, builder) => 
     { 
      builder.ClearProviders(); 
      builder.SetMinimumLevel(LogLevel.Information); 
      builder.AddSerilog(); 
     }) 
     .UseStartup<Startup>() 
     .Build(); 
} 
+0

그게 좋은 팁 남자 감사합니다. 이제는 Main 메서드에서도 내 구성을 사용할 수 있습니다. – Jeroen