public RequestLogEnricher(RequestLogData request, NancySerilogOptions options)
 {
     this.request = request;
     this.options = options;
     if (this.options.IgnoredRequestLogFields == null)
     {
         this.options.IgnoredRequestLogFields = new FieldChooser <RequestLogData>();
     }
 }
 public ErrorLogEnricher(ErrorLogData errorLog, NancySerilogOptions options)
 {
     this.errorLog = errorLog;
     this.options  = options;
     if (this.options.IgnoreErrorLogFields == null)
     {
         this.options.IgnoreErrorLogFields = new FieldChooser <ErrorLogData>();
     }
 }
Beispiel #3
0
        public static void EnableSerilog(this IPipelines pipelines, NancySerilogOptions options)
        {
            if (serilogEnabled)
            {
                return;
            }

            NancyPipelineExtensions.options = options;

            pipelines.BeforeRequest.AddItemToStartOfPipeline(BeforePipelineHook);
            pipelines.OnError.AddItemToEndOfPipeline(OnErrorHook);
            pipelines.AfterRequest.AddItemToEndOfPipeline(AfterPipelineHook);

            serilogEnabled = true;
        }
        public static RequestLogData ReadRequestProperties(this NancyContext context, NancySerilogOptions opts)
        {
            var nancyRequest  = context.Request;
            var request       = new RequestLogData();
            var ignoredFields = opts.IgnoredRequestLogFields.ToArray();

            if (!ignoredFields.Contains(nameof(request.RequestHostName)))
            {
                request.RequestHostName = nancyRequest.Url.HostName;
            }

            if (!ignoredFields.Contains(nameof(request.RequestHostName)))
            {
                request.Method = nancyRequest.Method;
            }

            if (!ignoredFields.Contains(nameof(request.Path)))
            {
                request.Path = nancyRequest.Url.Path;
            }

            if (!ignoredFields.Contains(nameof(request.QueryString)))
            {
                request.QueryString = nancyRequest.Url.Query;
            }

            if (!ignoredFields.Contains(nameof(request.RequestContentLength)))
            {
                request.RequestContentLength = nancyRequest.Headers.ContentLength;
            }

            if (!ignoredFields.Contains(nameof(request.RequestContentType)))
            {
                if (nancyRequest.Headers != null && nancyRequest.Headers.ContentType != null)
                {
                    request.RequestContentType = nancyRequest.Headers.ContentType.ToString();
                }
                else
                {
                    request.RequestContentType = "";
                }
            }

            if (!ignoredFields.Contains(nameof(request.RequestBodyContent)))
            {
                request.RequestBodyContent = "";

                if (!nancyRequest.Files.Any())
                {
                    // Only read request body content when there aren't any files
                    request.RequestBodyContent = nancyRequest.Body.ReadBodyContent();
                }
            }

            if (!ignoredFields.Contains(nameof(request.RequestHeaders)))
            {
                request.RequestHeaders = nancyRequest.Headers.ReadRequestHeaders();
                if (request.RequestHeaders.ContainsKey("User-Agent"))
                {
                    try
                    {
                        var userAgent  = request.RequestHeaders["User-Agent"];
                        var parser     = UAParser.Parser.GetDefault();
                        var clientInfo = parser.Parse(userAgent);
                        request.UserAgentFamily = clientInfo.UserAgent.Family;
                        request.UserAgentDevice = clientInfo.Device.Family;
                        request.UserAgentOS     = clientInfo.OS.Family;
                    }
                    catch
                    {
                        request.UserAgentFamily = "Other";
                        request.UserAgentDevice = "Other";
                        request.UserAgentOS     = "Other";
                    }
                }
                else
                {
                    request.UserAgentFamily = "Other";
                    request.UserAgentDevice = "Other";
                    request.UserAgentOS     = "Other";
                }
            }
            else
            {
                request.UserAgentFamily = "Other";
                request.UserAgentDevice = "Other";
                request.UserAgentOS     = "Other";
            }

            if (!ignoredFields.Contains(nameof(request.UserIPAddress)))
            {
                request.UserIPAddress = nancyRequest.UserHostAddress;
            }

            if (!ignoredFields.Contains(nameof(request.Query)))
            {
                if (nancyRequest.Query != null)
                {
                    request.Query = ReadDynamicDictionary(nancyRequest.Query);
                }
            }

            if (!ignoredFields.Contains(nameof(request.Query)))
            {
                request.RequestCookies = new Dictionary <string, string>(nancyRequest.Cookies);
            }

            return(request);
        }
        public static ResponseLogData ReadResponseProperties(this NancyContext context, NancySerilogOptions options)
        {
            var ignoredFields = options.IgnoredResponseLogFields.ToArray();

            var responseLogData = new ResponseLogData();
            var stopwatch       = (Stopwatch)context.Items["Stopwatch"];

            stopwatch.Stop();

            responseLogData.RequestId           = (string)context.Items["RequestId"];
            responseLogData.Duration            = stopwatch.ElapsedMilliseconds;
            responseLogData.StatusCode          = (int)context.Response.StatusCode;
            responseLogData.ResponseHeaders     = new Dictionary <string, string>(context.Response.Headers);
            responseLogData.ResponseContentType = context.Response.ContentType ?? "";
            responseLogData.ReasonPhrase        = context.Response.ReasonPhrase ?? "";
            responseLogData.ResolvedPath        = context.ResolvedRoute.Description.Path;
            responseLogData.RequestedPath       = context.Request.Path;
            responseLogData.Method = context.Request.Method;

            if (!ignoredFields.Contains(nameof(responseLogData.RawResponseCookies)))
            {
                var rawCookies = context.Response.Cookies.Select(cookie => new ResponseCookie
                {
                    HttpOnly = cookie.HttpOnly,
                    Secure   = cookie.Secure,
                    Expires  = cookie.Expires,
                    Name     = cookie.Name,
                    Value    = cookie.Value
                });

                responseLogData.RawResponseCookies = rawCookies.ToArray();
            }

            if (!ignoredFields.Contains(nameof(responseLogData.ResponseCookies)))
            {
                // Add cookies as key-valued dict, easier to index on documents
                // for example if you are using Elasticseach
                var cookieDict = new Dictionary <string, string>();

                foreach (var cookie in context.Response.Cookies)
                {
                    cookieDict.Add(cookie.Name, cookie.Value);
                }

                responseLogData.ResponseCookies = cookieDict;
            }


            if (!ignoredFields.Contains(nameof(responseLogData.ResponseContent)))
            {
                // Read the contents of the response stream and add it to log
                using (var memoryStream = new MemoryStream())
                {
                    context.Response.Contents(memoryStream);
                    responseLogData.ResponseContent       = Encoding.UTF8.GetString(memoryStream.ToArray());
                    responseLogData.ResponseContentLength = responseLogData.ResponseContent.Length;
                }
            }
            else
            {
                responseLogData.ResponseContent       = "";
                responseLogData.ResponseContentLength = 0;
            }

            if (!ignoredFields.Contains(nameof(responseLogData.ResolvedRouteParameters)))
            {
                responseLogData.ResolvedRouteParameters = ReadDynamicDictionary(context.Parameters);
            }

            return(responseLogData);
        }