Пример #1
0
        public static LogElementResponse LogElement(LogElementDTO logElement)
        {
            lock (logElementLock)
            {
                try
                {
                    var config = ConfigurationHelper.GetConfigurationSection();
                    if (!config.Enabled)
                    {
                        return new LogElementResponse()
                               {
                                   Success = true
                               }
                    }
                    ;

                    var unixNow = TimeHelper.UnixTimestamp();

                    LogElementDTO lastLogElement = null;
                    //Cleanup old entries in dictionary
                    dictLastLogElementPerPage.Where(x => x.Value.UnixTimestamp < unixNow - cleanupAfterLastLogElementsAfterSeconds).Select(x => x.Key).ToList().ForEach(x => dictLastLogElementPerPage.Remove(x));

                    if (dictLastLogElementPerPage.TryGetValue(logElement.PageGUID, out lastLogElement))
                    {
                        if (lastLogElement.UnixTimestamp >= logElement.UnixTimestamp)
                        {
                            //Correct logElement, it must be placed after lastLogElement
                            var diffAdjust = (lastLogElement.UnixTimestamp + unixTimestampForwardAdjuster) - logElement.UnixTimestamp;
                            logElement.UnixTimestamp += diffAdjust;

                            if (logElement.UnixTimestampEnd.HasValue)
                            {
                                logElement.UnixTimestampEnd += diffAdjust;
                            }
                        }
                    }
                    else
                    {
                        //This is the first registered logElement for this pageGUID, nothing to correct against
                    }

                    if (unixNow < logElement.UnixTimestamp) //Get server back on right track if the logElement.UnixTimestamp is ahead of time, which it could be if the logElement was transfered from e.g. the clientside(browser)
                    {
                        var diffSeconds = logElement.UnixTimestamp - unixNow;

                        var diffMS = (int)Math.Ceiling(diffSeconds * 1000.0);
                        System.Threading.Thread.Sleep(diffMS);
                    }

                    dictLastLogElementPerPage[logElement.PageGUID] = logElement;

                    GetLoggingPersister(config.LogType).LogElement(config.FilePath, logElement);

                    return(new LogElementResponse()
                    {
                        Success = true
                    });
                }
                catch (Exception ex)
                {
                    return(new LogElementResponse()
                    {
                        Success = false, Message = ex.Message + " ::: " + ex.StackTrace
                    });
                }
            }
        }