Пример #1
0
        private static async Task LogRequest(
            NancyContext ctx,
            ILifetimeScope requestContainer,
            HttpStatusCode?statusCode = null)
        {
            var repository = requestContainer.Resolve <IAccessLogRepository>();
            var logger     = requestContainer.Resolve <ILogger>();

            try
            {
                var processingTime = CalculateProcessingTime(ctx);

                var sensitiveInfoInPathRegex = ctx.GetRegexForSensitiveInfoInPath();
                var actionStr = sensitiveInfoInPathRegex != null
                    ? sensitiveInfoInPathRegex.Replace(ctx.Request.Path, SensitiveInfoReplacement)
                    : ctx.Request.Path;

                var logEntry = new AccessLogEntry
                {
                    Action         = Truncate(actionStr, 255),
                    Method         = Truncate(ctx.Request.Method, 15),
                    ClientIp       = Truncate(ctx.GetClientHost(), 255),
                    StatusCode     = (int?)(statusCode ?? ctx.Response?.StatusCode),
                    ProcessedAt    = DateTime.UtcNow,
                    UserAgent      = Truncate(string.Join(", ", ctx.Request.Headers["User-Agent"]), 255),
                    UserId         = Truncate(ctx.CurrentUser?.Identity?.Name, 128),
                    ProcessingTime = processingTime,
                    Referer        = Truncate(ctx.Request.Headers.Referrer, 255),
                    AcceptLanguage = ctx.Request.Headers["Accept-Language"].Any()
                        ? Truncate(string.Join("|", ctx.Request.Headers["Accept-Language"]), 255)
                        : null,
                };

                await repository.Insert(logEntry);
            }
            catch (Exception ex)
            {
                logger.Error(ex, "LogRequest error");
            }
        }