배포환경은 리눅스 Centos7 였습니다.

윈도우 로컬 개발환경에서는 잘 기록되는 NLog가 리눅스 서버에 배포하면 잘 기록되지 않는 문제였습니다.

 

진입점소스는 아래와 같은 형태였었습니다. (네, 인터넷에서 검색해서 그냥 넣었습니다 ㅡㅡ)

        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                            .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                            .Build();

            NLog.LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));

            var host = CreateHostBuilder(args)
                .Build();
            
            host.Run();
        }

 

그리고 배포시에 사용하는  appsettings.Production.json 파일에 다음과 같이 설정하였습니다.

 

  {"NLog": {
    "variables": {
      "var_logdir": "/var/www/www.mydomain.com/log"
    },
    "targets": {
      "logfile": {
        "type": "File",
        "fileName": "${var_logdir}/nlog-${shortdate}.log"
      },
      "logconsole": {
        "type": "Console"
      }
    }
  }
 }

기본 개발환경에서는 var_logsdir 부분의 값은 "D:\Logs" 였구요..

 

첨에 왜 안되는지 이유를 모르고 좀 헤맸는데, 소스를 보면 간단히 확인되는 문제였습니다.!

 

위에 .AddJsonFile에서 기본적인 appsetting.json 만 해주었기 때문입니다.

(알아서 Production 등이 처리되는 줄... 착각했었네요..)

 

.AddJsonFile ... 부분 하단 라인에 아래와 같이 추가적으로 실행 환경에 맞는 설정을 추가해줘야합니다.

진입 함수에서 아래코드로 확인 가능합니다.

 

var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

 

=== 생략 ===

.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)

.AddEnvironmentVariables()

 

 

 

보통 Startup에서 저런 구성을 넣어주더군요...

 

하지만 굳이 env 불러오지 않고, 아래처럼 소스를 수정하여 해결을 보았습니다.

 

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args)
                .Build();
            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) => 
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(ConfigConfiguration) //ConfigConfiguration 호출
                .UseNLog() //NLog 사용
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                    .ConfigureKestrel(serverOptions => {
                        serverOptions.Limits.MaxConcurrentConnections = 1000;
                        serverOptions.Limits.MaxConcurrentUpgradedConnections = 1000;
                        serverOptions.Limits.MaxRequestBodySize = 1024 * 1024 * 100;
                        serverOptions.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100,
                                gracePeriod: TimeSpan.FromSeconds(10));
                        serverOptions.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100,
                                gracePeriod: TimeSpan.FromSeconds(10));                        
                        serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
                        serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
                    })
                    .UseStartup<Startup>();
                });
        

        static void ConfigConfiguration(HostBuilderContext ctx, IConfigurationBuilder config)
        {            
            NLog.LogManager.Configuration = new NLogLoggingConfiguration(config.Build().GetSection("NLog"));      
        }
    }

 

Builder 구성부분에서 config를 받아 메소드를 수행할 수 있도록 했고.

해당 메소드에서 NLog설정을 셋팅하도록 했습니다.

 

이제 각 환경 Development, Staging, Production 따라 각기 다른 환경에 맞게 로그가 잘 기록이 되는군요.

+ Recent posts