Skip to content

Commit b87e4d5

Browse files
authored
Merge pull request #650 from Excel-DNA/Logging
Logging configuration from environment and registry
2 parents 1461a51 + 1f9820d commit b87e4d5

File tree

4 files changed

+78
-3
lines changed

4 files changed

+78
-3
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Diagnostics;
2+
3+
namespace ExcelDna.Logging
4+
{
5+
internal class DiagnosticsFilter : TraceFilter
6+
{
7+
private TraceEventType filterLevel;
8+
9+
public DiagnosticsFilter(TraceEventType filterLevel)
10+
{
11+
this.filterLevel = filterLevel;
12+
}
13+
14+
public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data)
15+
{
16+
return eventType <= filterLevel;
17+
}
18+
}
19+
}

Source/ExcelDna.Integration/LogDisplayTraceListener.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ public LogDisplayTraceListener()
1717
{
1818
}
1919

20-
public LogDisplayTraceListener(string name)
20+
public LogDisplayTraceListener(string name, TraceEventType? filterLevel)
2121
: base(name)
2222
{
23+
if (filterLevel.HasValue)
24+
Filter = new DiagnosticsFilter(filterLevel.Value);
2325
}
2426

2527
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message)

Source/ExcelDna.Integration/Logging.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,12 @@ public static void Initialize()
8787
{
8888
if (!s_LoggingInitialized)
8989
{
90+
LoggingSettings settings = new LoggingSettings();
91+
9092
bool loggingEnabled = false;
9193
// DOCUMENT: By default the TraceSource is configured to source only Warning, Error and Fatal.
9294
// the configuration can override this.
93-
IntegrationTraceSource = new TraceSource(TraceSourceName, SourceLevels.Warning);
95+
IntegrationTraceSource = new TraceSource(TraceSourceName, settings.SourceLevel);
9496

9597
bool logDisplayTraceListenerIsConfigured = false;
9698
TraceListener logDisplayTraceListenerToRemove = null; // The one we want to remove if configured as "Off"
@@ -109,6 +111,10 @@ public static void Initialize()
109111
}
110112
logDisplayTraceListenerIsConfigured = true;
111113
}
114+
else if (tl.Name == "Default" && settings.DebuggerLevel.HasValue)
115+
{
116+
tl.Filter = new DiagnosticsFilter(settings.DebuggerLevel.Value);
117+
}
112118
}
113119

114120
try
@@ -134,7 +140,17 @@ public static void Initialize()
134140
else
135141
{
136142
// No explicit configuration for this default listener, so we add it
137-
IntegrationTraceSource.Listeners.Add(new LogDisplayTraceListener("LogDisplay"));
143+
IntegrationTraceSource.Listeners.Add(new LogDisplayTraceListener("LogDisplay", settings.LogDisplayLevel));
144+
}
145+
146+
if (!string.IsNullOrWhiteSpace(settings.FileName))
147+
{
148+
Trace.AutoFlush = true;
149+
150+
TextWriterTraceListener textWriterTraceListener = new TextWriterTraceListener(settings.FileName, "FileWriter");
151+
if (settings.FileLevel.HasValue)
152+
textWriterTraceListener.Filter = new DiagnosticsFilter(settings.FileLevel.Value);
153+
IntegrationTraceSource.Listeners.Add(textWriterTraceListener);
138154
}
139155

140156
AppDomain currentDomain = AppDomain.CurrentDomain;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Microsoft.Win32;
2+
using System;
3+
using System.Diagnostics;
4+
5+
namespace ExcelDna.Logging
6+
{
7+
internal class LoggingSettings
8+
{
9+
public SourceLevels SourceLevel { get; }
10+
public TraceEventType? LogDisplayLevel { get; }
11+
public TraceEventType? DebuggerLevel { get; }
12+
public TraceEventType? FileLevel { get; }
13+
public string FileName { get; }
14+
15+
public LoggingSettings()
16+
{
17+
SourceLevel = Enum.TryParse(GetCustomSetting("SOURCE_LEVEL", "SourceLevel"), out SourceLevels sourceLevelResult) ? sourceLevelResult : SourceLevels.Warning;
18+
19+
if (Enum.TryParse(GetCustomSetting("LOGDISPLAY_LEVEL", "LogDisplayLevel"), out TraceEventType logDisplayLevelResult))
20+
LogDisplayLevel = logDisplayLevelResult;
21+
22+
if (Enum.TryParse(GetCustomSetting("DEBUGGER_LEVEL", "DebuggerLevel"), out TraceEventType debuggerLevelResult))
23+
DebuggerLevel = debuggerLevelResult;
24+
25+
if (Enum.TryParse(GetCustomSetting("FILE_LEVEL", "FileLevel"), out TraceEventType fileLevelResult))
26+
FileLevel = fileLevelResult;
27+
28+
FileName = GetCustomSetting("FILE_NAME", "FileName");
29+
}
30+
31+
private static string GetCustomSetting(string environmentName, string registryName)
32+
{
33+
return Environment.GetEnvironmentVariable($"EXCELDNA_DIAGNOSTICS_{environmentName}") ??
34+
(Registry.GetValue(@"HKEY_CURRENT_USER\Software\ExcelDna\Diagnostics", registryName, null) as string ??
35+
Registry.GetValue(@"HKEY_LOCAL_MACHINE\Software\ExcelDna\Diagnostics", registryName, null) as string);
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)