"next week Monday", or "start of next month". The `%nexttime(...)`
expansion above should be used for those time operations.
-== Logging
-
-=== %log.debug(<string>)
-
-Logs a message at a DEBUG level. This function returns nothing.
-
-[source,unlang]
-----
-%log.debug("Now processing %interpreter(...filename):%interpreter(...line)")
-----
-
-The DEBUG messages are printed only when the server has the debug flag set.
-
-=== %log.info(<string>)
-
-Logs a message at a INFO level. This function returns nothing.
-
-[source,unlang]
-----
-%log.info("Doing something useful now")
-----
-
-The INFO messages are always logged. We suggest using these messages
-only to log special or unusual events. Producing multiple log
-messages per packet is not recommended, and can have a surprisingly
-large (and negative) impact on performance.
-
// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
// This documentation was developed by Network RADIUS SAS.
--- /dev/null
+= Logging Functions
+
+These functions perform logging at various levels.
+
+We suggest using these messages only to log special or unusual events.
+Producing multiple log messages per packet is not recommended, and can
+have a surprisingly large (and negative) impact on performance.
+
+== %log.debug(_string_)
+
+Logs a message at a DEBUG level. This function returns nothing.
+
+[source,unlang]
+----
+%log.debug("Now processing %interpreter(...filename):%interpreter(...line)")
+----
+
+The DEBUG messages are printed only when the server has the debug flag set.
+
+== %log.err(_string_)
+
+Logs a message at a ERROR level. This function returns nothing.
+
+[source,unlang]
+----
+%log.err("Something very bad happened")
+----
+
+The ERROR messages are always logged.
+
+== %log.info(_string_)
+
+Logs a message at a INFO level. This function returns nothing.
+
+[source,unlang]
+----
+%log.info("Doing something useful now")
+----
+
+The INFO messages are always logged.
+
+== %log.watn(_string_)
+
+Logs a message at a WARN level. This function returns nothing.
+
+[source,unlang]
+----
+%log.warn("Something bad might be happening")
+----
+
+The WARN messages are always logged.
+
+// Copyright (C) 2023 Network RADIUS SAS. Licenced under CC-by-NC 4.0.
+// This documentation was developed by Network RADIUS SAS.
*
* Example:
@verbatim
-%log("foo") == "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
+%log("This is an informational message")
@endverbatim
*
* @ingroup xlat_functions
*
* Example:
@verbatim
-%log.debug("foo") == "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
+%log.debug("This is a message")
@endverbatim
*
* @ingroup xlat_functions
}
+/** Log something at DEBUG level.
+ *
+ * Example:
+@verbatim
+%log.err("Big errror here")
+@endverbatim
+ *
+ * @ingroup xlat_functions
+ */
+static xlat_action_t xlat_func_log_err(UNUSED TALLOC_CTX *ctx, UNUSED fr_dcursor_t *out,
+ UNUSED xlat_ctx_t const *xctx,
+ request_t *request, fr_value_box_list_t *args)
+{
+ fr_value_box_t *vb;
+
+ XLAT_ARGS(args, &vb);
+
+ if (!vb) return XLAT_ACTION_DONE;
+
+ REDEBUG("%s", vb->vb_strvalue);
+
+ return XLAT_ACTION_DONE;
+}
+
+
+/** Log something at WARNlevel.
+ *
+ * Example:
+@verbatim
+%log.warn("Maybe something bad happened")
+@endverbatim
+ *
+ * @ingroup xlat_functions
+ */
+static xlat_action_t xlat_func_log_warn(UNUSED TALLOC_CTX *ctx, UNUSED fr_dcursor_t *out,
+ UNUSED xlat_ctx_t const *xctx,
+ request_t *request, fr_value_box_list_t *args)
+{
+ fr_value_box_t *vb;
+
+ XLAT_ARGS(args, &vb);
+
+ if (!vb) return XLAT_ACTION_DONE;
+
+ RWDEBUG("%s", vb->vb_strvalue);
+
+ return XLAT_ACTION_DONE;
+}
+
+
static xlat_arg_parser_t const xlat_func_map_arg[] = {
{ .required = true, .concat = true, .type = FR_TYPE_STRING },
XLAT_ARG_PARSER_TERMINATOR
XLAT_REGISTER_ARGS("debug_attr", xlat_func_debug_attr, FR_TYPE_NULL, xlat_func_debug_attr_args);
XLAT_REGISTER_ARGS("immutable", xlat_func_immutable_attr, FR_TYPE_NULL, xlat_func_immutable_attr_args);
XLAT_REGISTER_ARGS("log.debug", xlat_func_log_debug, FR_TYPE_NULL, xlat_func_log_arg);
+ XLAT_REGISTER_ARGS("log.err", xlat_func_log_err, FR_TYPE_NULL, xlat_func_log_arg);
XLAT_REGISTER_ARGS("log.info", xlat_func_log_info, FR_TYPE_NULL, xlat_func_log_arg);
+ XLAT_REGISTER_ARGS("log.warn", xlat_func_log_warn, FR_TYPE_NULL, xlat_func_log_arg);
XLAT_REGISTER_ARGS("nexttime", xlat_func_next_time, FR_TYPE_UINT64, xlat_func_next_time_args);
XLAT_REGISTER_ARGS("pairs", xlat_func_pairs, FR_TYPE_STRING, xlat_func_pairs_args);
XLAT_REGISTER_ARGS("subst", xlat_func_subst, FR_TYPE_STRING, xlat_func_subst_args);