瀏覽代碼

remote repos: remove support for borg < 1.1.0 ($LOG, logging setup)

log output:

always expect json, remove $LOG format support.

we keep limited support for unstructured format also,
just not to lose anything from remote stderr.
Thomas Waldmann 2 年之前
父節點
當前提交
4b796a7337
共有 4 個文件被更改,包括 22 次插入63 次删除
  1. 2 2
      src/borg/archiver/__init__.py
  2. 2 14
      src/borg/logger.py
  3. 2 28
      src/borg/remote.py
  4. 16 19
      src/borg/testsuite/repository.py

+ 2 - 2
src/borg/archiver/__init__.py

@@ -482,8 +482,8 @@ class Archiver(
         func = get_func(args)
         # do not use loggers before this!
         is_serve = func == self.do_serve
-        setup_logging(level=args.log_level, is_serve=is_serve, json=args.log_json)
-        self.log_json = args.log_json
+        self.log_json = args.log_json or is_serve
+        setup_logging(level=args.log_level, json=self.log_json)
         args.progress |= is_serve
         self._setup_implied_logging(vars(args))
         self._setup_topic_debugging(args)

+ 2 - 14
src/borg/logger.py

@@ -53,7 +53,7 @@ def _log_warning(message, category, filename, lineno, file=None, line=None):
     logger.warning(msg)
 
 
-def setup_logging(stream=None, conf_fname=None, env_var="BORG_LOGGING_CONF", level="info", is_serve=False, json=False):
+def setup_logging(stream=None, conf_fname=None, env_var="BORG_LOGGING_CONF", level="info", json=False):
     """setup logging module according to the arguments provided
 
     if conf_fname is given (or the config file name can be determined via
@@ -61,9 +61,6 @@ def setup_logging(stream=None, conf_fname=None, env_var="BORG_LOGGING_CONF", lev
 
     otherwise, set up a stream handler logger on stderr (by default, if no
     stream is provided).
-
-    if is_serve == True, we configure a special log format as expected by
-    the borg client log message interceptor.
     """
     global configured
     err_msg = None
@@ -90,21 +87,12 @@ def setup_logging(stream=None, conf_fname=None, env_var="BORG_LOGGING_CONF", lev
     # if we did not / not successfully load a logging configuration, fallback to this:
     logger = logging.getLogger("")
     handler = logging.StreamHandler(stream)
-    if is_serve and not json:
-        fmt = "$LOG %(levelname)s %(name)s Remote: %(message)s"
-    else:
-        fmt = "%(message)s"
+    fmt = "%(message)s"
     formatter = JsonFormatter(fmt) if json else logging.Formatter(fmt)
     handler.setFormatter(formatter)
     borg_logger = logging.getLogger("borg")
     borg_logger.formatter = formatter
     borg_logger.json = json
-    if configured and logger.handlers:
-        # The RepositoryServer can call setup_logging a second time to adjust the output
-        # mode from text-ish is_serve to json is_serve.
-        # Thus, remove the previously installed handler, if any.
-        logger.handlers[0].close()
-        logger.handlers.clear()
     logger.addHandler(handler)
     logger.setLevel(level.upper())
     configured = True

+ 2 - 28
src/borg/remote.py

@@ -27,7 +27,7 @@ from .helpers import sysinfo
 from .helpers import format_file_size
 from .helpers import safe_unlink
 from .helpers import prepare_subprocess_env, ignore_sigint
-from .logger import create_logger, setup_logging
+from .logger import create_logger
 from .helpers import msgpack
 from .repository import Repository
 from .version import parse_version, format_version
@@ -244,9 +244,6 @@ class RepositoryServer:  # pragma: no cover
     def negotiate(self, client_data):
         if isinstance(client_data, dict):
             self.client_version = client_data["client_version"]
-            level = logging.getLevelName(logging.getLogger("").level)
-            setup_logging(is_serve=True, json=True, level=level)
-            logger.debug("Initialized logging system for JSON-based protocol")
         else:
             self.client_version = BORG_VERSION  # seems to be newer than current version (no known old format)
 
@@ -897,8 +894,6 @@ def handle_remote_line(line):
     """
     assert line.endswith(("\r", "\n"))
     if line.startswith("{"):
-        # This format is used by Borg since 1.1.0b6 for new-protocol clients.
-        # It is the same format that is exposed by --log-json.
         msg = json.loads(line)
 
         if msg["type"] not in ("progress_message", "progress_percent", "log_message"):
@@ -937,30 +932,9 @@ def handle_remote_line(line):
                     # so that the next message, progress or not, overwrites it. This mirrors the behaviour
                     # of local progress displays.
                     sys.stderr.write("Remote: " + msg["message"] + "\r")
-    elif line.startswith("$LOG "):
-        # This format is used by borg serve 0.xx, 1.0.x and 1.1.0b1..b5.
-        # It prefixed log lines with $LOG as a marker, followed by the log level
-        # and optionally a logger name, then "Remote:" as a separator followed by the original
-        # message.
-        _, level, msg = line.split(" ", 2)
-        level = getattr(logging, level, logging.CRITICAL)  # str -> int
-        if msg.startswith("Remote:"):
-            # server format: '$LOG <level> Remote: <msg>'
-            logging.log(level, msg.rstrip())
-        else:
-            # server format '$LOG <level> <logname> Remote: <msg>'
-            logname, msg = msg.split(" ", 1)
-            logging.getLogger(logname).log(level, msg.rstrip())
     else:
-        # Plain 1.0.x and older format - re-emit to stderr (mirroring what the 1.0.x
-        # client did) or as a generic log message.
         # We don't know what priority the line had.
-        if logging.getLogger("borg").json:
-            logging.getLogger("").warning("Remote: " + line.strip())
-        else:
-            # In non-JSON mode we circumvent logging to preserve carriage returns (\r)
-            # which are generated by remote progress displays.
-            sys.stderr.write("Remote: " + line)
+        logging.getLogger("").warning("stderr/remote: " + line.strip())
 
 
 class RepositoryNoCache:

+ 16 - 19
src/borg/testsuite/repository.py

@@ -1083,29 +1083,18 @@ class RemoteLoggerTestCase(BaseTestCase):
 
     def test_stderr_messages(self):
         handle_remote_line("unstructured stderr message\n")
-        self.assert_equal(self.stream.getvalue(), "")
-        # stderr messages don't get an implicit newline
-        self.assert_equal(self.stderr.getvalue(), "Remote: unstructured stderr message\n")
-
-    def test_stderr_progress_messages(self):
-        handle_remote_line("unstructured stderr progress message\r")
-        self.assert_equal(self.stream.getvalue(), "")
-        # stderr messages don't get an implicit newline
-        self.assert_equal(self.stderr.getvalue(), "Remote: unstructured stderr progress message\r")
-
-    def test_pre11_format_messages(self):
-        self.handler.setLevel(logging.DEBUG)
-        logging.getLogger().setLevel(logging.DEBUG)
-
-        handle_remote_line("$LOG INFO Remote: borg < 1.1 format message\n")
-        self.assert_equal(self.stream.getvalue(), "Remote: borg < 1.1 format message\n")
+        self.assert_equal(self.stream.getvalue(), "stderr/remote: unstructured stderr message\n")
         self.assert_equal(self.stderr.getvalue(), "")
 
     def test_post11_format_messages(self):
         self.handler.setLevel(logging.DEBUG)
         logging.getLogger().setLevel(logging.DEBUG)
 
-        handle_remote_line("$LOG INFO borg.repository Remote: borg >= 1.1 format message\n")
+        msg = (
+            """{"type": "log_message", "levelname": "INFO", "name": "borg.repository", "msgid": 42,"""
+            """ "message": "borg >= 1.1 format message"}\n"""
+        )
+        handle_remote_line(msg)
         self.assert_equal(self.stream.getvalue(), "Remote: borg >= 1.1 format message\n")
         self.assert_equal(self.stderr.getvalue(), "")
 
@@ -1114,7 +1103,11 @@ class RemoteLoggerTestCase(BaseTestCase):
         self.handler.setLevel(logging.WARNING)
         logging.getLogger().setLevel(logging.WARNING)
 
-        handle_remote_line("$LOG INFO borg.repository Remote: new format info message\n")
+        msg = (
+            """{"type": "log_message", "levelname": "INFO", "name": "borg.repository", "msgid": 42,"""
+            """ "message": "new format info message"}\n"""
+        )
+        handle_remote_line(msg)
         self.assert_equal(self.stream.getvalue(), "")
         self.assert_equal(self.stderr.getvalue(), "")
 
@@ -1134,7 +1127,11 @@ class RemoteLoggerTestCase(BaseTestCase):
         foo_handler.setLevel(logging.INFO)
         logging.getLogger("borg.repository.foo").handlers[:] = [foo_handler]
 
-        handle_remote_line("$LOG INFO borg.repository Remote: new format child message\n")
+        msg = (
+            """{"type": "log_message", "levelname": "INFO", "name": "borg.repository", "msgid": 42,"""
+            """ "message": "new format child message"}\n"""
+        )
+        handle_remote_line(msg)
         self.assert_equal(foo_stream.getvalue(), "")
         self.assert_equal(child_stream.getvalue(), "Remote: new format child message\n")
         self.assert_equal(self.stream.getvalue(), "")