Skip to content

Commit 581f6cd

Browse files
committed
feat(logging): add WPF trace configuration options and update log settings
- Introduced IncludeWpfTrace and WpfTraceLevel properties in LogConfig - Updated log settings to respect WPF trace level during initialization - Enhanced LogSettingsView to allow user configuration of WPF trace options
1 parent ef8fd54 commit 581f6cd

File tree

7 files changed

+109
-20
lines changed

7 files changed

+109
-20
lines changed

source/RevitDevTool/Models/Config/LogConfig.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Diagnostics;
12
using System.Text.Json.Serialization;
23
using Serilog;
34
namespace RevitDevTool.Models.Config;
@@ -16,15 +17,21 @@ public sealed class LogConfig
1617

1718
[JsonPropertyName("IncludeStackTrace")]
1819
public bool IncludeStackTrace { get; set; }
20+
21+
[JsonPropertyName("IncludeWpfTrace")]
22+
public bool IncludeWpfTrace { get; set; }
23+
24+
[JsonPropertyName("WpfTraceLevel")]
25+
public SourceLevels WpfTraceLevel { get; set; } = SourceLevels.Warning;
1926

2027
[JsonPropertyName("StackTraceDepth")]
2128
public int StackTraceDepth { get; set; } = 3;
2229

2330
[JsonPropertyName("TimeInterval")]
24-
public RollingInterval TimeInterval { get; set; } = RollingInterval.Infinite;
31+
public RollingInterval TimeInterval { get; set; } = RollingInterval.Day;
2532

2633
[JsonPropertyName("FilePath")]
27-
public string FilePath { get; set; } = string.Empty;
34+
public string FilePath { get; set; } = SettingsLocation.GetDefaultLogPath("log");
2835
}
2936

3037
public enum LogSaveFormat
29.8 KB
Loading

source/RevitDevTool/RevitDevTool.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@
8989
</Target>
9090

9191
<ItemGroup>
92-
<Resource Include="Resources\Icons\TraceGeometry32_dark.tiff" />
93-
<Resource Include="Resources\Icons\TraceGeometry32_light.tiff" />
92+
<Resource Include="Resources\Icons\*.*" />
9493
</ItemGroup>
9594

9695
<ItemGroup>

source/RevitDevTool/Services/SettingsService.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
using System.IO ;
1+
using System.Diagnostics;
2+
using System.IO ;
23
using System.Text.Json ;
34
using RevitDevTool.Models.Config ;
4-
using RevitDevTool.ViewModel.Settings;
55
using Serilog ;
66
using Wpf.Ui.Appearance ;
77

@@ -75,6 +75,7 @@ private void SaveLogSettings()
7575
var path = SettingsLocation.GetSettingsPath("LogConfig.json" );
7676
var json = JsonSerializer.Serialize(_logConfig);
7777
File.WriteAllText(path, json);
78+
PresentationTraceSources.DataBindingSource.Switch.Level = _logConfig?.WpfTraceLevel ?? SourceLevels.Warning;
7879
LogSettingsChanged?.Invoke();
7980
}
8081

@@ -158,9 +159,13 @@ private void LoadLogSettings()
158159
{
159160
ResetLogSettings();
160161
}
162+
else
163+
{
164+
PresentationTraceSources.DataBindingSource.Switch.Level = _logConfig.WpfTraceLevel;
165+
}
161166
}
162167

