using System; using System.Reflection; using System.Text; using DocumentFormat.OpenXml.Packaging; using log4net.Core; namespace Aitex.Core.RT.Log { /// /// 将日志信息写入磁盘的写入器对象。 /// internal class LogWriter { #region Variables /// /// 时间字串和日志消息之间的缩进字符个数。 /// private const int INTEND_DATE_AND_MSG = 4; private readonly ILogger _logger; #endregion #region Constructors /// /// 构造日志写入器对象的实例。 /// public LogWriter() { _logger = LoggerManager.GetLogger(Assembly.GetExecutingAssembly(), "CommonLogger"); } #endregion #region Methods /// /// 格式化日志字串。 /// /// 日志项目对象。 /// private static string FormatLogString(LogItem logItem) { var sb = new StringBuilder(); // 写入日志时间 var datePart = $"{logItem.Time:yyyy-MM-dd HH:mm:ss.fff}{new string(' ', INTEND_DATE_AND_MSG)}"; sb.Append(datePart); // 日志消息体缩进使用时间部分的字串长度,解决多行消息体换行后保持正确缩进的问题。 var intend = datePart.Length; var msgLines = logItem.Message.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); for (var i = 0; i < msgLines.Length; i++) { var line = msgLines[i].TrimEnd('\r', '\n'); if(i == 0) // 第一条消息不要添加缩进 sb.AppendLine(line); else if(i == msgLines.Length - 1) // 最后一条消息末尾不要添加换行 sb.Append($"{new string(' ', intend)}{line}"); else // 其它消息添加缩进和换行 sb.AppendLine($"{new string(' ', intend)}{line}"); } return sb.ToString().TrimEnd('\r', '\n'); } /// /// 日志写入磁盘。 /// /// /// public string Write(LogItem logItem) { var formattedLogString = FormatLogString(logItem); _logger.Log(typeof(LogWriter), logItem.Level, formattedLogString, logItem.Exception); return formattedLogString; } #endregion } }