Exemplo n.º 1
0
        public static ILogger CreateLogger(string serviceName)
        {
            if (string.IsNullOrEmpty(serviceName))
            {
                serviceName = nameof(serviceName);
            }

            var properties = new WebRequestProperties
            {
                Url           = new Uri(BuildUri(serviceName)),
                HttpMethod    = DefaultHttpMethod,
                UserAgent     = GetOsVersion(),
                MachineName   = GetMachineName(),
                RemoteAddress = GetLocalIpAddress(),
                Request       = new RequestProperties(),
                Response      = new ResponseProperties(),
                StartDateTime = DateTime.UtcNow
            };

            Logger logger = new Logger();

            logger.DataContainer.WebRequestProperties = properties;

            return(logger);
        }
        private static void AddUserClaims(HttpRequest request, WebRequestProperties properties)
        {
            if (request.HttpContext.User?.Identity == null || request.HttpContext.User.Identity.IsAuthenticated == false)
            {
                return;
            }

            if ((request.HttpContext.User != null) == false)
            {
                return;
            }

            ClaimsPrincipal claimsPrincipal = (ClaimsPrincipal)request.HttpContext.User;
            ClaimsIdentity  identity        = (ClaimsIdentity)claimsPrincipal?.Identity;

            if (identity == null)
            {
                return;
            }

            List <KeyValuePair <string, string> > claims = ToDictionary(identity);

            properties.Request.Claims = claims;

            properties.IsAuthenticated = true;

            UserDetails user = KissLogConfiguration.Options.ApplyGetUser(properties.Request);

            properties.User = user;
        }
Exemplo n.º 3
0
        public static void NotifyListeners(this ILogger logger)
        {
            if (logger == null)
            {
                return;
            }

            if (logger is Logger theLogger)
            {
                WebRequestProperties webRequestProperties = theLogger.DataContainer.WebRequestProperties;

                if (webRequestProperties.Response == null)
                {
                    webRequestProperties.Response = new ResponseProperties
                    {
                        HttpStatusCode = HttpStatusCode.OK
                    };
                }

                if (theLogger.DataContainer.Exceptions.Any())
                {
                    webRequestProperties.Response.HttpStatusCode = HttpStatusCode.InternalServerError;
                }

                webRequestProperties.EndDateTime = DateTime.UtcNow;
            }

            Logger.NotifyListeners(logger);
        }
Exemplo n.º 4
0
        private string Format(WebRequestProperties webRequestProperties)
        {
            if (webRequestProperties == null)
            {
                return(string.Empty);
            }

            return(_textFormatter.Format(webRequestProperties));
        }
Exemplo n.º 5
0
        private void PostAuthenticateRquest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;

            WebRequestProperties properties = (WebRequestProperties)ctx.Items[Constants.HttpRequestPropertiesKey];

            if (properties == null)
            {
                return;
            }

            if ((ctx.User is ClaimsPrincipal) == false)
            {
                return;
            }

            ClaimsPrincipal claimsPrincipal = (ClaimsPrincipal)ctx.User;

            if (claimsPrincipal.Identity == null)
            {
                return;
            }

            if (claimsPrincipal.Identity.IsAuthenticated == false)
            {
                return;
            }

            properties.IsAuthenticated = true;
            properties.User            = new UserDetails
            {
                Name = claimsPrincipal.Identity.Name,
            };

            ClaimsIdentity claimsIdentity = claimsPrincipal?.Identity as ClaimsIdentity;

            if (claimsIdentity == null)
            {
                return;
            }

            List <KeyValuePair <string, string> > claims = DataParser.ToDictionary(claimsIdentity);

            properties.Request.Claims = claims;

            UserDetails user = KissLogConfiguration.Options.ApplyGetUser(properties.Request);

            if (user != null)
            {
                user.Name = user.Name ?? claimsIdentity.Name;
            }

            properties.User = user;
        }
Exemplo n.º 6
0
        public static WebRequestProperties Create(HttpRequest request)
        {
            WebRequestProperties result = new WebRequestProperties();

            if (request == null)
            {
                return(result);
            }

            result.StartDateTime = DateTime.UtcNow;
            result.UserAgent     = request.UserAgent;
            result.Url           = request.Url;
            result.HttpMethod    = request.HttpMethod;
            result.HttpReferer   = request.UrlReferrer?.AbsolutePath;
            result.RemoteAddress = request.UserHostAddress;
            result.MachineName   = GetMachineName(request);

            RequestProperties requestProperties = new RequestProperties();

            result.Request = requestProperties;

            var headers = DataParser.ToDictionary(request.Unvalidated.Headers);

            headers = FilterHeaders(headers);

            var queryString     = DataParser.ToDictionary(request.Unvalidated.QueryString);
            var formData        = DataParser.ToDictionary(request.Unvalidated.Form);
            var serverVariables = DataParser.ToDictionary(request.ServerVariables);

            serverVariables = FilterServerVariables(serverVariables);

            var cookies = DataParser.ToDictionary(request.Unvalidated.Cookies);

            requestProperties.Headers         = headers;
            requestProperties.QueryString     = queryString;
            requestProperties.FormData        = formData;
            requestProperties.ServerVariables = serverVariables;
            requestProperties.Cookies         = cookies;
            string inputStream = null;

            if (InternalHelpers.ShouldLogInputStream(headers))
            {
                inputStream = ReadInputStream(request);
            }

            requestProperties.InputStream = inputStream;

            return(result);
        }
