diff --git a/src/exposed/click.py b/src/exposed/click.py
index e48375d513bf57db92fee4781893cd139f333e3f..5897272e7cad8a7d10ea789b66f09218a76f0189 100644
--- a/src/exposed/click.py
+++ b/src/exposed/click.py
@@ -868,3 +868,25 @@ def config_group(
         return group_wrapper
 
     return group_decorator
+
+
+def log_parameters(
+    logger_handle: logging.Logger, ignore: tuple[str] | None = None
+):
+    """Logs the click parameters with the logging module.
+
+    Parameters
+    ----------
+    logger_handle : object
+        The logger handle to write debug information into.
+    ignore : tuple
+        The keys in ignore will not be logged.
+    """
+    ignore = ignore or tuple()
+    ctx = click.get_current_context()
+    # do not sort the ctx.params dict. The insertion order is kept in Python 3
+    # and is useful (but not necessary so works on Python 2 too).
+    for k, v in ctx.params.items():
+        if k in ignore:
+            continue
+        logger_handle.debug("%s: %s", k, v)
diff --git a/tests/test_click.py b/tests/test_click.py
index 31c1aae190b742e615b35f9a5c16fd2f6ccd5d25..e47b4bbbb32877ff0b093b884a3c95b5fd2f0567 100644
--- a/tests/test_click.py
+++ b/tests/test_click.py
@@ -9,6 +9,7 @@ from exposed.click import (
     AliasedGroup,
     ConfigCommand,
     ResourceOption,
+    log_parameters,
     verbosity_option,
 )
 
@@ -293,3 +294,47 @@ def test_resource_option():
     runner = CliRunner()
     result = runner.invoke(cli3, ["-a", "tests.data.basic_config"])
     assert result.exit_code == 0
+
+
+def test_log_parameter():
+    # Fake logger that checks if log_parameters accesses it
+    class DummyLogger:
+        def __init__(self):
+            self.accessed = False
+
+        def debug(self, str, k, v):
+            self.accessed = True
+
+    @click.command()
+    @click.option(
+        "-a",
+        "--a",
+    )
+    def cli_log(a):
+        dummy_logger = DummyLogger()
+        log_parameters(dummy_logger)
+        assert dummy_logger.accessed
+
+    runner = CliRunner()
+    result = runner.invoke(cli_log, ["-a", "aparam"])
+    assert result.exit_code == 0
+
+
+def test_log_parameter_with_ignore():
+    # Fake logger that ensures that the parameter 'a' is ignored
+    class DummyLogger:
+        def debug(self, str, k, v):
+            assert "a" not in k
+
+    @click.command()
+    @click.option("-a", "--a")
+    @click.option(
+        "-b",
+        "--b",
+    )
+    def cli_log(a, b):
+        log_parameters(DummyLogger(), ignore=("a"))
+
+    runner = CliRunner()
+    result = runner.invoke(cli_log, ["-a", "aparam", "-b", "bparam"])
+    assert result.exit_code == 0