• システム開発に関わる内容をざっくりと書いていく

NLogの使用例(.net C# MVC)

1、NLogをインストールする

Install-Package NLog.Config

2、NLog.configを編集する(NLog.configをインストールすると生成される)

3、ログの書き出し(コントローラーの開始と終了)

 一:NLogの読み込みとエラー時のログ書き込みの実装

public static void Main(string[] args)
        {
            // nlog.configの読み込み.
            var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
            try
            {
                CreateWebHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Stopped program because of exception");
                throw;
            }
            finally
            {
                LogManager.Shutdown();
            }
        }

二:NLog以外のProviderの無効化

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging((hostingContext, logging) => {
                    // NLog 以外で設定された Provider の無効化.
                    logging.ClearProviders();
                })
                .UseNLog();

三:アクションフィルターの実装

public class SampleActionFilter : IActionFilter
    {
        public const string PERIOD = "authentication_period";
        private readonly ILogger _logger;
        public SampleActionFilter(ILogger<SampleActionFilter> logger)
        {
            _logger = logger;
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            Log("OnActionExecuted", context.RouteData);
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            Log("OnActionExecuting", context.RouteData);
            var expire = DateTime.UtcNow.AddDays(1).AddHours(9);
            var cOptions = new CookieOptions
            {
                SameSite = SameSiteMode.Lax,
                HttpOnly = false,
                Secure = true,
                Expires = expire,
            };
            context.HttpContext.Response.Cookies.Append(PERIOD, expire.ToString(), cOptions);
        }

        private void Log(string methodName, RouteData routeData)
        {
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];
            var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
            _logger.LogInformation(message);
        }
    }

四:アクションフィルターの適用

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers(options =>
            {
                options.Filters.Add(typeof(SampleActionFilter));
            })
            .AddNewtonsoftJson(options =>
            {
                // モデルバインディング時にJSONでDateTime型を使用すると時間差が発生する
                // 以下のコードを追加で対応
                options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
            });