예제 #1
0
        protected override void Handle(HttpContext context, Exception exception)
        {
            using (LockParser.Parse <ErrorLoggingFileMiddleware>().Begin())
            {
                var now            = DateTime.Now;
                var pathBase       = "logs";
                var dailyDirectory = now.ToString("yyyyMMdd");
                var hourlyFile     = $"{dailyDirectory}/{now.ToString("yyyyMMdd HH")}-{((now.Hour + 1) % 24).ToString("00")}.txt";

                if (CheckHourlyFile != hourlyFile)
                {
                    var dir = $"{pathBase}/{dailyDirectory}";
                    if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }

                    CheckHourlyFile = hourlyFile;

                    _loggingFileStream?.Dispose();
                    _loggingWriter?.Dispose();

                    _loggingFileStream = new FileStream($"{pathBase}/{hourlyFile}", FileMode.Append, FileAccess.Write);
                    _loggingWriter     = new StreamWriter(_loggingFileStream);
                }

                _loggingWriter.WriteLineAsync($"{DateTime.Now}\tUrl: {context.Request.Url()}\tFrom: {context.Connection.RemoteIpAddress}");
                _loggingWriter.WriteLine(exception.Message);
                _loggingWriter.WriteLine(exception.StackTrace);
                _loggingWriter.WriteLine();

                _loggingWriter.Flush();
                _loggingFileStream.Flush();
            }
        }
예제 #2
0
        public void Test()
        {
            var lockParser = new TypeLockParser(nameof(NStandard));

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            var result = Concurrency.Run(resultId =>
            {
                using (var _lock = lockParser.Parse <TypeLockTest>().TryBegin(500))
                {
                    if (_lock.Value)
                    {
                        Thread.Sleep(1000);
                        return("Entered");
                    }
                    else
                    {
                        return("Timeout");
                    }
                }
            }, level: 2, threadCount: 2);

            stopwatch.Stop();

            Assert.Equal(1, result.Values.Count(x => x == "Entered"));
            Assert.Equal(1, result.Values.Count(x => x == "Timeout"));
            Assert.True(stopwatch.ElapsedMilliseconds < 1900);
        }
예제 #3
0
        public async Task InvokeAsync(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex)
            {
                using (LockParser.Parse <ErrorLoggingFileMiddleware>().Begin())
                {
                    var now        = DateTime.Now;
                    var dailyDir   = now.ToString("yyyyMMdd");
                    var hourlyFile = $"{dailyDir}/{now:yyyyMMdd}-{now.Hour:00}h-{(now.Hour + 1) % 24:00}h.txt";

                    if (CheckHourlyFile != hourlyFile)
                    {
                        var dir = $"{PathBase}/{dailyDir}";
                        if (!Directory.Exists(dir))
                        {
                            Directory.CreateDirectory(dir);
                        }

                        CheckHourlyFile = hourlyFile;

                        _loggingWriter?.Dispose();
                        _loggingFileStream?.Dispose();

                        _loggingFileStream = new FileStream($"{PathBase}/{hourlyFile}", FileMode.Append, FileAccess.Write);
                        _loggingWriter     = new StreamWriter(_loggingFileStream);
                    }

                    _loggingWriter.WriteLine($"{DateTime.Now}\tUrl: {context.Request.Url()}\tFrom: {context.Connection.RemoteIpAddress}");
                    _loggingWriter.WriteLine(ex.Message);
                    _loggingWriter.WriteLine(ex.StackTrace);
                    _loggingWriter.WriteLine();

                    _loggingWriter.Flush();
                    _loggingFileStream.Flush();
                }
                throw;
            }
        }
예제 #4
0
        public void Test()
        {
            var lockParser = new TypeLockParser(nameof(NStandard));

            var report = Concurrency.Run(resultId =>
            {
                using var _lock = lockParser.Parse <TypeLockTest>().TryBegin(500);

                if (_lock.Value)
                {
                    Thread.Sleep(1000);
                    return("Entered");
                }
                else
                {
                    return("Timeout");
                }
            }, level: 2, threadCount: 2);

            Assert.Equal(1, report.Results.Count(x => x.Return == "Entered"));
            Assert.Equal(1, report.Results.Count(x => x.Return == "Timeout"));
            Assert.True(report.AverageElapsed?.TotalMilliseconds < 2000);
        }