From: Otto Moerbeek Date: Mon, 14 Oct 2024 11:56:39 +0000 (+0200) Subject: Extend pdnslog to allow for structured key-value pairs X-Git-Tag: rec-5.2.0-alpha1~12^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8fe9d7490f77b2118358eca8642aa4c51c52ce26;p=thirdparty%2Fpdns.git Extend pdnslog to allow for structured key-value pairs --- diff --git a/pdns/lua-base4.cc b/pdns/lua-base4.cc index b3d5d1b90f..31323801ab 100644 --- a/pdns/lua-base4.cc +++ b/pdns/lua-base4.cc @@ -272,10 +272,16 @@ void BaseLua4::prepareContext() { d_lw->registerFunction("changeContent", [](DNSRecord& dr, const std::string& newContent) { dr.setContent(shared_ptr(DNSRecordContent::make(dr.d_type, 1, newContent))); }); // pdnsload - d_lw->writeFunction("pdnslog", [](const std::string& msg, boost::optional loglevel) { - SLOG(g_log << (Logger::Urgency)loglevel.get_value_or(Logger::Warning) << msg<withName("lua")->info(static_cast(loglevel.get_value_or(Logr::Warning)), msg)); + d_lw->writeFunction("pdnslog", [](const std::string& msg, boost::optional loglevel, boost::optional> values) { + auto log = g_slog->withName("lua"); + if (values) { + for (const auto& [key, value] : *values) { + log = log->withValues(key, Logging::Loggable(value)); + } + } + log->info(static_cast(loglevel.get_value_or(Logr::Warning)), msg); }); + d_lw->writeFunction("pdnsrandom", [](boost::optional maximum) { return maximum ? dns_random(*maximum) : dns_random_uint32(); }); diff --git a/pdns/recursordist/docs/lua-scripting/logging.rst b/pdns/recursordist/docs/lua-scripting/logging.rst index 7591defd00..1c537d8641 100644 --- a/pdns/recursordist/docs/lua-scripting/logging.rst +++ b/pdns/recursordist/docs/lua-scripting/logging.rst @@ -1,17 +1,23 @@ Logging from the Lua scripts ============================ -To log messages with the main PowerDNS Recursor process, use :func:`pdnslog`. -:func:`pdnslog` can also write out to a syslog loglevel if specified. -Use ``pdnslog(message, pdns.loglevels.LEVEL)`` with the -correct pdns.loglevels entry. Entries are listed in the following table: +To log messages with the main PowerDNS :program:`Recursor` process, use :func:`pdnslog`. +optionally specifying a syslog loglevel. + +.. versionchanged:: 5.2.0 + + Added table as optional argument. .. function:: pdnslog(message) pdnslog(message, level) + pdnslog(message, level, table) - Log ``message` at the Info level if ``level`` is not set. + Log ``message`` at the ``Warning`` level if ``level`` is not set. - :param str msg: The message to log + :param str msg: The message to log. :param int level: The log level to log at, see below. + :param table table: A table of ``key = value`` entries to add to the structured log message. + +The available loglevel values are listed in the following table: - All - ``pdns.loglevels.All`` - Alert - ``pdns.loglevels.Alert`` @@ -22,3 +28,9 @@ correct pdns.loglevels entry. Entries are listed in the following table: - Info - ``pdns.loglevels.Info`` - Debug - ``pdns.loglevels.Debug`` - None - ``pdns.loglevels.None`` + +An example logging statement: + +.. code-block:: Lua + + pdnslog('You have been warned', pdns.loglevels.Warning, { times = 3, origin = 'documentation' })