#define TRACE
using System;
using System.Diagnostics;
using Aitex.Core.Util;
using log4net.Core;
namespace Aitex.Core.RT.Log
{
///
/// 实现ICommonLog接口的日志管理器对象。
///
public class LogManager : ICommonLog
{
#region Variables
///
/// 周期性任务执行定时器。
///
private PeriodicJob _loggingJob;
///
/// 具有最大数量限制的列队。
///
private FixSizeQueue _logQueue;
///
/// 将日志信息写入磁盘的写入器对象。
///
private LogWriter _writer;
#endregion
#region Private Methods
///
/// 在后台线程中周期性执行的任务。
///
///
private bool BackgroundTask()
{
while (_logQueue.TryDequeue(out var log))
{
try
{
_writer.Write(log);
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
return true;
}
///
/// 缓存一条日志。
///
/// 日志延时写入磁盘,以减少磁盘IO次数,提高写入性能。
///
///
/// 日志内容。
/// 日志等级。
/// 异常对象实例。
/// 是否跟踪调用堆栈。
/// 产生日志的源文件名称。
private void CacheLog(string message, Level level, Exception exception, bool isTraceOn, string stackFile)
{
_logQueue.Enqueue(new LogItem(message, new StackTrace(fNeedFileInfo: true).GetFrame(5), level, exception, stackFile));
}
#endregion
#region Methods
///
/// 初始化日志管理器。
///
public void Initialize()
{
_logQueue = new FixSizeQueue(1000);
_loggingJob = new PeriodicJob(300, BackgroundTask, "Save Log Job", isStartNow: true);
_writer = new LogWriter();
LOG.InnerLogger = this;
}
///
/// 终止日志管理器。
///
public void Terminate()
{
try
{
if (_loggingJob != null)
{
_loggingJob.Stop();
_loggingJob = null;
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
///
/// 输出普通日志。
///
/// 日志内容。
/// 是否跟踪调用堆栈。
/// 产生日志的源文件名称。
public void Info(string message, bool isTraceOn, string stackFile)
{
CacheLog(message, Level.Info, null, isTraceOn, stackFile);
}
///
/// 输出报警日志。
///
/// 日志内容。
/// 产生日志的源文件名称。
public void Warning(string message, string stackFile)
{
CacheLog(message, Level.Warn, null, isTraceOn: true, stackFile);
}
///
/// 输出报警日志。
///
/// 日志内容。
/// 异常对象实例。
/// 产生日志的源文件名称。
public void Warning(string message, Exception ex, string stackFile)
{
CacheLog(message, Level.Warn, ex, isTraceOn: true, stackFile);
}
///
/// 输出错误日志。
///
/// 日志内容。
/// 产生日志的源文件名称。
public void Error(string message, string stackFile)
{
CacheLog(message, Level.Error, null, isTraceOn: true, stackFile);
}
///
/// 输出错误日志。
///
/// 日志内容。
/// 异常对象实例。
/// 产生日志的源文件名称。
public void Error(string message, Exception ex, string stackFile)
{
CacheLog(message, Level.Error, ex, isTraceOn: true, stackFile);
}
#endregion
}
}