environments that should be preserved. */
#define DOVECOT_PRESERVE_ENVS_ENV "DOVECOT_PRESERVE_ENVS"
+/* getenv(DOVECOT_LOG_DEBUG_ENV) returns the global log_debug setting. This can
+ be used to initialize debug logging immediately at startup. */
+#define DOVECOT_LOG_DEBUG_ENV "LOG_DEBUG"
+
/* Write pipe to anvil. */
#define MASTER_ANVIL_FD 3
/* Anvil reads new log fds from this fd */
#include "lib.h"
#include "array.h"
+#include "event-filter.h"
#include "path-util.h"
#include "istream.h"
#include "write-full.h"
DEF(SET_STR, info_log_path),
DEF(SET_STR, debug_log_path),
DEF(SET_STR, log_timestamp),
+ DEF(SET_STR, log_debug),
DEF(SET_STR, syslog_facility),
DEF(SET_STR, import_environment),
DEF(SET_SIZE, config_cache_size),
.info_log_path = "",
.debug_log_path = "",
.log_timestamp = DEFAULT_FAILURE_STAMP_FORMAT,
+ .log_debug = "",
.syslog_facility = "mail",
.import_environment = "TZ CORE_OUTOFMEM CORE_ERROR" ENV_SYSTEMD ENV_GDB,
.config_cache_size = 1024*1024,
};
/* <settings checks> */
+int master_service_log_debug_parse(struct event_filter *filter, const char *str,
+ const char **error_r)
+{
+ const char *categories[2] = { NULL, NULL };
+ struct event_filter_query query = {
+ .categories = categories
+ };
+
+ /* FIXME: we should support more complicated filters */
+ const char *const *args = t_strsplit_spaces(str, " ");
+ for (unsigned int i = 0; args[i] != NULL; i++) {
+ categories[0] = args[i];
+ event_filter_add(filter, &query);
+ }
+ *error_r = NULL;
+ return 0;
+}
+
static bool
master_service_settings_check(void *_set, pool_t pool ATTR_UNUSED,
const char **error_r)
set->syslog_facility);
return FALSE;
}
+ struct event_filter *filter = event_filter_create();
+ const char *error;
+ if (master_service_log_debug_parse(filter, set->log_debug, &error) < 0) {
+ *error_r = t_strdup_printf("Invalid log_debug: %s", error);
+ event_filter_unref(&filter);
+ return FALSE;
+ }
+#ifndef CONFIG_BINARY
+ event_set_global_debug_log_filter(filter);
+#endif
+ event_filter_unref(&filter);
return TRUE;
}
/* </settings checks> */
const char *info_log_path;
const char *debug_log_path;
const char *log_timestamp;
+ const char *log_debug;
const char *syslog_facility;
const char *import_environment;
uoff_t config_cache_size;
bool master_service_set_has_config_override(struct master_service *service,
const char *key);
+/* Parse log_debug setting into an event filter. */
+int master_service_log_debug_parse(struct event_filter *filter, const char *str,
+ const char **error_r);
+
#endif
#include "lib.h"
#include "lib-signals.h"
+#include "event-filter.h"
#include "ioloop.h"
#include "path-util.h"
#include "array.h"
else
i_set_failure_prefix("%s: ", name);
+ /* Initialize debug logging */
+ value = getenv(DOVECOT_LOG_DEBUG_ENV);
+ if (value != NULL) {
+ struct event_filter *filter = event_filter_create();
+ const char *error;
+ if (master_service_log_debug_parse(filter, value, &error) < 0) {
+ i_error("Invalid "DOVECOT_LOG_DEBUG_ENV" - ignoring: %s",
+ error);
+ }
+ event_set_global_debug_filter(filter);
+ event_filter_unref(&filter);
+ }
+
if ((flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
/* initialize master_status structure */
value = getenv(MASTER_UID_ENV);