163-
public void ResetGeneralSettings()
168+
private void ResetGeneralSettings()
164169
{
165170
_generalConfig = new GeneralConfig
166171
{
@@ -175,19 +180,12 @@ public void ResetGeneralSettings()
175180

176181
private void ResetLogSettings()
177182
{
178-
_logConfig = new LogConfig
179-
{
180-
IsSaveLogEnabled = false,
181-
SaveFormat = LogSaveFormat.Text,
182-
IncludeStackTrace = false,
183-
StackTraceDepth = 5,
184-
TimeInterval = RollingInterval.Infinite,
185-
FilePath = SettingsLocation.GetDefaultLogPath("log")
186-
};
183+
_logConfig = new LogConfig();
184+
PresentationTraceSources.DataBindingSource.Switch.Level = _logConfig.WpfTraceLevel;
187185
LogSettingsChanged?.Invoke();
188186
}
189187

190-
public void ResetVisualizationSettings()
188+
private void ResetVisualizationSettings()
191189
{
192190
_visualizationConfig = new VisualizationConfig
193191
{
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Diagnostics;
2+
using RevitDevTool.Models.Trace;
3+
using RevitDevTool.Services;
4+
namespace RevitDevTool.Utils;
5+
6+
public static class TraceUtils
7+
{
8+
/// <summary>
9+
/// Register trace listeners to the Trace.Listeners collection.
10+
/// </summary>
11+
/// <param name="listeners"></param>
12+
public static void RegisterTraceListeners(params TraceListener?[] listeners)
13+
{
14+
foreach (var listener in listeners)
15+
{
16+
if (Trace.Listeners.Contains(listener) || listener == null) continue;
17+
Trace.Listeners.Add(listener);
18+
if (SettingsService.Instance.LogConfig.IncludeWpfTrace && listener is SerilogTraceListener)
19+
PresentationTraceSources.DataBindingSource.Listeners.Add(listener);
20+
}
21+
}
22+
23+
/// <summary>
24+
/// Unregister trace listeners from the Trace.Listeners collection.
25+
/// </summary>
26+
/// <param name="listeners"></param>
27+
public static void UnregisterTraceListeners(params TraceListener?[] listeners)
28+
{
29+
foreach (var listener in listeners)
30+
{
31+
if (!Trace.Listeners.Contains(listener) || listener == null) continue;
32+
Trace.Listeners.Remove(listener);
33+
if (SettingsService.Instance.LogConfig.IncludeWpfTrace && listener is SerilogTraceListener)
34+
PresentationTraceSources.DataBindingSource.Listeners.Remove(listener);
35+
}
36+
}
37+
}

source/RevitDevTool/View/Settings/LogSettingsView.xaml

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
55
xmlns:config="clr-namespace:RevitDevTool.Models.Config"
66
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=System.Diagnostics.TraceSource"
78
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
89
xmlns:serilog="clr-namespace:Serilog;assembly=Serilog.Sinks.File"
910
xmlns:settings="clr-namespace:RevitDevTool.ViewModel.Settings"
@@ -12,7 +13,7 @@
1213
xmlns:ui="http://revitdevtool.com/xaml"
1314
Title="Log Settings"
1415
d:DataContext="{d:DesignInstance settings:LogSettingsViewModel}"
15-
d:DesignHeight="600"
16+
d:DesignHeight="650"
1617
d:DesignWidth="600"
1718
CloseButtonText="Cancel"
1819
DefaultButton="Primary"
@@ -51,6 +52,15 @@
5152
<x:Type TypeName="serilog:RollingInterval" />
5253
</ObjectDataProvider.MethodParameters>
5354
</ObjectDataProvider>
55+
56+
<ObjectDataProvider
57+
x:Key="SourceLevels"
58+
MethodName="GetValues"
59+
ObjectType="{x:Type sys:Enum}">
60+
<ObjectDataProvider.MethodParameters>
61+
<x:Type TypeName="diagnostics:SourceLevels" />
62+
</ObjectDataProvider.MethodParameters>
63+
</ObjectDataProvider>
5464
</ResourceDictionary>
5565
</ui:ContentDialog.Resources>
5666

@@ -85,6 +95,37 @@
8595
</Grid>
8696
</ui:CardControl>
8797

98+
<ui:CardControl
99+
Margin="0,4,0,0"
100+
Icon="{ui:ImageIcon 'pack://application:,,,/RevitDevTool;component/Resources/Icons/wpf.png',
101+
Height=24,
102+
Width=24}">
103+
<ui:CardControl.Header>
104+
<StackPanel>
105+
<ui:TextBlock Text="WPF Trace" />
106+
<ui:TextBlock
107+
Appearance="Secondary"
108+
FontTypography="Caption"
109+
Text="Include binding and layout trace information"
110+
TextTrimming="CharacterEllipsis" />
111+
</StackPanel>
112+
</ui:CardControl.Header>
113+
<Grid MinWidth="{Binding Source={StaticResource ContentMinWidth}}">
114+
<Grid.ColumnDefinitions>
115+
<ColumnDefinition Width="*" />
116+
<ColumnDefinition Width="Auto" />
117+
</Grid.ColumnDefinitions>
118+
<ComboBox
119+
Margin="0,0,8,0"
120+
ItemsSource="{Binding Source={StaticResource SourceLevels}}"
121+
SelectedItem="{Binding WpfTraceLevel}"
122+
Visibility="{Binding IncludeWpfTrace, Converter={StaticResource BoolToVisibility}}" />
123+
<ui:ToggleSwitch
124+
Grid.Column="1"
125+
IsChecked="{Binding IncludeWpfTrace}" />
126+
</Grid>
127+
</ui:CardControl>
128+
88129
<!-- Save Format -->
89130
<ui:CardControl
90131
Margin="0,4,0,0"
@@ -143,7 +184,7 @@
143184
Visibility="{Binding IsSaveLogEnabled, Converter={StaticResource BoolToVisibility}}">
144185
<ui:CardControl.Header>
145186
<StackPanel>
146-
<ui:TextBlock Text="Log Folder" />
187+
<ui:TextBlock Text="Log File" />
147188
<ui:TextBlock
148189
Appearance="Secondary"
149190
FontTypography="Caption"

source/RevitDevTool/ViewModel/Settings/LogSettingsViewModel.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.IO;
1+
using System.Diagnostics;
2+
using System.IO;
23
using RevitDevTool.Models.Config;
34
using RevitDevTool.Services;
45
using Serilog;
@@ -13,6 +14,8 @@ public partial class LogSettingsViewModel : ObservableObject
1314
[ObservableProperty] private bool _isSaveLogEnabled;
1415
[ObservableProperty] private LogSaveFormat _saveFormat;
1516
[ObservableProperty] private bool _includeStackTrace;
17+
[ObservableProperty] private SourceLevels _wpfTraceLevel;
18+
[ObservableProperty] private bool _includeWpfTrace;
1619
[ObservableProperty] private RollingInterval _timeInterval;
1720
[ObservableProperty] private int _stackTraceDepth;
1821
[ObservableProperty] private string _filePath = string.Empty;
@@ -45,6 +48,8 @@ private void LoadFromConfig()
4548
IsSaveLogEnabled = config.IsSaveLogEnabled;
4649
SaveFormat = config.SaveFormat;
4750
IncludeStackTrace = config.IncludeStackTrace;
51+
IncludeWpfTrace = config.IncludeWpfTrace;
52+
WpfTraceLevel = config.WpfTraceLevel;
4853
StackTraceDepth = config.StackTraceDepth;
4954
TimeInterval = config.TimeInterval;
5055
FilePath = CorrectFilePath(config.FilePath, FileExtension);
@@ -56,6 +61,8 @@ public void SaveToConfig()
5661
config.IsSaveLogEnabled = IsSaveLogEnabled;
5762
config.SaveFormat = SaveFormat;
5863
config.IncludeStackTrace = IncludeStackTrace;
64+
config.IncludeWpfTrace = IncludeWpfTrace;
65+
config.WpfTraceLevel = WpfTraceLevel;
5966
config.StackTraceDepth = StackTraceDepth;
6067
config.TimeInterval = TimeInterval;
6168
config.FilePath = CorrectFilePath(FilePath, FileExtension);

0 commit comments

Comments
 (0)