move debug logging into libanki

we want to be able to log the initial automatic sync, which
happens before the debug logging was set up in ankiqt

also skip the flush, as it should eventually get written
This commit is contained in:
Damien Elmes 2013-11-04 23:03:33 +09:00
parent 2e22b6218b
commit 5dfe95aa67
2 changed files with 30 additions and 27 deletions

View file

@ -2,12 +2,15 @@
# Copyright: Damien Elmes <anki@ichi2.net> # Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import pprint
import re
import time import time
import os import os
import random import random
import stat import stat
import datetime import datetime
import copy import copy
import traceback
from anki.lang import _, ngettext from anki.lang import _, ngettext
from anki.utils import ids2str, fieldChecksum, stripHTML, \ from anki.utils import ids2str, fieldChecksum, stripHTML, \
@ -48,9 +51,12 @@ defaultConf = {
# this is initialized by storage.Collection # this is initialized by storage.Collection
class _Collection(object): class _Collection(object):
debugLog = False
def __init__(self, db, server=False): def __init__(self, db, server=False):
self.db = db self.db = db
self.path = db._path self.path = db._path
self._openLog()
self.log(self.path, anki.version) self.log(self.path, anki.version)
self.server = server self.server = server
self._lastSave = time.time() self._lastSave = time.time()
@ -773,4 +779,25 @@ and queue = 0""", intTime(), self.usn())
########################################################################## ##########################################################################
def log(self, *args, **kwargs): def log(self, *args, **kwargs):
runHook("log", args, kwargs) if not self.debugLog:
return
def customRepr(x):
if isinstance(x, basestring):
return x
return pprint.pformat(x)
path, num, fn, y = traceback.extract_stack(
limit=2+kwargs.get("stack", 0))[0]
buf = u"[%s] %s:%s(): %s" % (intTime(), os.path.basename(path), fn,
", ".join([customRepr(x) for x in args]))
self._logHnd.write(buf.encode("utf8") + "\n")
if os.environ.get("ANKIDEV"):
print buf
def _openLog(self):
if not self.debugLog:
return
lpath = re.sub("\.anki2$", ".log", self.path)
self._logHnd = open(lpath, "ab")
def _closeLog(self):
self._logHnd = None

View file

@ -3,7 +3,6 @@
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import os import os
import pprint
import sys import sys
import re import re
import traceback import traceback
@ -32,6 +31,8 @@ class AnkiQt(QMainWindow):
self.state = "startup" self.state = "startup"
aqt.mw = self aqt.mw = self
self.app = app self.app = app
from anki.collection import _Collection
_Collection.debugLog = True
if isWin: if isWin:
self._xpstyle = QStyleFactory.create("WindowsXP") self._xpstyle = QStyleFactory.create("WindowsXP")
self.app.setStyle(self._xpstyle) self.app.setStyle(self._xpstyle)
@ -268,7 +269,6 @@ To import into a password protected profile, please open the profile before atte
def loadCollection(self): def loadCollection(self):
self.hideSchemaMsg = True self.hideSchemaMsg = True
self._openLog()
try: try:
self.col = Collection(self.pm.collectionPath()) self.col = Collection(self.pm.collectionPath())
except anki.db.Error: except anki.db.Error:
@ -865,7 +865,6 @@ Difference to correct time: %s.""") % diffText
def setupHooks(self): def setupHooks(self):
addHook("modSchema", self.onSchemaMod) addHook("modSchema", self.onSchemaMod)
addHook("remNotes", self.onRemNotes) addHook("remNotes", self.onRemNotes)
addHook("log", self.onLog)
# Log note deletion # Log note deletion
########################################################################## ##########################################################################
@ -883,29 +882,6 @@ Difference to correct time: %s.""") % diffText
f.write(("\t".join([str(id), str(mid)] + fields)).encode("utf8")) f.write(("\t".join([str(id), str(mid)] + fields)).encode("utf8"))
f.write("\n") f.write("\n")
# Debug logging
##########################################################################
def onLog(self, args, kwargs):
if not self._logHnd:
return
def customRepr(x):
if isinstance(x, basestring):
return x
return pprint.pformat(x)
path, num, fn, y = traceback.extract_stack(
limit=4+kwargs.get("stack", 0))[0]
buf = u"[%s] %s:%s(): %s" % (intTime(), os.path.basename(path), fn,
", ".join([customRepr(x) for x in args]))
self._logHnd.write(buf.encode("utf8") + "\n")
self._logHnd.flush()
if os.environ.get("ANKIDEV"):
print buf
def _openLog(self):
lpath = re.sub("\.anki2$", ".log", self.pm.collectionPath())
self._logHnd = open(lpath, "ab")
# Schema modifications # Schema modifications
########################################################################## ##########################################################################