forked from scriptcs/scriptcs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScriptConsoleLogger.cs
More file actions
124 lines (111 loc) · 4.7 KB
/
ScriptConsoleLogger.cs
File metadata and controls
124 lines (111 loc) · 4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Globalization;
using ScriptCs.Contracts;
using ScriptCs.Logging;
using LogLevel = ScriptCs.Contracts.LogLevel;
namespace ScriptCs.Hosting
{
public class ScriptConsoleLogger : ILog
{
private readonly LogLevel _consoleLogLevel;
private readonly IConsole _console;
private readonly ILog _log;
private readonly Dictionary<Logging.LogLevel, ConsoleColor> _colors =
new Dictionary<Logging.LogLevel, ConsoleColor>
{
{ Logging.LogLevel.Fatal, ConsoleColor.Red },
{ Logging.LogLevel.Error, ConsoleColor.DarkRed },
{ Logging.LogLevel.Warn, ConsoleColor.DarkYellow },
{ Logging.LogLevel.Info, ConsoleColor.Gray },
{ Logging.LogLevel.Debug, ConsoleColor.DarkGray },
{ Logging.LogLevel.Trace, ConsoleColor.DarkMagenta },
};
public ScriptConsoleLogger(LogLevel consoleLogLevel, IConsole console, ILog log)
{
Guard.AgainstNullArgument("console", console);
Guard.AgainstNullArgument("log", log);
_consoleLogLevel = consoleLogLevel;
_console = console;
_log = log;
}
public bool Log(
Logging.LogLevel logLevel, Func<string> messageFunc, Exception exception, params object[] formatParameters)
{
var logged = _log.Log(logLevel, messageFunc, exception, formatParameters);
var consoleLog = false;
switch (logLevel)
{
case Logging.LogLevel.Fatal:
consoleLog = true;
break;
case Logging.LogLevel.Error:
consoleLog = true;
break;
case Logging.LogLevel.Warn:
consoleLog = true;
break;
case Logging.LogLevel.Info:
consoleLog = _consoleLogLevel != LogLevel.Error;
break;
case Logging.LogLevel.Debug:
consoleLog = _consoleLogLevel == LogLevel.Debug || _consoleLogLevel == LogLevel.Trace;
break;
case Logging.LogLevel.Trace:
consoleLog = _consoleLogLevel == LogLevel.Trace;
break;
}
if (consoleLog && messageFunc != null)
{
var prefix = logLevel == Logging.LogLevel.Info
? null
: string.Concat(logLevel.ToString().ToUpperInvariant(), ": ");
var message = string.Format(CultureInfo.InvariantCulture, messageFunc(), formatParameters);
var suffix = string.Empty;
if (exception != null)
{
if (_consoleLogLevel == LogLevel.Debug || _consoleLogLevel == LogLevel.Trace)
{
var exceptions = new List<string>();
while (exception != null)
{
var exceptionString = string.Format(
CultureInfo.InvariantCulture,
"[{0}] {1}{2}{3}",
exception.GetType().FullName,
exception.Message,
Environment.NewLine,
exception.StackTrace);
exceptions.Add(exceptionString);
exception = exception.InnerException;
}
var divider = string.Format(
CultureInfo.InvariantCulture, "{0}{1}{0}", Environment.NewLine, "=== INNER EXCEPTION ===");
suffix = " " + string.Join(divider, exceptions);
}
else
{
suffix = string.Format(
CultureInfo.InvariantCulture, " [{0}] {1}", exception.GetType().Name, exception.Message);
}
}
ConsoleColor color;
if (!_colors.TryGetValue(logLevel, out color))
{
color = ConsoleColor.White;
}
var originalColor = _console.ForegroundColor;
_console.ForegroundColor = color;
try
{
_console.WriteLine(string.Concat(prefix, message, suffix));
}
finally
{
_console.ForegroundColor = originalColor;
}
}
return logged || consoleLog;
}
}
}