Exemplo n.º 7
0
        private static ArgsResult CreateArgs(Logger[] loggers)
        {
            Logger defaultLogger = loggers.FirstOrDefault(p => p.CategoryName == Logger.DefaultCategoryName) ?? loggers.First();

            LoggerDataContainer dataContainer = defaultLogger.DataContainer;

            WebRequestProperties webRequestProperties = dataContainer.WebRequestProperties;
            string errorMessage = dataContainer.Exceptions.LastOrDefault()?.ExceptionMessage;
            List <LogMessagesGroup>  logMessages = new List <LogMessagesGroup>();
            List <CapturedException> exceptions  = new List <CapturedException>();

            foreach (Logger logger in loggers)
            {
                logMessages.Add(new LogMessagesGroup
                {
                    CategoryName = logger.CategoryName,
                    Messages     = logger.DataContainer.LogMessages.ToList()
                });

                exceptions.AddRange(logger.DataContainer.Exceptions);
            }

            exceptions = exceptions.Distinct(new CapturedExceptionComparer()).ToList();

            if (defaultLogger.IsCreatedByHttpRequest() == false && exceptions.Any())
            {
                webRequestProperties.Response.HttpStatusCode = System.Net.HttpStatusCode.InternalServerError;
            }

            List <LoggerFile> files = dataContainer.LoggerFiles.GetFiles().ToList();
            FlushLogArgs      args  = new FlushLogArgs
            {
                IsCreatedByHttpRequest = defaultLogger.IsCreatedByHttpRequest(),
                WebRequestProperties   = webRequestProperties,
                MessagesGroups         = logMessages,
                CapturedExceptions     = exceptions
            };

            args.Files = files;

            return(new ArgsResult
            {
                Args = args,
                Files = files
            });
        }
Exemplo n.º 8
0
        private void Context_PostAcquireRequestState(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;

            if (ctx.Session == null)
            {
                return;
            }

            // We need to add a dummy session value, otherwise ctx.Session.IsNewSession will always be true
            ctx.Session.Add("X-KissLogSession", true);

            WebRequestProperties requestProperties = (WebRequestProperties)ctx.Items[Constants.HttpRequestPropertiesKey];

            if (requestProperties == null)
            {
                return;
            }

            requestProperties.IsNewSession = ctx.Session.IsNewSession;
            requestProperties.SessionId    = ctx.Session.SessionID;
        }
