Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Aitex/Core/RT/Log/LogManager.cs

173 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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