#define TRACE using System; using System.Diagnostics; using System.Runtime.CompilerServices; 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, int line = 0) { _logQueue.Enqueue(new LogItem(message, new StackTrace(fNeedFileInfo: true).GetFrame(5), level, exception, stackFile, line)); } #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 Debug(string message, [CallerFilePath] string file = "", [CallerMemberName] string member = "", [CallerLineNumber] int line = 0) { CacheLog(message, Level.Debug, null, false, file, line); } /// /// 输出普通日志。 /// /// 日志内容。 /// 是否跟踪调用堆栈。 /// 产生日志的源文件名称。 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 } }