#if WINDOWSMETRO using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Tracing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Windows.Storage; namespace ANX.Framework.NonXNA.Windows8 { internal class MetroLogger : EventListener { /// <summary> /// Storage file to be used to write logs /// </summary> private StorageFile _storageFile = null; /// <summary> /// The format to be used by logging. /// </summary> private readonly string _format = "{0:yyyy-MM-dd HH\\:mm\\:ss\\:ffff}\tType: {1}\tId: {2}\tMessage: '{3}'"; private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1); public async void Initialize(string fileName) { _storageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName.Replace(" ", "_"), CreationCollisionOption.OpenIfExists); this.EnableEvents(ANX.Framework.NonXNA.Windows8.MetroEventSource.Log, System.Diagnostics.Tracing.EventLevel.Informational); } private async void WriteToFile(IEnumerable<string> lines) { await _semaphore.WaitAsync(); Task.Run(async () => { try { await FileIO.AppendLinesAsync(_storageFile, lines); } catch (Exception exc) { Debug.WriteLine(exc); } }); } protected override void OnEventWritten(EventWrittenEventArgs eventData) { if (_storageFile == null) return; var lines = new List<string>(); var newFormatedLine = string.Format(_format, DateTime.Now, eventData.Level, eventData.EventId, eventData.Payload[0]); Debug.WriteLine(newFormatedLine); lines.Add(newFormatedLine); WriteToFile(lines); } } } #endif