private static void InitWriters(string[] loggerParams, string fileName, bool useConsole) { if (loggerParams == null) { InitDefaultLoggers(fileName, useConsole); return; } Func <string, string> getKey = s => s.GetMatches(@".+(?=\=)").First().Trim(); Func <string, string> getValue = s => s.GetMatches(@"(?<=\=).+").First().Trim(); try { string roolLevels = loggerParams.FirstOrDefault(s => s.IsMatch(@"RootLevels[\s]*=")); if (!string.IsNullOrEmpty(roolLevels)) { levels = getValue(roolLevels).Split('|') .Select(s => { TraceMessageKind k = (TraceMessageKind)Enum.Parse(typeof(TraceMessageKind), s.Trim()); return(k); }) .ToArray(); } string loggerStr = loggerParams.FirstOrDefault(s => s.IsMatch(@"Loggers[\s]*=")); if (string.IsNullOrEmpty(loggerStr)) { InitDefaultLoggers(fileName, useConsole); return; } string[] loggers = getValue(loggerStr).Split(',').Select(s => s.Trim()).ToArray(); foreach (string logger in loggers) { Dictionary <string, object> curLogParams = loggerParams .Where(s => s.IsMatch(string.Format(@"{0}\..*=", logger))) .Select(s => s.ReplaceRegex(logger + @"\.", string.Empty)) .ToDictionary(s => getKey(s), s => (object)getValue(s)); curLogParams = UpdateWriterDict(fileName, curLogParams); if (curLogParams == null) { continue; } // Пропускаем логгирование консоли, если она отключена if (!useConsole && (WriterType)curLogParams["Type"] == WriterType.Console) { continue; } writers.Add(new Writer(curLogParams)); } } catch (Exception ex) { throw new Exception("Ошибка при разборе конфигурации логгеров", ex); } }
/// <summary> /// Запись в логгер /// </summary> public void Write(string message, TraceMessageKind traceMessageKind, string category, int indentLevel) { // Если уровень логирование недопустимый, то пропускаем запись if (!levels.Contains(TraceMessageKind.All) && !levels.Contains(traceMessageKind)) { return; } string[] words = category.Split('.'); category = string.Join(".", words.Skip(words.Length - Math.Min(words.Length, categoryCount))); string formattedMessage = string.Format(layout, string.Concat(Enumerable.Repeat(indent, indentLevel)), category, DateTime.Now.ToString(timeFormat), StringResources.GetLine(traceMessageKind), message); // Если сообщения совпадают, то инкрементируем счетчик if (formattedMessage == lastMessage && traceMessageKind == lastMessageKind) { messageCount++; return; } // Если счетчик не нулевой, то дописываем к предыдущему сообщению количество и выводим новое сообщение if (messageCount > 1) { if (type == WriterType.Console) { SetForegroundColor(lastMessageKind); } sw.Write(string.Format(" ({0})", messageCount)); Console.ResetColor(); messageCount = 1; } lastMessage = formattedMessage; lastMessageKind = traceMessageKind; if (type == WriterType.Console) { SetForegroundColor(traceMessageKind); } sw.Write(formattedMessage); Console.ResetColor(); }
/// <summary> /// Запись сообщения в лог /// </summary> private static void WriteToTrace(string message, TraceMessageKind traceMessageKind, string category) { // Если уровень логирование недопустимый, то пропускаем запись if (!levels.Contains(TraceMessageKind.All) && !levels.Contains(traceMessageKind)) { return; } foreach (Writer writer in writers) { writer.Write(message, traceMessageKind, category); } WriteEvent?.Invoke(new WriteEventArgs { Message = message, Kind = traceMessageKind }); }
/// <summary> /// Устанавливает цвет консоли /// </summary> private void SetForegroundColor(TraceMessageKind traceMessageKind) { switch (traceMessageKind) { case TraceMessageKind.CriticalError: Console.ForegroundColor = ConsoleColor.DarkRed; break; case TraceMessageKind.Error: Console.ForegroundColor = ConsoleColor.Red; break; case TraceMessageKind.Information: Console.ForegroundColor = ConsoleColor.White; break; case TraceMessageKind.Warning: Console.ForegroundColor = ConsoleColor.Yellow; break; } }
/// <summary> /// Запись сообщения в лог /// </summary> public static void WriteToTrace(string message, TraceMessageKind traceMessageKind) { WriteToTrace(message, traceMessageKind, Assembly.GetCallingAssembly().GetName().Name); }