Exemplo n.º 9
0
        public async Task Invoke(HttpContext context)
        {
            Logger logger = Logger.Factory.Get() as Logger;

            if (logger == null)
            {
                return;
            }

            logger.DataContainer.AddProperty(InternalHelpers.IsCreatedByHttpRequest, true);

            WebRequestProperties properties = WebRequestPropertiesFactory.Create(context.Request);

            Exception     ex = null;
            Stream        originalBodyStream = context.Response.Body;
            TemporaryFile responseBodyFile   = null;
            long          contentLength      = 0;

            try
            {
                using (var responseStream = new MemoryStream())
                {
                    context.Response.Body = responseStream;

                    await _next(context);

                    responseBodyFile = new TemporaryFile();
                    await ReadResponse(context.Response, responseBodyFile.FileName);

                    contentLength = responseStream.Length;

                    if (CanWriteToResponseBody(context.Response))
                    {
                        await responseStream.CopyToAsync(originalBodyStream);
                    }
                }
            }
            catch (Exception e)
            {
                ex = e;
                throw;
            }
            finally
            {
                context.Response.Body = originalBodyStream;

                properties.EndDateTime = DateTime.UtcNow;

                HttpStatusCode statusCode = (HttpStatusCode)context.Response.StatusCode;

                if (ex != null)
                {
                    statusCode = HttpStatusCode.InternalServerError;
                    logger.Log(LogLevel.Error, ex);
                }

                if (logger.DataContainer.ExplicitHttpStatusCode.HasValue)
                {
                    statusCode = logger.DataContainer.ExplicitHttpStatusCode.Value;
                }

                ResponseProperties response = ResponsePropertiesFactory.Create(context.Response);
                response.HttpStatusCode = statusCode;
                response.ContentLength  = contentLength;
                properties.Response     = response;

                if (responseBodyFile != null && InternalHelpers.PreFilterShouldLogResponseBody(logger, responseBodyFile, response))
                {
                    string responseFileName = InternalHelpers.ResponseFileName(response.Headers);
                    logger.LogFile(responseBodyFile.FileName, responseFileName);
                }

                logger.DataContainer.WebRequestProperties = properties;

                responseBodyFile?.Dispose();

                IEnumerable <ILogger> loggers = Logger.Factory.GetAll();

                Logger.NotifyListeners(loggers.ToArray());
            }
        }
        public static WebRequestProperties Create(HttpRequest request)
        {
            WebRequestProperties result = new WebRequestProperties();

            if (request == null)
            {
                return(result);
            }

            try
            {
                if (request.HttpContext.Session != null && request.HttpContext.Session.IsAvailable)
                {
                    bool isNewSession = false;

                    string lastSessionId = request.HttpContext.Session.GetString("X-KissLogSessionId");
                    if (string.IsNullOrEmpty(lastSessionId) || string.Compare(lastSessionId, request.HttpContext.Session.Id, StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        isNewSession = true;
                        request.HttpContext.Session.SetString("X-KissLogSessionId", request.HttpContext.Session.Id);
                    }

                    result.IsNewSession = isNewSession;
                    result.SessionId    = request.HttpContext.Session.Id;
                }
            }
            catch
            {
                // ignored
            }

            result.StartDateTime = DateTime.UtcNow;
            result.UserAgent     = request.Headers[HeaderNames.UserAgent].ToString();

            string url = request.GetDisplayUrl();

            result.Url = new Uri(url);

            result.MachineName = GetMachineName();

            RequestProperties requestProperties = new RequestProperties();

            result.Request = requestProperties;

            AddUserClaims(request, result);

            result.RemoteAddress = request.HttpContext.Connection?.RemoteIpAddress?.ToString();
            result.HttpMethod    = request.Method;

            string httpReferer        = null;
            string requestContentType = null;
            string inputStream        = null;

            foreach (string key in request.Headers.Keys)
            {
                if (string.Compare(key, "Cookie", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    continue;
                }

                StringValues values;
                request.Headers.TryGetValue(key, out values);

                string value = values.ToString();

                requestProperties.Headers.Add(new KeyValuePair <string, string>(key, value));

                if (string.Compare(key, "Referer", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    httpReferer = value;
                }

                if (string.Compare(key, "Content-Type", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    requestContentType = value;
                }
            }

            foreach (string key in request.Cookies.Keys)
            {
                string value = request.Cookies[key];

                requestProperties.Cookies.Add(new KeyValuePair <string, string>(key, value));
            }

            foreach (string key in request.Query.Keys)
            {
                string value = string.Join("; ", request.Query[key]);

                requestProperties.QueryString.Add(
                    new KeyValuePair <string, string>(key, value)
                    );
            }

            if (request.HasFormContentType)
            {
                foreach (string key in request.Form.Keys)
                {
                    string value = string.Join("; ", request.Form[key]);
                    requestProperties.FormData.Add(new KeyValuePair <string, string>(key, value));
                }
            }

            if (InternalHelpers.ShouldLogInputStream(requestProperties.Headers))
            {
                inputStream = ReadInputStream(request);
            }

            result.HttpReferer         = httpReferer;
            result.Request.InputStream = inputStream;

            return(result);
        }
Exemplo n.º 11
0
 public string Format(WebRequestProperties webRequestProperties)
 {
     return(_webRequestPropertiesTemplate(webRequestProperties));
 }
Exemplo n.º 12
0
        private void EndRequest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;

            Logger logger = Logger.Factory.Get() as Logger;

            if (logger == null)
            {
                return;
            }

            Exception ex = ctx.Server.GetLastError();

            if (ex != null)
            {
                logger.Log(LogLevel.Error, ex);
            }

            var sniffer = ctx.Response.Filter as ResponseSniffer;

            if (ctx.Response.StatusCode >= 400 && ex == null)
            {
                if (sniffer != null)
                {
                    string responseContent = sniffer.GetContent();
                    if (string.IsNullOrEmpty(responseContent) == false)
                    {
                        logger.Log(LogLevel.Error, responseContent);
                    }
                }
            }

            WebRequestProperties properties = (WebRequestProperties)HttpContext.Current.Items[Constants.HttpRequestPropertiesKey];

            properties.EndDateTime = DateTime.UtcNow;

            ResponseProperties response = WebResponsePropertiesFactory.Create(ctx.Response);

            properties.Response = response;

            if (logger.DataContainer.ExplicitHttpStatusCode.HasValue)
            {
                response.HttpStatusCode = logger.DataContainer.ExplicitHttpStatusCode.Value;
            }

            if (sniffer != null)
            {
                response.ContentLength = sniffer.MirrorStream.Length;
            }

            if (sniffer != null)
            {
                using (sniffer.MirrorStream)
                {
                    sniffer.MirrorStream.Position = 0;

                    if (InternalHelpers.PreFilterShouldLogResponseBody(logger, sniffer.MirrorStream, response))
                    {
                        using (TemporaryFile tempFile = new TemporaryFile())
                        {
                            using (var fs = File.OpenWrite(tempFile.FileName))
                            {
                                sniffer.MirrorStream.CopyTo(fs);
                            }

                            string responseFileName = InternalHelpers.ResponseFileName(properties.Response.Headers);
                            logger.LogFile(tempFile.FileName, responseFileName);
                        }
                    }
                }
            }

            logger.DataContainer.WebRequestProperties = properties;

            IEnumerable <ILogger> loggers = Logger.Factory.GetAll();

            Logger.NotifyListeners(loggers.ToArray());
        }