新文章 网摘 文章 随笔 日记

日志削峰

    public class NLogLogger : ILogger
    {
        private static readonly Queue<Task> ErrQueue = new Queue<Task>();
        private readonly Logger _logger = LogManager.GetCurrentClassLogger();

        static NLogLogger()
        {
            var processThread = new Thread(ExecuteTask);
            processThread.Start();
        }
        /// <summary>
        /// 执行写日志任务
        /// </summary>
        private static void ExecuteTask()
        {
            while (true)
            {
                if (ErrQueue.Count>0)
                {
                    var task = ErrQueue.Dequeue();
                    task.RunSynchronously();
                }
                Thread.Sleep(10000);
            }

        }
        public void Debug(string message)
        {
            //_logger.Debug(message);

            var task = new Task(() => _logger.Debug(message));
            AddTask(task);

        }

        public void Debug(string message, Exception exception)
        {
            //_logger.Debug(exception, message);

            var task = new Task(() => _logger.Debug(exception, message));
            AddTask(task);
        }

        public async Task Error(string message)
        {
            var task = new Task(() => _logger.Error(message));
            AddTask(task);
            //await Task.Run(() => _logger.Error(message));
        }

        public async Task Error(string message, Exception exception)
        {
            //await Task.Run(() => _logger.Error(exception, message));


            var task = new Task(() => _logger.Error(exception, message));
            AddTask(task);
        }

        public void Error(Exception exception)
        {
            //_logger.Error(exception, $"{exception.Message}\r\n\r\n堆栈跟踪:\r\n{exception.StackTrace}");

            var task = new Task(() => _logger.Error(exception, $"{exception.Message}\r\n\r\n堆栈跟踪:\r\n{exception.StackTrace}"));
            AddTask(task);
        }

        public void Fatal(string message)
        {
            //_logger.Fatal(message);

            var task = new Task(() => _logger.Fatal(message));
            AddTask(task);
        }

        public void Fatal(string message, Exception exception)
        {
            //_logger.Fatal(exception, message);

            var task = new Task(() => _logger.Fatal(exception, message));
            AddTask(task);
        }

        public void Info(string message)
        {
            //_logger.Info(message);

            var task = new Task(() => _logger.Info(message));
            AddTask(task);
        }

        public void Info(string message, Exception exception)
        {
            //_logger.Info(exception, message);

            var task = new Task(() => _logger.Info(exception, message));
            AddTask(task);
        }

        public void Warn(string message)
        {
            //_logger.Warn(message);

            var task = new Task(() => _logger.Warn(message));
            AddTask(task);
        }

        public void Warn(string message, Exception exception)
        {
            //_logger.Warn(exception, message);

            var task = new Task(() => _logger.Warn(exception, message));
            AddTask(task);
        }

        private void AddTask(Task task)
        {
            //熔断,如果密集产生错误超过3个,就不再接受
            if (ErrQueue.Count >= 3)
            {
                return;
            }

            ErrQueue.Enqueue(task);
        }

    }

 

posted @ 2020-10-07 17:33  岭南春  阅读(64)  评论(0)    收藏  举报