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);
}
}