diff --git a/CHANGES.rst b/CHANGES.rst index 68f721d..8e97434 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,8 @@ Changelog 1.0.9 (unreleased) ------------------ -- Nothing changed yet. +- Enable timestamp logging. + [cekk] 1.0.8 (2026-06-15) diff --git a/src/redturtle/rsync/adapters/adapter.py b/src/redturtle/rsync/adapters/adapter.py index 801a1fb..d0fc54b 100644 --- a/src/redturtle/rsync/adapters/adapter.py +++ b/src/redturtle/rsync/adapters/adapter.py @@ -280,6 +280,15 @@ def create_or_update_item(self, row): else: self.update_item(item=item, row=row) + def _get_create_error_message(self, row, e): + return api.portal.translate( + _( + "create_item_error_msg", + default="[ERROR] Unable to create item ${row}: ${e}", + mapping={"row": row, "e": str(e)}, + ) + ) + def create_item(self, row): """ Create the item. @@ -287,13 +296,7 @@ def create_item(self, row): try: res = self.do_create_item(row=row) except Exception as e: - msg = api.portal.translate( - _( - "create_item_error_msg", - default="[ERROR] Unable to create item ${row}: ${e}", - mapping={"row": row, "e": str(e)}, - ) - ) + msg = self._get_create_error_message(row, e) self.log_info(msg=msg, type="error") return if not res: diff --git a/src/redturtle/rsync/scripts/rsync.py b/src/redturtle/rsync/scripts/rsync.py index 74023dc..4e82305 100644 --- a/src/redturtle/rsync/scripts/rsync.py +++ b/src/redturtle/rsync/scripts/rsync.py @@ -12,6 +12,26 @@ logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) +# same format used by Zope in wsgi.ini +LOG_FORMAT = "%(asctime)s %(levelname)-7.7s [%(name)s] %(message)s" +LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" + + +def setup_logging(): + """ + "bin/instance run" does not setup the logging, so every message is printed + with the Python default format, without the timestamp. + + Set our format on the root logger, to have the timestamp on every line. + """ + root = logging.getLogger() + if not root.handlers: + root.addHandler(logging.StreamHandler()) + formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT) + for handler in root.handlers: + handler.setFormatter(formatter) + root.setLevel(logging.INFO) + class ScriptRunner: """ @@ -79,7 +99,7 @@ def rsync(self): Do the rsync. """ start = datetime.now() - logger.info(f"[{start}] - START RSYNC") + logger.info("START RSYNC") # setup environment self.adapter.setup_environment() @@ -127,9 +147,7 @@ def rsync(self): minutes = (total_seconds % 3600) // 60 seconds = total_seconds % 60 - logger.info( - f"[{end}] - END RSYNC (duration {hours:02d}:{minutes:02d}:{seconds:02d})" - ) + logger.info(f"END RSYNC (duration {hours:02d}:{minutes:02d}:{seconds:02d})") def _main(args): @@ -145,6 +163,7 @@ def _main(args): def main(): + setup_logging() _main(sys.argv[3:])