Bug 610832 - Dump log to disk when sync fails. r=rnewman

This commit is contained in:
Philipp von Weitershausen 2011-06-13 20:39:51 +02:00
parent 627c18014a
commit 3e28e5010d
5 changed files with 196 additions and 25 deletions

View File

@ -60,7 +60,6 @@ const KEYS_WBO = "keys";
const LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S";
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://services-sync/record.js");
Cu.import("resource://services-sync/constants.js");
Cu.import("resource://services-sync/engines.js");
@ -451,7 +450,16 @@ WeaveSvc.prototype = {
},
_migratePrefs: function _migratePrefs() {
// No need to re-migrate
// Migrate old debugLog prefs.
let logLevel = Svc.Prefs.get("services.sync.log.appender.debugLog");
if (logLevel) {
Svc.Prefs.set("services.sync.log.appender.file.level", logLevel);
}
if (Svc.Prefs.get("log.appender.debugLog.enabled")) {
Svc.Prefs.set("services.sync.log.appender.file.logOnSuccess");
}
// Migrate old extensions.weave.* prefs if we haven't already tried.
if (Svc.Prefs.get("migrated", false))
return;
@ -489,26 +497,28 @@ WeaveSvc.prototype = {
dapp.level = Log4Moz.Level[Svc.Prefs.get("log.appender.dump")];
root.addAppender(dapp);
let enabled = Svc.Prefs.get("log.appender.debugLog.enabled", false);
if (enabled) {
let verbose = FileUtils.getFile(
"ProfD", ["weave", "logs", "verbose-log.txt"], true);
if (Svc.Prefs.get("log.appender.debugLog.rotate", true)) {
let maxSize = Svc.Prefs.get("log.appender.debugLog.maxSize");
this._debugApp = new Log4Moz.RotatingFileAppender(verbose, formatter,
maxSize);
} else {
this._debugApp = new Log4Moz.FileAppender(verbose, formatter);
}
this._debugApp.level = Log4Moz.Level[Svc.Prefs.get("log.appender.debugLog")];
root.addAppender(this._debugApp);
}
let fapp = this._logAppender = new Log4Moz.StorageStreamAppender(formatter);
fapp.level = Log4Moz.Level[Svc.Prefs.get("log.appender.file.level")];
root.addAppender(fapp);
},
clearLogs: function WeaveSvc_clearLogs() {
if (this._debugApp)
this._debugApp.clear();
_resetFileLog: function resetFileLog(flushToFile) {
let inStream = this._logAppender.getInputStream();
this._logAppender.reset();
if (flushToFile && inStream) {
try {
let filename = Date.now() + ".log";
let file = FileUtils.getFile("ProfD", ["weave", "logs", filename]);
let outStream = FileUtils.openFileOutputStream(file);
NetUtil.asyncCopy(inStream, outStream, function () {
Svc.Obs.notify("weave:service:reset-file-log");
});
} catch (ex) {
Svc.Obs.notify("weave:service:reset-file-log");
}
} else {
Svc.Obs.notify("weave:service:reset-file-log");
}
},
/**
@ -548,6 +558,8 @@ WeaveSvc.prototype = {
if (Status.login == LOGIN_FAILED_NETWORK_ERROR &&
!Services.io.offline) {
this._ignorableErrorCount += 1;
} else {
this._resetFileLog(Svc.Prefs.get("log.appender.file.logOnError"));
}
break;
case "weave:service:sync:error":
@ -561,9 +573,13 @@ WeaveSvc.prototype = {
case CREDENTIALS_CHANGED:
this.logout();
break;
default:
this._resetFileLog(Svc.Prefs.get("log.appender.file.logOnError"));
break;
}
break;
case "weave:service:sync:finish":
this._resetFileLog(Svc.Prefs.get("log.appender.file.logOnSuccess"));
this._scheduleNextSync();
this._syncErrors = 0;
this._ignorableErrorCount = 0;

View File

@ -36,7 +36,7 @@
* ***** END LICENSE BLOCK ***** */
const EXPORTED_SYMBOLS = ["XPCOMUtils", "Services", "NetUtil", "PlacesUtils",
"Utils", "Svc", "Str"];
"FileUtils", "Utils", "Svc", "Str"];
const Cc = Components.classes;
const Ci = Components.interfaces;

View File

@ -24,10 +24,9 @@ pref("services.sync.jpake.maxTries", 10);
pref("services.sync.log.appender.console", "Warn");
pref("services.sync.log.appender.dump", "Error");
pref("services.sync.log.appender.debugLog", "Trace");
pref("services.sync.log.appender.debugLog.enabled", false);
pref("services.sync.log.appender.debugLog.rotate", true);
pref("services.sync.log.appender.debugLog.maxSize", 1048576);
pref("services.sync.log.appender.file.level", "Trace");
pref("services.sync.log.appender.file.logOnError", true);
pref("services.sync.log.appender.file.logOnSuccess", false);
pref("services.sync.log.rootLogger", "Debug");
pref("services.sync.log.logger.service.main", "Debug");
pref("services.sync.log.logger.authenticator", "Debug");

View File

@ -0,0 +1,155 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
Cu.import("resource://services-sync/service.js");
Cu.import("resource://services-sync/util.js");
Cu.import("resource://services-sync/log4moz.js");
const logsdir = FileUtils.getDir("ProfD", ["weave", "logs"], true);
function run_test() {
run_next_test();
}
add_test(function test_noOutput() {
// Clear log output from startup.
Svc.Prefs.set("log.appender.file.logOnSuccess", false);
Svc.Obs.notify("weave:service:sync:finish");
// Clear again without having issued any output.
Svc.Prefs.set("log.appender.file.logOnSuccess", true);
Svc.Obs.add("weave:service:reset-file-log", function onResetFileLog() {
Svc.Obs.remove("weave:service:reset-file-log", onResetFileLog);
Svc.Prefs.resetBranch("");
run_next_test();
});
// Fake a successful sync.
Svc.Obs.notify("weave:service:sync:finish");
});
add_test(function test_logOnSuccess_false() {
Svc.Prefs.set("log.appender.file.logOnSuccess", false);
let log = Log4Moz.repository.getLogger("Sync.Test.FileLog");
log.info("this won't show up");
Svc.Obs.add("weave:service:reset-file-log", function onResetFileLog() {
Svc.Obs.remove("weave:service:reset-file-log", onResetFileLog);
// No log file was written.
do_check_false(logsdir.directoryEntries.hasMoreElements());
Svc.Prefs.resetBranch("");
run_next_test();
});
// Fake a successful sync.
Svc.Obs.notify("weave:service:sync:finish");
});
function readFile(file, callback) {
NetUtil.asyncFetch(file, function (inputStream, statusCode, request) {
let data = NetUtil.readInputStreamToString(inputStream,
inputStream.available());
callback(statusCode, data);
});
}
add_test(function test_logOnSuccess_true() {
Svc.Prefs.set("log.appender.file.logOnSuccess", true);
let log = Log4Moz.repository.getLogger("Sync.Test.FileLog");
const MESSAGE = "this WILL show up";
log.info(MESSAGE);
Svc.Obs.add("weave:service:reset-file-log", function onResetFileLog() {
Svc.Obs.remove("weave:service:reset-file-log", onResetFileLog);
// Exactly one log file was written.
let entries = logsdir.directoryEntries;
do_check_true(entries.hasMoreElements());
let logfile = entries.getNext().QueryInterface(Ci.nsILocalFile);
do_check_eq(logfile.leafName.slice(-4), ".log");
do_check_false(entries.hasMoreElements());
// Ensure the log message was actually written to file.
readFile(logfile, function (error, data) {
do_check_true(Components.isSuccessCode(error));
do_check_neq(data.indexOf(MESSAGE), -1);
// Clean up.
try {
logfile.remove(false);
} catch(ex) {
dump("Couldn't delete file: " + ex + "\n");
// Stupid Windows box.
}
Svc.Prefs.resetBranch("");
run_next_test();
});
});
// Fake a successful sync.
Svc.Obs.notify("weave:service:sync:finish");
});
add_test(function test_logOnError_false() {
Svc.Prefs.set("log.appender.file.logOnError", false);
let log = Log4Moz.repository.getLogger("Sync.Test.FileLog");
log.info("this won't show up");
Svc.Obs.add("weave:service:reset-file-log", function onResetFileLog() {
Svc.Obs.remove("weave:service:reset-file-log", onResetFileLog);
// No log file was written.
do_check_false(logsdir.directoryEntries.hasMoreElements());
Svc.Prefs.resetBranch("");
run_next_test();
});
// Fake an unsuccessful sync.
Svc.Obs.notify("weave:service:sync:error");
});
add_test(function test_logOnError_true() {
Svc.Prefs.set("log.appender.file.logOnError", true);
let log = Log4Moz.repository.getLogger("Sync.Test.FileLog");
const MESSAGE = "this WILL show up";
log.info(MESSAGE);
Svc.Obs.add("weave:service:reset-file-log", function onResetFileLog() {
Svc.Obs.remove("weave:service:reset-file-log", onResetFileLog);
// Exactly one log file was written.
let entries = logsdir.directoryEntries;
do_check_true(entries.hasMoreElements());
let logfile = entries.getNext().QueryInterface(Ci.nsILocalFile);
do_check_eq(logfile.leafName.slice(-4), ".log");
do_check_false(entries.hasMoreElements());
// Ensure the log message was actually written to file.
readFile(logfile, function (error, data) {
do_check_true(Components.isSuccessCode(error));
do_check_neq(data.indexOf(MESSAGE), -1);
// Clean up.
try {
logfile.remove(false);
} catch(ex) {
dump("Couldn't delete file: " + ex + "\n");
// Stupid Windows box.
}
Svc.Prefs.resetBranch("");
run_next_test();
});
});
// Fake an unsuccessful sync.
Svc.Obs.notify("weave:service:sync:error");
});

View File

@ -50,6 +50,7 @@ tail =
[test_service_cluster.js]
[test_service_createAccount.js]
[test_service_detect_upgrade.js]
[test_service_filelog.js]
[test_service_login.js]
[test_service_migratePrefs.js]
[test_service_passwordUTF8.js]