22{
33 using System ;
44 using System . Collections . ObjectModel ;
5+ using System . IO ;
56 using System . Threading . Tasks ;
67 using System . Windows . Data ;
78
1112 public class MainWindowViewModel : ViewModelBase , IDisposable
1213 {
1314 private TraceEventSession listener ;
15+ private string logFilePath ;
1416
1517 public ViewerConfiguration Config { get ; }
1618
@@ -23,23 +25,26 @@ private void DynamicOnAll(TraceEvent traceEvent)
2325 return ;
2426 }
2527
26- App . DispatcherInvoke ( ( ) =>
28+ var logEntry = new LogEntry ( )
2729 {
28- this . Entries . Add ( new LogEntry ( )
29- {
30- Message = traceEvent . FormattedMessage ,
31- Timestamp = traceEvent . TimeStamp ,
32- Level = TraceEventLevelConverter ( traceEvent . Level , traceEvent . Channel ) ,
33- ThreadId = traceEvent . ThreadID
34- } ) ;
30+ Message = traceEvent . FormattedMessage ,
31+ Timestamp = traceEvent . TimeStamp ,
32+ Level = TraceEventLevelConverter ( traceEvent . Level , traceEvent . Channel ) ,
33+ ThreadId = traceEvent . ThreadID
34+ } ;
35+
36+ string line = LogEntry . Serialize ( logEntry ) ;
37+ File . AppendAllLines ( this . logFilePath , new [ ] { line } ) ;
3538
39+ App . DispatcherInvoke ( ( ) =>
40+ {
41+ this . Entries . Add ( logEntry ) ;
3642 CollectionViewSource . GetDefaultView ( this . Entries ) . MoveCurrentToLast ( ) ;
3743 } ) ;
3844 }
3945
4046 private static string TraceEventLevelConverter ( TraceEventLevel level , TraceEventChannel traceEventChannel )
4147 {
42-
4348 if ( traceEventChannel == ( TraceEventChannel ) EventChannel . Debug
4449 && level == TraceEventLevel . Verbose )
4550 {
@@ -81,6 +86,20 @@ public MainWindowViewModel()
8186 "SyncPro-Tracing" ) ; // Get the unique ID for the eventSouce.
8287 this . listener . EnableProvider ( eventSourceGuid ) ;
8388
89+ var appDataDir = Path . Combine (
90+ Environment . GetFolderPath ( Environment . SpecialFolder . LocalApplicationData ) ,
91+ "SyncPro" ,
92+ "logs" ) ;
93+
94+ if ( ! Directory . Exists ( appDataDir ) )
95+ {
96+ Directory . CreateDirectory ( appDataDir ) ;
97+ }
98+
99+ this . logFilePath = Path . Combine (
100+ appDataDir ,
101+ string . Format ( "SyncPro-{0:yyyyMMdd-HHmmss}.log" , DateTime . Now ) ) ;
102+
84103 Task . Factory . StartNew ( ( ) => { this . listener . Source . Process ( ) ; } ) ;
85104 }
86105
0 commit comments