diff --git a/src/octoprint/__init__.py b/src/octoprint/__init__.py index 74ff84a0..e21664a7 100644 --- a/src/octoprint/__init__.py +++ b/src/octoprint/__init__.py @@ -24,7 +24,7 @@ logging.basicConfig() #~~ init methods to bring up platform def init_platform(basedir, configfile, use_logging_file=True, logging_file=None, - logging_config=None, debug=False, uncaught_logger=None, + logging_config=None, debug=False, verbosity=0, uncaught_logger=None, uncaught_handler=None, after_settings=None, after_logging=None): settings = init_settings(basedir, configfile) if callable(after_settings): @@ -35,6 +35,7 @@ def init_platform(basedir, configfile, use_logging_file=True, logging_file=None, logging_file=logging_file, default_config=logging_config, debug=debug, + verbosity=verbosity, uncaught_logger=uncaught_logger, uncaught_handler=uncaught_handler) if callable(after_logging): @@ -51,7 +52,7 @@ def init_settings(basedir, configfile): return settings(init=True, basedir=basedir, configfile=configfile) -def init_logging(settings, use_logging_file=True, logging_file=None, default_config=None, debug=False, uncaught_logger=None, uncaught_handler=None): +def init_logging(settings, use_logging_file=True, logging_file=None, default_config=None, debug=False, verbosity=0, uncaught_logger=None, uncaught_handler=None): """Sets up logging.""" import os @@ -96,10 +97,13 @@ def init_logging(settings, use_logging_file=True, logging_file=None, default_con "handlers": ["serialFile"], "propagate": False }, - "tornado.application": { + "octoprint": { "level": "INFO" }, - "tornado.general": { + "octoprint.util": { + "level": "INFO" + }, + "octoprint.plugins": { "level": "INFO" } }, @@ -109,7 +113,11 @@ def init_logging(settings, use_logging_file=True, logging_file=None, default_con } } - if debug: + if debug or verbosity > 0: + default_config["loggers"]["octoprint"]["level"] = "DEBUG" + if verbosity > 1: + default_config["loggers"]["octoprint.plugins"]["level"] = "DEBUG" + if verbosity > 2: default_config["root"]["level"] = "DEBUG" if use_logging_file: @@ -134,8 +142,13 @@ def init_logging(settings, use_logging_file=True, logging_file=None, default_con # make sure we log any warnings logging.captureWarnings(True) + import warnings - warnings.simplefilter("always") + + if verbosity > 2: + warnings.simplefilter("always") + elif debug or verbosity > 0: + warnings.simplefilter("default") # make sure we also log any uncaught exceptions if uncaught_logger is None: diff --git a/src/octoprint/cli/__init__.py b/src/octoprint/cli/__init__.py index d7b2bab3..2aa378ec 100644 --- a/src/octoprint/cli/__init__.py +++ b/src/octoprint/cli/__init__.py @@ -13,10 +13,11 @@ import octoprint class OctoPrintContext(object): - def __init__(self, configfile=None, basedir=None, debug=False): + def __init__(self, configfile=None, basedir=None, debug=False, verbosity=0): self.configfile = configfile self.basedir = basedir self.debug = debug + self.verbosity = verbosity pass_octoprint_ctx = click.make_pass_decorator(OctoPrintContext, ensure=True) @@ -62,12 +63,13 @@ def set_ctx_obj_option(ctx, param, value): @click.group(name="octoprint", invoke_without_command=True, cls=click.CommandCollection, sources=[server_commands, plugin_commands, devel_commands]) -@click.option("--basedir", "-b", type=click.Path(), callback=set_ctx_obj_option, is_eager=True, +@click.option("--basedir", "-b", type=click.Path(), callback=set_ctx_obj_option, is_eager=True, expose_value=False, help="Specify the basedir to use for uploads, timelapses etc.") -@click.option("--config", "-c", "configfile", type=click.Path(), callback=set_ctx_obj_option, is_eager=True, +@click.option("--config", "-c", "configfile", type=click.Path(), callback=set_ctx_obj_option, is_eager=True, expose_value=False, help="Specify the config file to use.") -@click.option("--debug", "-d", is_flag=True, callback=set_ctx_obj_option, is_eager=True, - help="Enable debug mode") +@click.option("--verbose", "-v", "verbosity", count=True, callback=set_ctx_obj_option, is_eager=True, expose_value=False, + help="Increase logging verbosity") +@hidden_option("--debug", "-d", is_flag=True) @hidden_option("--host", type=click.STRING) @hidden_option("--port", type=click.INT) @hidden_option("--logging", type=click.Path()) @@ -76,7 +78,7 @@ def set_ctx_obj_option(ctx, param, value): @hidden_option("--iknowwhatimdoing", "allow_root", is_flag=True) @click.version_option(version=octoprint.__version__) @click.pass_context -def octo(ctx, debug, host, port, basedir, configfile, logging, daemon, pid, allow_root): +def octo(ctx, debug, host, port, logging, daemon, pid, allow_root): if ctx.invoked_subcommand is None: # We have to support calling the octoprint command without any @@ -91,10 +93,10 @@ def octo(ctx, debug, host, port, basedir, configfile, logging, daemon, pid, allo "\"octoprint daemon start|stop|restart\" from now on") from octoprint.cli.server import daemon_command - ctx.invoke(daemon_command, pid=pid, daemon=daemon, allow_root=allow_root) + ctx.invoke(daemon_command, debug=debug, pid=pid, daemon=daemon, allow_root=allow_root) else: click.echo("Starting the server via \"octoprint\" is deprecated, " "please use \"octoprint serve\" from now on.") from octoprint.cli.server import serve_command - ctx.invoke(serve_command, host=host, port=port, logging=logging, allow_root=allow_root) + ctx.invoke(serve_command, debug=debug, host=host, port=port, logging=logging, allow_root=allow_root) diff --git a/src/octoprint/cli/plugins.py b/src/octoprint/cli/plugins.py index c5994340..dc0db004 100644 --- a/src/octoprint/cli/plugins.py +++ b/src/octoprint/cli/plugins.py @@ -80,6 +80,6 @@ class OctoPrintPluginCommands(click.MultiCommand): @pass_octoprint_ctx def plugin_commands(obj): """Commands provided by plugins.""" - logging.basicConfig(level=logging.DEBUG if obj.debug else logging.WARN) + logging.basicConfig(level=logging.DEBUG if obj.verbosity > 0 else logging.WARN) diff --git a/src/octoprint/cli/server.py b/src/octoprint/cli/server.py index b697efdd..135967bd 100644 --- a/src/octoprint/cli/server.py +++ b/src/octoprint/cli/server.py @@ -11,7 +11,7 @@ import sys from octoprint.cli import pass_octoprint_ctx -def run_server(basedir, configfile, host, port, debug, allow_root, logging_config): +def run_server(basedir, configfile, host, port, debug, allow_root, logging_config, verbosity): from octoprint import init_platform, __display_version__ def log_startup(_): @@ -21,6 +21,7 @@ def run_server(basedir, configfile, host, port, debug, allow_root, logging_confi configfile, logging_file=logging_config, debug=debug, + verbosity=verbosity, uncaught_logger=__name__, after_logging=log_startup) @@ -47,11 +48,13 @@ def server_commands(obj): help="Specify the config file to use for configuring logging.") @click.option("--iknowwhatimdoing", "allow_root", is_flag=True, help="Allow OctoPrint to run as user root.") +@click.option("--debug", is_flag=True, + help="Enable debug mode") @pass_octoprint_ctx -def serve_command(obj, host, port, logging, allow_root): +def serve_command(obj, host, port, logging, allow_root, debug): """Starts the OctoPrint server.""" - run_server(obj.basedir, obj.configfile, host, port, obj.debug, - allow_root, logging) + run_server(obj.basedir, obj.configfile, host, port, debug, + allow_root, logging, obj.verbosity) @server_commands.command(name="daemon") @@ -65,10 +68,12 @@ def serve_command(obj, host, port, logging, allow_root): help="Specify the config file to use for configuring logging.") @click.option("--iknowwhatimdoing", "allow_root", is_flag=True, help="Allow OctoPrint to run as user root.") +@click.option("--debug", is_flag=True, + help="Enable debug mode") @click.argument("command", type=click.Choice(["start", "stop", "restart"]), metavar="start|stop|restart") @pass_octoprint_ctx -def daemon_command(octoprint_ctx, pid, host, port, logging, allow_root, command): +def daemon_command(octoprint_ctx, pid, host, port, logging, allow_root, debug, command): """ Starts, stops or restarts in daemon mode. @@ -81,7 +86,7 @@ def daemon_command(octoprint_ctx, pid, host, port, logging, allow_root, command) from octoprint.daemon import Daemon class OctoPrintDaemon(Daemon): - def __init__(self, pidfile, basedir, configfile, host, port, debug, allow_root, logging_config): + def __init__(self, pidfile, basedir, configfile, host, port, debug, allow_root, logging_config, verbosity): Daemon.__init__(self, pidfile) self._basedir = basedir @@ -91,12 +96,13 @@ def daemon_command(octoprint_ctx, pid, host, port, logging, allow_root, command) self._debug = debug self._allow_root = allow_root self._logging_config = logging_config + self._verbosity = verbosity def run(self): - run_server(self._basedir, self._configfile, self._host, self._port, self._debug, self._allow_root, self._logging_config) + run_server(self._basedir, self._configfile, self._host, self._port, self._debug, self._allow_root, self._logging_config, self._verbosity) octoprint_daemon = OctoPrintDaemon(pid, octoprint_ctx.basedir, octoprint_ctx.configfile, - host, port, octoprint_ctx.debug, allow_root, logging) + host, port, debug, allow_root, logging, octoprint_ctx.verbosity) if command == "start": octoprint_daemon.start()