diff --git a/python/src/deltachat/account.py b/python/src/deltachat/account.py index c46dfe066..f11a4f99d 100644 --- a/python/src/deltachat/account.py +++ b/python/src/deltachat/account.py @@ -25,7 +25,10 @@ class Account(object): by the underlying deltachat core library. All public Account methods are meant to be memory-safe and return memory-safe objects. """ - def __init__(self, db_path, logid=None, os_name=None, debug=True): + # to prevent garbled logging + _loglock = threading.RLock() + + def __init__(self, db_path, logid=None, os_name=None): """ initialize account object. :param db_path: a path to the account database. The database @@ -33,13 +36,12 @@ class Account(object): :param logid: an optional logging prefix that should be used with the default internal logging. :param os_name: this will be put to the X-Mailer header in outgoing messages - :param debug: turn on debug logging for events. """ self._dc_context = ffi.gc( lib.dc_context_new(lib.py_dc_callback, ffi.NULL, as_dc_charpointer(os_name)), _destroy_dc_context, ) - self._evlogger = EventLogger(self, logid, debug) + self._evlogger = EventLogger(self, logid) self._threads = IOThreads(self._dc_context, self._evlogger._log_event) # initialize per-account plugin system @@ -65,6 +67,15 @@ class Account(object): # def __del__(self): # self.shutdown() + def log_line(self, msg): + t = threading.currentThread() + tname = getattr(t, "name", t) + if tname == "MainThread": + tname = "MAIN" + with self._loglock: + print("{:2.2f} [{}-{}] {}".format(time.time() - self._evlogger.init_time, + tname, self._evlogger.logid, msg)) + def _check_config_key(self, name): if name not in self._configkeys: raise KeyError("{!r} not a valid config key, existing keys: {!r}".format( diff --git a/python/src/deltachat/eventlogger.py b/python/src/deltachat/eventlogger.py index 2d0d3c761..006459feb 100644 --- a/python/src/deltachat/eventlogger.py +++ b/python/src/deltachat/eventlogger.py @@ -4,11 +4,8 @@ from .hookspec import account_hookimpl class EventLogger: - _loglock = threading.RLock() - - def __init__(self, account, logid=None, debug=True): + def __init__(self, account, logid=None): self.account = account - self._debug = debug if logid is None: logid = str(self.account._dc_context).strip(">").split()[-1] self.logid = logid @@ -22,14 +19,5 @@ class EventLogger: # don't show events that are anyway empty impls now if evt_name == "DC_EVENT_GET_STRING": return - if self._debug: - evpart = "{}({!r},{!r})".format(evt_name, data1, data2) - self._log(evpart) - - def _log(self, msg): - t = threading.currentThread() - tname = getattr(t, "name", t) - if tname == "MainThread": - tname = "MAIN" - with self._loglock: - print("{:2.2f} [{}-{}] {}".format(time.time() - self.init_time, tname, self.logid, msg)) + evpart = "{}({!r},{!r})".format(evt_name, data1, data2) + self.account.log_line(evpart) diff --git a/python/tests/ffi_event.py b/python/tests/ffi_event.py index 4ffd11b1e..c7d109552 100644 --- a/python/tests/ffi_event.py +++ b/python/tests/ffi_event.py @@ -39,7 +39,7 @@ class FFIEventTracker: assert not rex.match(ev[0]), "event found {}".format(ev) def get_matching(self, event_name_regex, check_error=True, timeout=None): - self.account._evlogger._log("-- waiting for event with regex: {} --".format(event_name_regex)) + self.account.log_line("-- waiting for event with regex: {} --".format(event_name_regex)) rex = re.compile("(?:{}).*".format(event_name_regex)) while 1: ev = self.get(timeout=timeout, check_error=check_error) diff --git a/python/tests/test_lowlevel.py b/python/tests/test_lowlevel.py index bf3b1f085..733cbe825 100644 --- a/python/tests/test_lowlevel.py +++ b/python/tests/test_lowlevel.py @@ -16,14 +16,12 @@ def test_callback_None2int(): clear_context_callback(ctx) -def test_dc_close_events(tmpdir): - from deltachat.account import Account - p = tmpdir.join("hello.db") - ac1 = Account(p.strpath) +def test_dc_close_events(tmpdir, acfactory): + ac1 = acfactory.get_unconfigured_account() ac1.shutdown() def find(info_string): - evlog = ac1._evlogger + evlog = ac1._evtracker while 1: ev = evlog.get_matching("DC_EVENT_INFO", check_error=False) data2 = ev[2] @@ -80,10 +78,10 @@ def test_markseen_invalid_message_ids(acfactory): contact1 = ac1.create_contact(email="some1@example.com", name="some1") chat = ac1.create_chat_by_contact(contact1) chat.send_text("one messae") - ac1._evlogger.get_matching("DC_EVENT_MSGS_CHANGED") + ac1._evtracker.get_matching("DC_EVENT_MSGS_CHANGED") msg_ids = [9] lib.dc_markseen_msgs(ac1._dc_context, msg_ids, len(msg_ids)) - ac1._evlogger.ensure_event_not_queued("DC_EVENT_WARNING|DC_EVENT_ERROR") + ac1._evtracker.ensure_event_not_queued("DC_EVENT_WARNING|DC_EVENT_ERROR") def test_get_special_message_id_returns_empty_message(acfactory):