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

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Install-Package NLog.Config
Install-Package NLog.Config
Install-Package NLog.Config

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

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
}
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(); } }
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の無効化

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging((hostingContext, logging) => {
// NLog 以外で設定された Provider の無効化.
logging.ClearProviders();
})
.UseNLog();
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureLogging((hostingContext, logging) => { // NLog 以外で設定された Provider の無効化. logging.ClearProviders(); }) .UseNLog();
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging((hostingContext, logging) => {
                    // NLog 以外で設定された Provider の無効化.
                    logging.ClearProviders();
                })
                .UseNLog();

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 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 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);
        }
    }

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

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