-
Notifications
You must be signed in to change notification settings - Fork 326
/
SetTraceLog.cs
101 lines (85 loc) · 3.68 KB
/
SetTraceLog.cs
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
using System;
using System.Diagnostics;
using System.Management.Automation;
namespace PnP.PowerShell.Commands.Base
{
[Cmdlet(VerbsCommon.Set, "PnPTraceLog")]
public class SetTraceLog : PSCmdlet
{
[Parameter(Mandatory = true, ParameterSetName = "On")]
public SwitchParameter On;
[Parameter(Mandatory = false, ParameterSetName = "On")]
public string LogFile;
[Parameter(Mandatory = false, ParameterSetName = "On")]
public SwitchParameter WriteToConsole;
[Parameter(Mandatory = false, ParameterSetName = "On")]
public PnP.Framework.Diagnostics.LogLevel Level = PnP.Framework.Diagnostics.LogLevel.Information;
[Parameter(Mandatory = false, ParameterSetName = "On")]
public string Delimiter;
[Parameter(Mandatory = false, ParameterSetName = "On")]
public int IndentSize = 4;
[Parameter(Mandatory = false, ParameterSetName = "On")]
public bool AutoFlush = true;
[Parameter(Mandatory = true, ParameterSetName = "Off")]
public SwitchParameter Off;
private const string FileListenername = "PNPPOWERSHELLFILETRACELISTENER";
private const string ConsoleListenername = "PNPPOWERSHELLCONSOLETRACELISTENER";
protected override void ProcessRecord()
{
if (ParameterSetName == "On")
{
// Setup Console Listener if Console switch has been specified or No file LogFile parameter has been set
if (WriteToConsole.IsPresent || string.IsNullOrEmpty(LogFile))
{
RemoveListener(ConsoleListenername);
ConsoleTraceListener consoleListener = new ConsoleTraceListener(false);
consoleListener.Name = ConsoleListenername;
Trace.Listeners.Add(consoleListener);
PnP.Framework.Diagnostics.Log.LogLevel = Level;
}
// Setup File Listener
if (!string.IsNullOrEmpty(LogFile))
{
RemoveListener(FileListenername);
if (!System.IO.Path.IsPathRooted(LogFile))
{
LogFile = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, LogFile);
}
// Create DelimitedListTraceListener in case Delimiter parameter has been specified, if not create TextWritterTraceListener
TraceListener listener = !string.IsNullOrEmpty(Delimiter) ?
new DelimitedListTraceListener(LogFile) { Delimiter = Delimiter, TraceOutputOptions = TraceOptions.DateTime } :
new TextWriterTraceListener(LogFile);
listener.Name = FileListenername;
Trace.Listeners.Add(listener);
PnP.Framework.Diagnostics.Log.LogLevel = Level;
}
Trace.AutoFlush = AutoFlush;
Trace.IndentSize = IndentSize;
}
else
{
Trace.Flush();
RemoveListener(ConsoleListenername);
RemoveListener(FileListenername);
}
}
private void RemoveListener(string listenerName)
{
try
{
var existingListener = Trace.Listeners[listenerName];
if (existingListener != null)
{
existingListener.Flush();
existingListener.Close();
Trace.Listeners.Remove(existingListener);
}
}
catch (Exception)
{
// ignored
}
}
}
}