2013-11-01 6 views
2

Мне нужно предоставить журнал ошибок в моем приложении Windows 8 Metro, разработанном в Html/WinJS , чтобы пользователь мог узнать, что пошло не так из файла журнала, находящегося в приложении локальная папка.Реализация ведения журнала в Metro Приложение, разработанное с использованием Html/WinJS

Я проверил WinJS.log (сообщение, метки, тип); который будет писать на консоль, но не сможет найти что-либо, через которое я могу получить его в локальном файле.

Каков наилучший способ сделать то же самое и если есть какие-либо сторонние библиотеки/js, доступные для регистрации ошибок в приложениях метро, ​​разработанных в WinJS?

Заранее спасибо.

+0

WiredPrarie достаточно хорошо использовал WinJS.log - главное, что вы можете заменить поведение по умолчанию, как вам нравится. Что касается протоколирования SDK, просмотрите раздел аналитики http://services.windowsstore.com. Доступны SDK, такие как Localytics, Adobe Omniture и MarkedUp, которые вы можете легко связать с реализацией WinJS.log. –

ответ

8

WinJS.log является просто заполнителем. Без правильной инициализации он ничего не делает (на самом деле он не установлен вообще). Если вы просто вызываете WinJS.Utilities.startLog() при запуске приложения, он по умолчанию подключает регистратор для консоли.

Если вам нужно что-то более полное, вам нужно его построить. Я построил небольшой образец ниже.

function startFileLog() { 
    // choose where the file will be stored: 
    var fileDestination = Windows.Storage.ApplicationData.current.localFolder; 

    var logger = new WinJS.Promise(function (complete) { 
     var logfilename = new Date().toISOString().replace(/[:-]/g, ""); 
     logfilename = "log-" + logfilename + ".log"; 
     fileDestination.createFileAsync(logfilename, 
      Windows.Storage.CreationCollisionOption.generateUniqueName) 
       .done(function (file) { 
       complete(file); 
      }); 
    }); 

    var actionFn = function (message, tag, type) { 
     logger.then(function (file) { 
      var m = WinJS.Utilities.formatLog(message, tag, type); 
      Windows.Storage.FileIO.appendTextAsync(file, m).done(); 
     }); 
    }; 

    WinJS.Utilities.startLog({ action: actionFn }); 
} 

При вызове функции startFileLog выше, он создает новый файл журнала (с помощью текущей даты/времени, как часть имени файла) в обещании. Затем функция actionFn передается функции startLog. Передавая необязательное свойство опций с именем action, поведение по умолчанию «write to console» перезаписывается (если вы не хотите его перезаписывать, вы можете вызвать startLog без действия, а затем скопировать ссылку на функцию с WinJS.log и заменить ее на свою собственную функцию, и назовите ее также). Когда вызывается функция log, она теперь вызывает actionFn, которая использует обещание, созданное ранее, чтобы проверить, что файл журнала фактически доступен для записи, прежде чем продолжить. Если он еще не готов, он будет поставлен в очередь. Таким образом, это означает, что даже если файл может быть не готов немедленно, журнал, в конце концов, будет содержать ожидаемые результаты. Был бы короткий период времени, когда из-за асинхронного характера WinJS, если приложение потерпело крах до того, как файл полностью откроется, эти зарегистрированные элементы будут пропущены. Вы можете отложить запуск приложения, если вы хотите, пока файл не был открыт, возвращая logger обещание:

function startFileLog() { 
    /// ... etc.. 

    return logger; 
} 

startFileLog().then(function() { 
    // the application can now be assured that the log file is ready to accept 
    // writes ... (but again, it's all async, so a write may be missed in 
    // extreme cases) 
}); 

Вы бы, вероятно, хотите создать функцию в конце вашего приложения, чтобы очистить/закрыть файл журнала.

+0

Очень четкое объяснение, спасибо за обмен кодом! – fnicollet

+0

спасибо за код, но он не работает для меня. Если я запускаю startFileLog в моем методе app.onactivated, мое приложение выходит из строя, и в итоге я получаю журнал с ошибками winjs: scheduler. Например: 'winjs: scheduler: Transitioning job (1) from: running to: blocked' – roryok

+0

Я предлагаю открыть новый вопрос, а не пытаться устранить проблему в комментарии. – WiredPrairie