diff --git a/src/lib-sieve/sieve-error-private.h b/src/lib-sieve/sieve-error-private.h
index b9caee5f2e4ccb28952c22cde939d3123d4dfb70..b4c21ef2483c9842a7a69ca52d62f9c49ed049c0 100644
--- a/src/lib-sieve/sieve-error-private.h
+++ b/src/lib-sieve/sieve-error-private.h
@@ -42,22 +42,10 @@ struct sieve_error_handler {
 	bool log_info;
 	bool log_debug;
 
-	void (*verror)(struct sieve_error_handler *ehandler,
-		       const struct sieve_error_params *params,
-		       unsigned int flags, const char *fmt, va_list args)
-		       ATTR_FORMAT(4, 0);
-	void (*vwarning)(struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 unsigned int flags, const char *fmt, va_list args)
-			 ATTR_FORMAT(4, 0);
-	void (*vinfo)(struct sieve_error_handler *ehandler,
-		      const struct sieve_error_params *params,
-		      unsigned int flags, const char *fmt, va_list args)
-		      ATTR_FORMAT(4, 0);
-	void (*vdebug)(struct sieve_error_handler *ehandler,
-		       const struct sieve_error_params *params,
-		       unsigned int flags, const char *fmt, va_list args)
-		       ATTR_FORMAT(4, 0);
+	void (*logv)(struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
+		     enum sieve_error_flags flags,
+		     const char *fmt, va_list args) ATTR_FORMAT(4, 0);
 
 	void (*free)(struct sieve_error_handler *ehandler);
 };
@@ -74,76 +62,22 @@ void sieve_error_handler_init_from_parent(struct sieve_error_handler *ehandler,
  * Direct handler calls
  */
 
-void sieve_direct_verror(struct sieve_instance *svinst,
-			 struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 unsigned int flags, const char *fmt, va_list args)
-			 ATTR_FORMAT(5, 0);
-void sieve_direct_vwarning(struct sieve_instance *svinst,
-			   struct sieve_error_handler *ehandler,
-			   const struct sieve_error_params *params,
-			   unsigned int flags, const char *fmt, va_list args)
-			   ATTR_FORMAT(5, 0);
-void sieve_direct_vinfo(struct sieve_instance *svinst,
-			struct sieve_error_handler *ehandler,
-			const struct sieve_error_params *params,
-			unsigned int flags, const char *fmt, va_list args)
-			ATTR_FORMAT(5, 0);
-void sieve_direct_vdebug(struct sieve_instance *svinst,
-			 struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 unsigned int flags, const char *fmt, va_list args)
-			 ATTR_FORMAT(5, 0);
-
-static inline void ATTR_FORMAT(5, 6)
-sieve_direct_error(struct sieve_instance *svinst,
-		   struct sieve_error_handler *ehandler,
-		   const struct sieve_error_params *params,
-		   unsigned int flags, const char *fmt, ...)
-{
-	va_list args;
-
-	va_start(args, fmt);
-	sieve_direct_verror(svinst, ehandler, params, flags, fmt, args);
-	va_end(args);
-}
-
-static inline void ATTR_FORMAT(5, 6)
-sieve_direct_warning(struct sieve_instance *svinst,
-		     struct sieve_error_handler *ehandler,
-		     const struct sieve_error_params *params,
-		     unsigned int flags, const char *fmt, ...)
-{
-	va_list args;
-
-	va_start(args, fmt);
-	sieve_direct_vwarning(svinst, ehandler, params, flags, fmt, args);
-	va_end(args);
-}
-
-static inline void ATTR_FORMAT(5, 6)
-sieve_direct_info(struct sieve_instance *svinst,
-		  struct sieve_error_handler *ehandler,
-		  const struct sieve_error_params *params,
-		  unsigned int flags, const char *fmt, ...)
-{
-	va_list args;
-
-	va_start(args, fmt);
-	sieve_direct_vinfo(svinst, ehandler, params, flags, fmt, args);
-	va_end(args);
-}
+void sieve_direct_logv(struct sieve_instance *svinst,
+		       struct sieve_error_handler *ehandler,
+		       const struct sieve_error_params *params,
+		       enum sieve_error_flags flags,
+		       const char *fmt, va_list args) ATTR_FORMAT(5, 0);
 
 static inline void ATTR_FORMAT(5, 6)
-sieve_direct_debug(struct sieve_instance *svinst,
-		   struct sieve_error_handler *ehandler,
-		   const struct sieve_error_params *params,
-		   unsigned int flags, const char *fmt, ...)
+sieve_direct_log(struct sieve_instance *svinst,
+		 struct sieve_error_handler *ehandler,
+		 const struct sieve_error_params *params,
+		 enum sieve_error_flags flags, const char *fmt, ...)
 {
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_direct_vdebug(svinst, ehandler, params, flags, fmt, args);
+	sieve_direct_logv(svinst, ehandler, params, flags, fmt, args);
 	va_end(args);
 }
 
diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index 5bb67a4b80ad293ee5333ffb5edc8e0529c70be6..c1b35c7d9156fde104a64bd3aa94fd933d5c08ab 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -72,78 +72,32 @@ void sieve_errors_deinit(struct sieve_instance *svinst)
  * Direct handler calls
  */
 
-void sieve_direct_verror(struct sieve_instance *svinst,
-			 struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 unsigned int flags,
-			 const char *fmt, va_list args)
+void sieve_direct_logv(struct sieve_instance *svinst,
+		       struct sieve_error_handler *ehandler,
+		       const struct sieve_error_params *params,
+		       enum sieve_error_flags flags,
+		       const char *fmt, va_list args)
 {
 	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
 	    (ehandler == NULL || ehandler->parent == NULL)) {
 		i_assert(svinst->system_ehandler != NULL);
 		if (svinst->system_ehandler != ehandler ||
-		    (flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
+		    (params->log_type > LOG_TYPE_INFO &&
+		     flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
+			struct sieve_error_params new_params = *params;
 			va_list args_copy;
 
 			VA_COPY(args_copy, args);
-			if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
-				if (svinst->system_ehandler->vinfo != NULL) {
-					svinst->system_ehandler->vinfo(
-						svinst->system_ehandler,
-						params, 0, fmt, args_copy);
-				}
-			} else {
-				if (svinst->system_ehandler->verror != NULL) {
-					svinst->system_ehandler->verror(
-						svinst->system_ehandler,
-						params, 0, fmt, args_copy);
-				}
-			}
-			va_end(args_copy);
 
-			if (svinst->system_ehandler == ehandler)
-				return;
-		}
-	}
-
-	if (ehandler == NULL)
-		return;
-
-	if (ehandler->parent != NULL || sieve_errors_more_allowed(ehandler)) {
-		if (ehandler->verror != NULL)
-			ehandler->verror(ehandler, params, flags, fmt, args);
-
-		if (ehandler->pool != NULL)
-			ehandler->errors++;
-	}
-}
+			if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0 &&
+			    new_params.log_type > LOG_TYPE_INFO)
+				new_params.log_type = LOG_TYPE_INFO;
 
-void sieve_direct_vwarning(struct sieve_instance *svinst,
-			   struct sieve_error_handler *ehandler,
-			   const struct sieve_error_params *params,
-			   unsigned int flags, const char *fmt, va_list args)
-{
-	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
-	    (ehandler == NULL || ehandler->parent == NULL)) {
-		i_assert(svinst->system_ehandler != NULL);
-		if (svinst->system_ehandler != ehandler ||
-		    (flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
-			va_list args_copy;
+			i_assert(svinst->system_ehandler->logv != NULL);
+			svinst->system_ehandler->logv(
+				svinst->system_ehandler, &new_params, 0,
+				fmt, args_copy);
 
-			VA_COPY(args_copy, args);
-			if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
-				if (svinst->system_ehandler->vinfo != NULL) {
-					svinst->system_ehandler->vinfo(
-						svinst->system_ehandler,
-						params, 0, fmt, args_copy);
-				}
-			} else {
-				if (svinst->system_ehandler->vwarning != NULL) {
-					svinst->system_ehandler->vwarning(
-						svinst->system_ehandler,
-						params, 0, fmt, args_copy);
-				}
-			}
 			va_end(args_copy);
 
 			if (svinst->system_ehandler == ehandler)
@@ -154,69 +108,27 @@ void sieve_direct_vwarning(struct sieve_instance *svinst,
 	if (ehandler == NULL)
 		return;
 
-	if (ehandler->vwarning != NULL)
-		ehandler->vwarning(ehandler, params, flags, fmt, args);
-
-	if (ehandler->pool != NULL)
-		ehandler->warnings++;
-}
-
-void sieve_direct_vinfo(struct sieve_instance *svinst,
-			struct sieve_error_handler *ehandler,
-			const struct sieve_error_params *params,
-			unsigned int flags, const char *fmt, va_list args)
-{
-	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
-	    (ehandler == NULL || ehandler->parent == NULL) &&
-	    svinst->system_ehandler != ehandler) {
-		i_assert(svinst->system_ehandler != NULL);
-		if (svinst->system_ehandler->vinfo != NULL) {
-			va_list args_copy;
-
-			VA_COPY(args_copy, args);
-			svinst->system_ehandler->vinfo(
-				svinst->system_ehandler, params, 0,
-				fmt, args_copy);
-			va_end(args_copy);
-		}
-	}
-
-	if (ehandler == NULL)
-		return;
-
-	if (ehandler->parent != NULL || ehandler->log_info) {
-		if (ehandler->vinfo != NULL)
-			ehandler->vinfo(ehandler, params, flags, fmt, args);
-	}
-}
-
-void sieve_direct_vdebug(struct sieve_instance *svinst,
-			 struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 unsigned int flags, const char *fmt, va_list args)
-{
-	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
-	    (ehandler == NULL || ehandler->parent == NULL) &&
-	    svinst->system_ehandler != ehandler) {
-		i_assert(svinst->system_ehandler != NULL);
-		if (svinst->system_ehandler->vdebug != NULL) {
-			va_list args_copy;
-
-			VA_COPY(args_copy, args);
-			svinst->system_ehandler->vdebug(
-				svinst->system_ehandler, params, 0,
-				fmt, args_copy);
-			va_end(args_copy);
+	if (ehandler->parent != NULL ||
+	    (params->log_type == LOG_TYPE_ERROR &&
+	     sieve_errors_more_allowed(ehandler)) ||
+	    (params->log_type == LOG_TYPE_INFO && ehandler->log_info) ||
+	    (params->log_type == LOG_TYPE_DEBUG && ehandler->log_debug)) {
+		i_assert(ehandler->logv != NULL);
+		ehandler->logv(ehandler, params, flags, fmt, args);
+
+		if (ehandler->pool != NULL) {
+			switch (params->log_type) {
+			case LOG_TYPE_ERROR:
+				ehandler->errors++;
+				break;
+			case LOG_TYPE_WARNING:
+				ehandler->warnings++;
+				break;
+			default:
+				break;
+			}
 		}
 	}
-
-	if (ehandler == NULL)
-		return;
-
-	if (ehandler->parent != NULL || ehandler->log_debug) {
-		if (ehandler->vdebug != NULL)
-			ehandler->vdebug(ehandler, params, flags, fmt, args);
-	}
 }
 
 /*
@@ -242,51 +154,23 @@ sieve_system_ehandler_get(struct sieve_instance *svinst)
  * User errors
  */
 
-void sieve_global_verror(struct sieve_instance *svinst,
-			 struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 const char *fmt, va_list args)
-{
-	sieve_direct_verror(svinst, ehandler, params,
-			    SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
-}
-
-void sieve_global_vwarning(struct sieve_instance *svinst,
-			   struct sieve_error_handler *ehandler,
-			   const struct sieve_error_params *params,
-			   const char *fmt, va_list args)
-{
-	sieve_direct_vwarning(svinst, ehandler, params,
-			      SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
-}
-
-void sieve_global_vinfo(struct sieve_instance *svinst,
-			struct sieve_error_handler *ehandler,
-			const struct sieve_error_params *params,
-			const char *fmt, va_list args)
-{
-	sieve_direct_vinfo(svinst, ehandler, params,
-			   SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
-}
-
-void sieve_global_info_verror(struct sieve_instance *svinst,
-			      struct sieve_error_handler *ehandler,
-			      const struct sieve_error_params *params,
-			      const char *fmt, va_list args)
+void sieve_global_logv(struct sieve_instance *svinst,
+		       struct sieve_error_handler *ehandler,
+		       const struct sieve_error_params *params,
+		       const char *fmt, va_list args)
 {
-	sieve_direct_verror(svinst, ehandler, params,
-			    (SIEVE_ERROR_FLAG_GLOBAL |
-			     SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args);
+	sieve_direct_logv(svinst, ehandler, params,
+			  SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
 }
 
-void sieve_global_info_vwarning(struct sieve_instance *svinst,
-				struct sieve_error_handler *ehandler,
-				const struct sieve_error_params *params,
-				const char *fmt, va_list args)
+void sieve_global_info_logv(struct sieve_instance *svinst,
+			    struct sieve_error_handler *ehandler,
+			    const struct sieve_error_params *params,
+			    const char *fmt, va_list args)
 {
-	sieve_direct_vwarning(svinst, ehandler, params,
-			      (SIEVE_ERROR_FLAG_GLOBAL |
-			       SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args);
+	sieve_direct_logv(svinst, ehandler, params,
+			  (SIEVE_ERROR_FLAG_GLOBAL |
+			   SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args);
 }
 
 void sieve_global_error(struct sieve_instance *svinst,
@@ -294,13 +178,14 @@ void sieve_global_error(struct sieve_instance *svinst,
 			const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_verror(svinst, ehandler, &params, fmt, args);
+		sieve_global_logv(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -311,13 +196,14 @@ void sieve_global_warning(struct sieve_instance *svinst,
 			  const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_WARNING,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_vwarning(svinst, ehandler, &params, fmt, args);
+		sieve_global_logv(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -328,13 +214,14 @@ void sieve_global_info(struct sieve_instance *svinst,
 		       const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_INFO,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_vinfo(svinst, ehandler, &params, fmt, args);
+		sieve_global_logv(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -345,13 +232,14 @@ void sieve_global_info_error(struct sieve_instance *svinst,
 			     const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_info_verror(svinst, ehandler, &params, fmt, args);
+		sieve_global_info_logv(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -362,14 +250,14 @@ void sieve_global_info_warning(struct sieve_instance *svinst,
 			       const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_WARNING,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_info_vwarning(svinst, ehandler, &params,
-					   fmt, args);
+		sieve_global_info_logv(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -383,6 +271,7 @@ void sieve_internal_error(struct sieve_error_handler *ehandler,
 			  const char *location, const char *user_prefix)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	char str[256];
@@ -397,48 +286,21 @@ void sieve_internal_error(struct sieve_error_handler *ehandler,
 	       str : CRITICAL_MSG);
 
 	if (user_prefix == NULL || *user_prefix == '\0') {
-		sieve_direct_error(ehandler->svinst, ehandler, &params, 0,
-				   "%s", msg);
+		sieve_direct_log(ehandler->svinst, ehandler, &params, 0,
+				 "%s", msg);
 	} else {
-		sieve_direct_error(ehandler->svinst, ehandler, &params, 0,
-				   "%s: %s", user_prefix, msg);
+		sieve_direct_log(ehandler->svinst, ehandler, &params, 0,
+				 "%s: %s", user_prefix, msg);
 	}
 }
 
-void sieve_verror(struct sieve_error_handler *ehandler,
-		  const struct sieve_error_params *params,
-		  const char *fmt, va_list args)
-{
-	if (ehandler == NULL) return;
-
-	sieve_direct_verror(ehandler->svinst, ehandler, params, 0, fmt, args);
-}
-
-void sieve_vwarning(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    const char *fmt, va_list args)
-{
-	if (ehandler == NULL) return;
-
-	sieve_direct_vwarning(ehandler->svinst, ehandler, params, 0, fmt, args);
-}
-
-void sieve_vinfo(struct sieve_error_handler *ehandler,
-		 const struct sieve_error_params *params,
-		 const char *fmt, va_list args)
-{
-	if (ehandler == NULL) return;
-
-	sieve_direct_vinfo(ehandler->svinst, ehandler, params, 0, fmt, args);
-}
-
-void sieve_vdebug(struct sieve_error_handler *ehandler,
-		  const struct sieve_error_params *params,
-		  const char *fmt, va_list args)
+void sieve_logv(struct sieve_error_handler *ehandler,
+		const struct sieve_error_params *params,
+		const char *fmt, va_list args)
 {
 	if (ehandler == NULL) return;
 
-	sieve_direct_vdebug(ehandler->svinst, ehandler, params, 0, fmt, args);
+	sieve_direct_logv(ehandler->svinst, ehandler, params, 0, fmt, args);
 }
 
 void sieve_vcritical(struct sieve_instance *svinst,
@@ -446,8 +308,12 @@ void sieve_vcritical(struct sieve_instance *svinst,
 		     const struct sieve_error_params *params,
 		     const char *user_prefix, const char *fmt, va_list args)
 {
-	sieve_direct_verror(svinst, svinst->system_ehandler, params, 0,
-			    fmt, args);
+	struct sieve_error_params new_params = *params;
+
+	new_params.log_type = LOG_TYPE_ERROR;
+
+	sieve_direct_logv(svinst, svinst->system_ehandler, &new_params, 0,
+			  fmt, args);
 	sieve_internal_error(ehandler, params->location, user_prefix);
 }
 
@@ -455,13 +321,14 @@ void sieve_error(struct sieve_error_handler *ehandler, const char *location,
 		 const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_verror(ehandler, &params, fmt, args);
+		sieve_logv(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -471,13 +338,14 @@ void sieve_warning(struct sieve_error_handler *ehandler, const char *location,
 		   const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_WARNING,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vwarning(ehandler, &params, fmt, args);
+		sieve_logv(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -487,13 +355,14 @@ void sieve_info(struct sieve_error_handler *ehandler, const char *location,
 		const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_INFO,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vinfo(ehandler, &params, fmt, args);
+		sieve_logv(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -503,13 +372,14 @@ void sieve_debug(struct sieve_error_handler *ehandler, const char *location,
 		 const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_DEBUG,
 		.location = location,
 	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vdebug(ehandler, &params, fmt, args);
+		sieve_logv(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -520,9 +390,11 @@ void sieve_critical(struct sieve_instance *svinst,
 		    const char *user_prefix, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	va_list args;
+
 	va_start(args, fmt);
 
 	T_BEGIN {
@@ -668,15 +540,33 @@ struct sieve_master_ehandler {
 typedef void (*master_log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2);
 
 static void ATTR_FORMAT(4, 0)
-sieve_master_vlog(struct sieve_error_handler *_ehandler,
+sieve_master_logv(struct sieve_error_handler *_ehandler,
 		  const struct sieve_error_params *params,
-		  master_log_func_t log_func,
+		  enum sieve_error_flags flags ATTR_UNUSED,
 		  const char *fmt, va_list args)
 {
 	struct sieve_master_ehandler *ehandler =
 		(struct sieve_master_ehandler *) _ehandler;
+	master_log_func_t log_func;
 	string_t *str;
 
+	switch (params->log_type) {
+	case LOG_TYPE_ERROR:
+		log_func = i_error;
+		break;
+	case LOG_TYPE_WARNING:
+		log_func = i_warning;
+		break;
+	case LOG_TYPE_INFO:
+		log_func = i_info;
+		break;
+	case LOG_TYPE_DEBUG:
+		log_func = i_debug;
+		break;
+	default:
+		i_unreached();
+	}
+
 	str = t_str_new(256);
 	if (ehandler->prefix != NULL)
 		str_printfa(str, "%s: ", ehandler->prefix);
@@ -691,42 +581,6 @@ sieve_master_vlog(struct sieve_error_handler *_ehandler,
 	log_func("%s", str_c(str));
 }
 
-static void ATTR_FORMAT(4, 0)
-sieve_master_verror(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
-{
-	sieve_master_vlog(ehandler, params, i_error, fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_master_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      const struct sieve_error_params *params,
-		      unsigned int flags ATTR_UNUSED,
-		      const char *fmt, va_list args)
-{
-	sieve_master_vlog(ehandler, params, i_warning, fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_master_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		   const struct sieve_error_params *params,
-		   unsigned int flags ATTR_UNUSED,
-		   const char *fmt, va_list args)
-{
-	sieve_master_vlog(ehandler, params, i_info, fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_master_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
-{
-	sieve_master_vlog(ehandler, params, i_debug, fmt, args);
-}
-
 struct sieve_error_handler *
 sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix,
 			     unsigned int max_errors)
@@ -738,10 +592,7 @@ sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix,
 	ehandler = p_new(pool, struct sieve_master_ehandler, 1);
 	sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors);
 
-	ehandler->handler.verror = sieve_master_verror;
-	ehandler->handler.vwarning = sieve_master_vwarning;
-	ehandler->handler.vinfo = sieve_master_vinfo;
-	ehandler->handler.vdebug = sieve_master_vdebug;
+	ehandler->handler.logv = sieve_master_logv;
 
 	if (prefix != NULL)
 		ehandler->prefix = p_strdup(pool, prefix);
@@ -758,10 +609,30 @@ sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix,
  */
 
 static void ATTR_FORMAT(4, 0)
-sieve_stderr_vmessage(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      const struct sieve_error_params *params,
-		      const char *prefix, const char *fmt, va_list args)
+sieve_stderr_logv(struct sieve_error_handler *ehandler ATTR_UNUSED,
+		  const struct sieve_error_params *params,
+		  enum sieve_error_flags flags ATTR_UNUSED,
+		  const char *fmt, va_list args)
 {
+	const char *prefix;
+
+	switch (params->log_type) {
+	case LOG_TYPE_ERROR:
+		prefix = "error";
+		break;
+	case LOG_TYPE_WARNING:
+		prefix = "warning";
+		break;
+	case LOG_TYPE_INFO:
+		prefix = "info";
+		break;
+	case LOG_TYPE_DEBUG:
+		prefix = "debug";
+		break;
+	default:
+		i_unreached();
+	}
+
 	if (params->location == NULL || *params->location == '\0') {
 		fprintf(stderr, "%s: %s.\n", prefix,
 			t_strdup_vprintf(fmt, args));
@@ -771,42 +642,6 @@ sieve_stderr_vmessage(struct sieve_error_handler *ehandler ATTR_UNUSED,
 	}
 }
 
-static void ATTR_FORMAT(4, 0)
-sieve_stderr_verror(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
-{
-	sieve_stderr_vmessage(ehandler, params, "error", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_stderr_vwarning(struct sieve_error_handler *ehandler,
-		      const struct sieve_error_params *params,
-		      unsigned int flags ATTR_UNUSED,
-		      const char *fmt, va_list args)
-{
-	sieve_stderr_vmessage(ehandler, params, "warning", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_stderr_vinfo(struct sieve_error_handler *ehandler,
-		   const struct sieve_error_params *params,
-		   unsigned int flags ATTR_UNUSED,
-		   const char *fmt, va_list args)
-{
-	sieve_stderr_vmessage(ehandler, params, "info", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_stderr_vdebug(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
-{
-	sieve_stderr_vmessage(ehandler, params, "debug", fmt, args);
-}
-
 struct sieve_error_handler *
 sieve_stderr_ehandler_create(struct sieve_instance *svinst,
 			     unsigned int max_errors)
@@ -822,10 +657,7 @@ sieve_stderr_ehandler_create(struct sieve_instance *svinst,
 	ehandler = p_new(pool, struct sieve_error_handler, 1);
 	sieve_error_handler_init(ehandler, svinst, pool, max_errors);
 
-	ehandler->verror = sieve_stderr_verror;
-	ehandler->vwarning = sieve_stderr_vwarning;
-	ehandler->vinfo = sieve_stderr_vinfo;
-	ehandler->vdebug = sieve_stderr_vdebug;
+	ehandler->logv = sieve_stderr_logv;
 
 	return ehandler;
 }
@@ -843,12 +675,31 @@ struct sieve_strbuf_ehandler {
 };
 
 static void ATTR_FORMAT(4, 0)
-sieve_strbuf_vmessage(struct sieve_error_handler *ehandler,
-		      const struct sieve_error_params *params,
-		      const char *prefix, const char *fmt, va_list args)
+sieve_strbuf_logv(struct sieve_error_handler *ehandler,
+		  const struct sieve_error_params *params,
+		  enum sieve_error_flags flags ATTR_UNUSED,
+		  const char *fmt, va_list args)
 {
 	struct sieve_strbuf_ehandler *handler =
 		(struct sieve_strbuf_ehandler *) ehandler;
+	const char *prefix;
+
+	switch (params->log_type) {
+	case LOG_TYPE_ERROR:
+		prefix = "error";
+		break;
+	case LOG_TYPE_WARNING:
+		prefix = "warning";
+		break;
+	case LOG_TYPE_INFO:
+		prefix = "info";
+		break;
+	case LOG_TYPE_DEBUG:
+		prefix = "debug";
+		break;
+	default:
+		i_unreached();
+	}
 
 	if (params->location != NULL && *params->location != '\0')
 		str_printfa(handler->errors, "%s: ", params->location);
@@ -861,42 +712,6 @@ sieve_strbuf_vmessage(struct sieve_error_handler *ehandler,
 		str_append(handler->errors, ".\r\n");
 }
 
-static void ATTR_FORMAT(4, 0)
-sieve_strbuf_verror(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
-{
-	sieve_strbuf_vmessage(ehandler, params, "error", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_strbuf_vwarning(struct sieve_error_handler *ehandler,
-		      const struct sieve_error_params *params,
-		      unsigned int flags ATTR_UNUSED,
-		      const char *fmt, va_list args)
-{
-	sieve_strbuf_vmessage(ehandler, params, "warning", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_strbuf_vinfo(struct sieve_error_handler *ehandler,
-		   const struct sieve_error_params *params,
-		   unsigned int flags ATTR_UNUSED,
-		   const char *fmt, va_list args)
-{
-	sieve_strbuf_vmessage(ehandler, params, "info", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_strbuf_vdebug(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
-{
-	sieve_strbuf_vmessage(ehandler, params, "debug", fmt, args);
-}
-
 struct sieve_error_handler *
 sieve_strbuf_ehandler_create(struct sieve_instance *svinst, string_t *strbuf,
 			     bool crlf, unsigned int max_errors)
@@ -910,11 +725,7 @@ sieve_strbuf_ehandler_create(struct sieve_instance *svinst, string_t *strbuf,
 
 	sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors);
 
-	ehandler->handler.verror = sieve_strbuf_verror;
-	ehandler->handler.vwarning = sieve_strbuf_vwarning;
-	ehandler->handler.vinfo = sieve_strbuf_vinfo;
-	ehandler->handler.vdebug = sieve_strbuf_vdebug;
-
+	ehandler->handler.logv = sieve_strbuf_logv;
 	ehandler->crlf = crlf;
 
 	return &(ehandler->handler);
@@ -981,6 +792,7 @@ sieve_logfile_printf(struct sieve_logfile_ehandler *ehandler,
 		     const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_INFO,
 		.location = location,
 	};
 	va_list args;
@@ -1116,63 +928,36 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler)
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_logfile_verror(struct sieve_error_handler *ehandler,
-		     const struct sieve_error_params *params,
-		     unsigned int flags ATTR_UNUSED,
-		     const char *fmt, va_list args)
-{
-	struct sieve_logfile_ehandler *handler =
-		(struct sieve_logfile_ehandler *) ehandler;
-
-	if (!handler->started)
-		sieve_logfile_start(handler);
-
-	sieve_logfile_vprintf(handler, params, "error", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_logfile_vwarning(struct sieve_error_handler *ehandler,
-		       const struct sieve_error_params *params,
-		       unsigned int flags ATTR_UNUSED,
-		       const char *fmt, va_list args)
-{
-	struct sieve_logfile_ehandler *handler =
-		(struct sieve_logfile_ehandler *) ehandler;
-
-	if (!handler->started)
-		sieve_logfile_start(handler);
-
-	sieve_logfile_vprintf(handler, params, "warning", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_logfile_vinfo(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags ATTR_UNUSED,
-		    const char *fmt, va_list args)
+sieve_logfile_logv(struct sieve_error_handler *ehandler,
+		   const struct sieve_error_params *params,
+		   enum sieve_error_flags flags ATTR_UNUSED,
+		   const char *fmt, va_list args)
 {
 	struct sieve_logfile_ehandler *handler =
 		(struct sieve_logfile_ehandler *) ehandler;
+	const char *prefix;
 
 	if (!handler->started)
 		sieve_logfile_start(handler);
 
-	sieve_logfile_vprintf(handler, params, "info", fmt, args);
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_logfile_vdebug(struct sieve_error_handler *ehandler,
-		     const struct sieve_error_params *params,
-		     unsigned int flags ATTR_UNUSED,
-		     const char *fmt, va_list args)
-{
-	struct sieve_logfile_ehandler *handler =
-		(struct sieve_logfile_ehandler *) ehandler;
-
-	if (!handler->started)
-		sieve_logfile_start(handler);
+	switch (params->log_type) {
+	case LOG_TYPE_ERROR:
+		prefix = "error";
+		break;
+	case LOG_TYPE_WARNING:
+		prefix = "warning";
+		break;
+	case LOG_TYPE_INFO:
+		prefix = "info";
+		break;
+	case LOG_TYPE_DEBUG:
+		prefix = "debug";
+		break;
+	default:
+		i_unreached();
+	}
 
-	sieve_logfile_vprintf(handler, params, "debug", fmt, args);
+	sieve_logfile_vprintf(handler, params, prefix, fmt, args);
 }
 
 static void sieve_logfile_free(struct sieve_error_handler *ehandler)
@@ -1204,10 +989,7 @@ sieve_logfile_ehandler_create(struct sieve_instance *svinst,
 	ehandler = p_new(pool, struct sieve_logfile_ehandler, 1);
 	sieve_error_handler_init(&ehandler->handler, svinst, pool, max_errors);
 
-	ehandler->handler.verror = sieve_logfile_verror;
-	ehandler->handler.vwarning = sieve_logfile_vwarning;
-	ehandler->handler.vinfo = sieve_logfile_vinfo;
-	ehandler->handler.vdebug = sieve_logfile_vdebug;
+	ehandler->handler.logv = sieve_logfile_logv;
 	ehandler->handler.free = sieve_logfile_free;
 
 	/* Don't open logfile until something is actually logged.
@@ -1254,57 +1036,10 @@ _prefix_message(struct sieve_prefix_ehandler *ehandler,
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_prefix_verror(struct sieve_error_handler *_ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags, const char *fmt, va_list args)
-{
-	struct sieve_prefix_ehandler *ehandler =
-		(struct sieve_prefix_ehandler *) _ehandler;
-	struct sieve_error_params new_params = *params;
-
-	new_params.location = ehandler->location;
-
-	sieve_direct_error(_ehandler->svinst, _ehandler->parent,
-			   &new_params, flags, "%s",
-			   _prefix_message(ehandler, params, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_prefix_vwarning(struct sieve_error_handler *_ehandler,
-		      const struct sieve_error_params *params,
-		      unsigned int flags, const char *fmt, va_list args)
-{
-	struct sieve_prefix_ehandler *ehandler =
-		(struct sieve_prefix_ehandler *) _ehandler;
-	struct sieve_error_params new_params = *params;
-
-	new_params.location = ehandler->location;
-
-	sieve_direct_warning(_ehandler->svinst, _ehandler->parent,
-			     &new_params, flags, "%s",
-			     _prefix_message(ehandler, params, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_prefix_vinfo(struct sieve_error_handler *_ehandler,
-		   const struct sieve_error_params *params,
-		   unsigned int flags, const char *fmt, va_list args)
-{
-	struct sieve_prefix_ehandler *ehandler =
-		(struct sieve_prefix_ehandler *) _ehandler;
-	struct sieve_error_params new_params = *params;
-
-	new_params.location = ehandler->location;
-
-	sieve_direct_info(_ehandler->svinst, _ehandler->parent,
-			  &new_params, flags, "%s",
-			  _prefix_message(ehandler, params, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_prefix_vdebug(struct sieve_error_handler *_ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags, const char *fmt, va_list args)
+sieve_prefix_logv(struct sieve_error_handler *_ehandler,
+		  const struct sieve_error_params *params,
+		  enum sieve_error_flags flags,
+		  const char *fmt, va_list args)
 {
 	struct sieve_prefix_ehandler *ehandler =
 		(struct sieve_prefix_ehandler *) _ehandler;
@@ -1312,9 +1047,9 @@ sieve_prefix_vdebug(struct sieve_error_handler *_ehandler,
 
 	new_params.location = ehandler->location;
 
-	sieve_direct_debug(_ehandler->svinst, _ehandler->parent,
-			   &new_params, flags, "%s",
-			   _prefix_message(ehandler, params, fmt, args));
+	sieve_direct_log(_ehandler->svinst, _ehandler->parent,
+			 &new_params, flags, "%s",
+			 _prefix_message(ehandler, params, fmt, args));
 }
 
 struct sieve_error_handler *
@@ -1334,10 +1069,7 @@ sieve_prefix_ehandler_create(struct sieve_error_handler *parent,
 	ehandler->location = p_strdup(pool, location);
 	ehandler->prefix = p_strdup(pool, prefix);
 
-	ehandler->handler.verror = sieve_prefix_verror;
-	ehandler->handler.vwarning = sieve_prefix_vwarning;
-	ehandler->handler.vinfo = sieve_prefix_vinfo;
-	ehandler->handler.vdebug = sieve_prefix_vdebug;
+	ehandler->handler.logv = sieve_prefix_logv;
 
 	return &(ehandler->handler);
 }
@@ -1389,43 +1121,14 @@ _expand_message(struct sieve_error_handler *_ehandler,
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_varexpand_verror(struct sieve_error_handler *ehandler,
-		       const struct sieve_error_params *params,
-		       unsigned int flags, const char *fmt, va_list args)
-{
-	sieve_direct_error(ehandler->svinst, ehandler->parent,
-			   params, flags, "%s",
-			   _expand_message(ehandler, params, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_varexpand_vwarning(struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 unsigned int flags, const char *fmt, va_list args)
-{
-	sieve_direct_warning(ehandler->svinst, ehandler->parent,
-			     params, flags, "%s",
-			     _expand_message(ehandler, params, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_varexpand_vinfo(struct sieve_error_handler *ehandler,
-		      const struct sieve_error_params *params,
-		      unsigned int flags, const char *fmt, va_list args)
-{
-	sieve_direct_info(ehandler->svinst, ehandler->parent,
-			  params, flags, "%s",
-			  _expand_message(ehandler, params, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-sieve_varexpand_vdebug(struct sieve_error_handler *ehandler,
-		       const struct sieve_error_params *params,
-		       unsigned int flags, const char *fmt, va_list args)
+sieve_varexpand_logv(struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
+		     enum sieve_error_flags flags,
+		     const char *fmt, va_list args)
 {
-	sieve_direct_debug(ehandler->svinst, ehandler->parent,
-			   params, flags, "%s",
-			   _expand_message(ehandler, params, fmt, args));
+	sieve_direct_log(ehandler->svinst, ehandler->parent,
+			 params, flags, "%s",
+			 _expand_message(ehandler, params, fmt, args));
 }
 
 struct sieve_error_handler *
@@ -1473,10 +1176,7 @@ sieve_varexpand_ehandler_create(struct sieve_error_handler *parent,
 
 	(void)array_append_space(&ehandler->table);
 
-	ehandler->handler.verror = sieve_varexpand_verror;
-	ehandler->handler.vwarning = sieve_varexpand_vwarning;
-	ehandler->handler.vinfo = sieve_varexpand_vinfo;
-	ehandler->handler.vdebug = sieve_varexpand_vdebug;
+	ehandler->handler.logv = sieve_varexpand_logv;
 
 	return &(ehandler->handler);
 }
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index 19dc0ce0e24c0da8b53d5e84934c02b95c6d32d8..5e633ff9fe0dadb7d0260d40c7b0394939a36083 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -21,18 +21,12 @@ struct sieve_error_handler;
  */
 
 struct sieve_error_params {
+	enum log_type log_type;
+
 	/* Location in Sieve source script */
 	const char *location;
 };
 
-typedef void (*sieve_error_vfunc_t)(struct sieve_error_handler *ehandler,
-				    const struct sieve_error_params *params,
-				    const char *fmt, va_list args)
-				    ATTR_FORMAT(3, 0);;
-typedef void (*sieve_error_func_t)(struct sieve_error_handler *ehandler,
-				   const char *location, const char *fmt, ...)
-				   ATTR_FORMAT(3, 4);
-
 /*
  * System errors
  */
@@ -45,27 +39,14 @@ sieve_system_ehandler_get(struct sieve_instance *svinst);
  * Global (user+system) errors
  */
 
-void sieve_global_verror(struct sieve_instance *svinst,
-			 struct sieve_error_handler *ehandler,
-			 const struct sieve_error_params *params,
-			 const char *fmt, va_list args) ATTR_FORMAT(4, 0);
-void sieve_global_vwarning(struct sieve_instance *svinst,
-			   struct sieve_error_handler *ehandler,
-			   const struct sieve_error_params *params,
-			   const char *fmt, va_list args) ATTR_FORMAT(4, 0);
-void sieve_global_vinfo(struct sieve_instance *svinst,
-			struct sieve_error_handler *ehandler,
-			const struct sieve_error_params *params,
-			const char *fmt, va_list args) ATTR_FORMAT(4, 0);
-void sieve_global_info_verror(struct sieve_instance *svinst,
-			      struct sieve_error_handler *ehandler,
-			      const struct sieve_error_params *params,
-			      const char *fmt, va_list args) ATTR_FORMAT(4, 0);
-void sieve_global_info_vwarning(struct sieve_instance *svinst,
-				struct sieve_error_handler *ehandler,
-				const struct sieve_error_params *params,
-				const char *fmt, va_list args)
-				ATTR_FORMAT(4, 0);
+void sieve_global_logv(struct sieve_instance *svinst,
+		       struct sieve_error_handler *ehandler,
+		       const struct sieve_error_params *params,
+		       const char *fmt, va_list args) ATTR_FORMAT(4, 0);
+void sieve_global_info_logv(struct sieve_instance *svinst,
+			    struct sieve_error_handler *ehandler,
+			    const struct sieve_error_params *params,
+			    const char *fmt, va_list args) ATTR_FORMAT(4, 0);
 
 void sieve_global_error(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
@@ -100,32 +81,24 @@ const char *
 sieve_error_script_location(const struct sieve_script *script,
 			    unsigned int source_line);
 
-void sieve_verror(struct sieve_error_handler *ehandler,
-		  const struct sieve_error_params *params,
-		  const char *fmt, va_list args) ATTR_FORMAT(3, 0);
-void sieve_vwarning(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    const char *fmt, va_list args) ATTR_FORMAT(3, 0);
-void sieve_vinfo(struct sieve_error_handler *ehandler,
-		 const struct sieve_error_params *params,
-		 const char *fmt, va_list args) ATTR_FORMAT(3, 0);
-void sieve_vdebug(struct sieve_error_handler *ehandler,
-		  const struct sieve_error_params *params,
-		  const char *fmt, va_list args) ATTR_FORMAT(3, 0);
+void sieve_logv(struct sieve_error_handler *ehandler,
+		const struct sieve_error_params *params,
+		const char *fmt, va_list args) ATTR_FORMAT(3, 0);
 void sieve_vcritical(struct sieve_instance *svinst,
 		     struct sieve_error_handler *ehandler,
 		     const struct sieve_error_params *params,
 		     const char *user_prefix, const char *fmt, va_list args)
 		     ATTR_FORMAT(5, 0);
 
-void sieve_error(struct sieve_error_handler *ehandler, const char *location,
-		 const char *fmt, ...) ATTR_FORMAT(3, 4);
-void sieve_warning(struct sieve_error_handler *ehandler, const char *location,
-		   const char *fmt, ...) ATTR_FORMAT(3, 4);
-void sieve_info(struct sieve_error_handler *ehandler, const char *location,
-		const char *fmt, ...) ATTR_FORMAT(3, 4);
-void sieve_debug(struct sieve_error_handler *ehandler, const char *location,
-		 const char *fmt, ...) ATTR_FORMAT(3, 4);
+void sieve_error(struct sieve_error_handler *ehandler,
+		 const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4);
+void sieve_warning(struct sieve_error_handler *ehandler,
+		   const char *location, const char *fmt, ...)
+		   ATTR_FORMAT(3, 4);
+void sieve_info(struct sieve_error_handler *ehandler,
+		const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4);
+void sieve_debug(struct sieve_error_handler *ehandler,
+		 const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4);
 void sieve_critical(struct sieve_instance *svinst,
 		    struct sieve_error_handler *ehandler, const char *location,
 		    const char *user_prefix, const char *fmt, ...)
diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c
index 4546201f5196a70001be4edeb7e526cd3a9b44a3..ad0505abf55747742321c6c1c3268a6dcc976a24 100644
--- a/src/lib-sieve/sieve-generator.c
+++ b/src/lib-sieve/sieve-generator.c
@@ -514,7 +514,7 @@ void sieve_generator_error(struct sieve_generator *gentr,
 			   unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
@@ -522,7 +522,7 @@ void sieve_generator_error(struct sieve_generator *gentr,
 		sieve_error_script_location(gentr->genenv.script, source_line);
 
 	va_start(args, fmt);
-	sieve_verror(gentr->ehandler, &params, fmt, args);
+	sieve_logv(gentr->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -530,7 +530,7 @@ void sieve_generator_warning(struct sieve_generator *gentr,
 			     unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_WARNING,
 	};
 	va_list args;
 
@@ -538,7 +538,7 @@ void sieve_generator_warning(struct sieve_generator *gentr,
 		sieve_error_script_location(gentr->genenv.script, source_line);
 
 	va_start(args, fmt);
-	sieve_vwarning(gentr->ehandler, &params, fmt, args);
+	sieve_logv(gentr->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -546,7 +546,7 @@ void sieve_generator_critical(struct sieve_generator *gentr,
 			      unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
@@ -554,6 +554,7 @@ void sieve_generator_critical(struct sieve_generator *gentr,
 		sieve_error_script_location(gentr->genenv.script, source_line);
 
 	va_start(args, fmt);
-	sieve_vwarning(gentr->ehandler, &params, fmt, args);
+	sieve_vcritical(gentr->genenv.svinst, gentr->ehandler, &params,
+			"Code generation failed", fmt, args);
 	va_end(args);
 }
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 5614e251f36e694dc6a16ccaff72047d37869186..5cc079cec446460d7bcf6069c4dab7045411b25c 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -947,10 +947,10 @@ int sieve_interpreter_run(struct sieve_interpreter *interp,
  * Error handling
  */
 
-static inline void ATTR_FORMAT(4, 0)
+static inline void ATTR_FORMAT(3, 0)
 sieve_runtime_logv(const struct sieve_runtime_env *renv,
 		   const struct sieve_error_params *params,
-		   sieve_error_vfunc_t msg_func, const char *fmt, va_list args)
+		   const char *fmt, va_list args)
 {
 	struct sieve_error_params new_params = *params;
 
@@ -960,7 +960,7 @@ sieve_runtime_logv(const struct sieve_runtime_env *renv,
 				sieve_runtime_get_full_command_location(renv);
 		}
 
-		msg_func(renv->ehandler, params, fmt, args);
+		sieve_logv(renv->ehandler, params, fmt, args);
 	} T_END;
 }
 
@@ -968,12 +968,13 @@ void sieve_runtime_error(const struct sieve_runtime_env *renv,
 			 const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_runtime_logv(renv, &params, sieve_verror, fmt, args);
+	sieve_runtime_logv(renv, &params, fmt, args);
 	va_end(args);
 }
 
@@ -981,12 +982,13 @@ void sieve_runtime_warning(const struct sieve_runtime_env *renv,
 			   const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_WARNING,
 		.location = location,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_runtime_logv(renv, &params, sieve_vwarning, fmt, args);
+	sieve_runtime_logv(renv, &params, fmt, args);
 	va_end(args);
 }
 
@@ -994,12 +996,13 @@ void sieve_runtime_log(const struct sieve_runtime_env *renv,
 		       const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_INFO,
 		.location = location,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_runtime_logv(renv, &params, sieve_vinfo, fmt, args);
+	sieve_runtime_logv(renv, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1008,6 +1011,7 @@ void sieve_runtime_critical(const struct sieve_runtime_env *renv,
 			    const char *fmt, ...)
 {
 	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
 		.location = location,
 	};
 	va_list args;
diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c
index 30678b71cf6bbd5d73ab45cf72cfb905b1031cc0..1e38556d0507407507f56a1a2986e26645cdfad7 100644
--- a/src/lib-sieve/sieve-lexer.c
+++ b/src/lib-sieve/sieve-lexer.c
@@ -125,7 +125,7 @@ sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...)
 {
 	struct sieve_lexical_scanner *scanner = lexer->scanner;
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
@@ -135,7 +135,7 @@ sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...)
 		params.location =
 			sieve_error_script_location(scanner->script,
 						    scanner->current_line);
-		sieve_verror(scanner->ehandler, &params, fmt, args);
+		sieve_logv(scanner->ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -146,7 +146,7 @@ sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...)
 {
 	struct sieve_lexical_scanner *scanner = lexer->scanner;
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_WARNING,
 	};
 	va_list args;
 
@@ -156,7 +156,7 @@ sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...)
 		params.location =
 			sieve_error_script_location(scanner->script,
 						    scanner->current_line);
-		sieve_vwarning(scanner->ehandler, &params, fmt, args);
+		sieve_logv(scanner->ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
diff --git a/src/lib-sieve/sieve-parser.c b/src/lib-sieve/sieve-parser.c
index dfe67c550900ab74fce190aaa715b72a565a4e6b..bfe38553e0c66f916d74da547a3dd4635cd078e5 100644
--- a/src/lib-sieve/sieve-parser.c
+++ b/src/lib-sieve/sieve-parser.c
@@ -92,7 +92,7 @@ inline static void ATTR_FORMAT(2, 3)
 sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
@@ -104,7 +104,7 @@ sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...)
 			params.location = sieve_error_script_location(
 				parser->script,
 				sieve_lexer_token_line(parser->lexer));
-			sieve_verror(parser->ehandler, &params, fmt, args);
+			sieve_logv(parser->ehandler, &params, fmt, args);
 		} T_END;
 	}
 
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index 184eada5b72aefdb48bb6a39b747a6d2c60a7a1f..c5b2300415954f63534fc8209ecbc196855a2c46 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1534,12 +1534,12 @@ void sieve_result_error(const struct sieve_action_exec_env *aenv,
 			const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_verror(aenv->ehandler, &params, fmt, args);
+	sieve_logv(aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1547,12 +1547,12 @@ void sieve_result_global_error(const struct sieve_action_exec_env *aenv,
 			       const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_verror(aenv->svinst, aenv->ehandler, &params, fmt, args);
+	sieve_global_logv(aenv->svinst, aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1560,12 +1560,12 @@ void sieve_result_warning(const struct sieve_action_exec_env *aenv,
 			  const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_WARNING,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_vwarning(aenv->ehandler, &params, fmt, args);
+	sieve_logv(aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1573,12 +1573,12 @@ void sieve_result_global_warning(const struct sieve_action_exec_env *aenv,
 				 const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_WARNING,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_vwarning(aenv->svinst, aenv->ehandler, &params, fmt, args);
+	sieve_global_logv(aenv->svinst, aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1586,12 +1586,12 @@ void sieve_result_log(const struct sieve_action_exec_env *aenv,
 		      const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_INFO,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_vinfo(aenv->ehandler, &params, fmt, args);
+	sieve_logv(aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1599,12 +1599,12 @@ void sieve_result_global_log(const struct sieve_action_exec_env *aenv,
 			     const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_INFO,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_vinfo(aenv->svinst, aenv->ehandler, &params, fmt, args);
+	sieve_global_logv(aenv->svinst, aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1612,13 +1612,13 @@ void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv,
 				   const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_info_verror(aenv->svinst, aenv->ehandler, &params,
-				 fmt, args);
+	sieve_global_info_logv(aenv->svinst, aenv->ehandler, &params,
+			       fmt, args);
 	va_end(args);
 }
 
@@ -1626,25 +1626,28 @@ void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv,
 				     const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_WARNING,
 	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_info_vwarning(aenv->svinst, aenv->ehandler, &params,
-				   fmt, args);
+	sieve_global_info_logv(aenv->svinst, aenv->ehandler, &params,
+			       fmt, args);
 	va_end(args);
 }
 
 void sieve_result_critical(const struct sieve_action_exec_env *aenv,
 			   const char *user_prefix, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.log_type = LOG_TYPE_ERROR,
+	};
 	va_list args;
 
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vcritical(aenv->svinst, aenv->ehandler, NULL,
+		sieve_vcritical(aenv->svinst, aenv->ehandler, &params,
 				user_prefix, fmt, args);
 	} T_END;
 
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index cc49bb610fc72d738c4093b2dd35fb2958de717f..6f605564ada691fc5a0d12cfe64f4de0f2f53600 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -1663,7 +1663,7 @@ void sieve_validator_error(struct sieve_validator *valdtr,
 			   unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_ERROR,
 	};
 	va_list args;
 
@@ -1671,7 +1671,7 @@ void sieve_validator_error(struct sieve_validator *valdtr,
 		sieve_error_script_location(valdtr->script, source_line);
 
 	va_start(args, fmt);
-	sieve_verror(valdtr->ehandler, &params, fmt, args);
+	sieve_logv(valdtr->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
@@ -1679,7 +1679,7 @@ void sieve_validator_warning(struct sieve_validator *valdtr,
 			     unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
-		.location = NULL,
+		.log_type = LOG_TYPE_WARNING,
 	};
 	va_list args;
 
@@ -1687,7 +1687,7 @@ void sieve_validator_warning(struct sieve_validator *valdtr,
 		sieve_error_script_location(valdtr->script, source_line);
 
 	va_start(args, fmt);
-	sieve_vwarning(valdtr->ehandler, &params, fmt, args);
+	sieve_logv(valdtr->ehandler, &params, fmt, args);
 	va_end(args);
 
 }
diff --git a/src/plugins/lda-sieve/lda-sieve-log.c b/src/plugins/lda-sieve/lda-sieve-log.c
index 98669a81d299ced82ce2afcbe1ae8059326e570a..2b256a0865ceca360964b8cf98add9794e9955c9 100644
--- a/src/plugins/lda-sieve/lda-sieve-log.c
+++ b/src/plugins/lda-sieve/lda-sieve-log.c
@@ -41,43 +41,13 @@ lda_sieve_log_expand_message(struct sieve_error_handler *_ehandler,
 }
 
 static void ATTR_FORMAT(4, 0)
-lda_sieve_log_verror(struct sieve_error_handler *ehandler,
-		     const struct sieve_error_params *params,
-		     unsigned int flags, const char *fmt, va_list args)
+lda_sieve_logv(struct sieve_error_handler *ehandler,
+	       const struct sieve_error_params *params,
+	       enum sieve_error_flags flags, const char *fmt, va_list args)
 {
-	sieve_direct_error(ehandler->svinst, ehandler->parent,
-			   params, flags, "%s",
-			   lda_sieve_log_expand_message(ehandler, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-lda_sieve_log_vwarning(struct sieve_error_handler *ehandler,
-		       const struct sieve_error_params *params,
-		       unsigned int flags, const char *fmt, va_list args)
-{
-	sieve_direct_warning(ehandler->svinst, ehandler->parent,
-			     params, flags, "%s",
-			     lda_sieve_log_expand_message(ehandler, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-lda_sieve_log_vinfo(struct sieve_error_handler *ehandler,
-		    const struct sieve_error_params *params,
-		    unsigned int flags, const char *fmt, va_list args)
-{
-	sieve_direct_info(ehandler->svinst, ehandler->parent,
-			  params, flags, "%s",
-			  lda_sieve_log_expand_message(ehandler, fmt, args));
-}
-
-static void ATTR_FORMAT(4, 0)
-lda_sieve_log_vdebug(struct sieve_error_handler *ehandler,
-		     const struct sieve_error_params *params,
-		     unsigned int flags, const char *fmt, va_list args)
-{
-	sieve_direct_debug(ehandler->svinst, ehandler->parent,
-			   params, flags, "%s",
-			   lda_sieve_log_expand_message(ehandler, fmt, args));
+	sieve_direct_log(ehandler->svinst, ehandler->parent,
+			 params, flags, "%s",
+			 lda_sieve_log_expand_message(ehandler, fmt, args));
 }
 
 struct sieve_error_handler *
@@ -95,11 +65,7 @@ lda_sieve_log_ehandler_create(struct sieve_error_handler *parent,
 	sieve_error_handler_init_from_parent(&ehandler->handler, pool, parent);
 
 	ehandler->mdctx = mdctx;
-
-	ehandler->handler.verror = lda_sieve_log_verror;
-	ehandler->handler.vwarning = lda_sieve_log_vwarning;
-	ehandler->handler.vinfo = lda_sieve_log_vinfo;
-	ehandler->handler.vdebug = lda_sieve_log_vdebug;
+	ehandler->handler.logv = lda_sieve_logv;
 
 	return &(ehandler->handler);
 }
diff --git a/src/testsuite/testsuite-log.c b/src/testsuite/testsuite-log.c
index 84ca4c55bcbc7c332fc747805291676cde34fd29..2cecda65315ba48b4dc1407cc42cbc2cb102d3cd 100644
--- a/src/testsuite/testsuite-log.c
+++ b/src/testsuite/testsuite-log.c
@@ -56,28 +56,63 @@ _testsuite_stdout_vlog(const struct sieve_error_params *params,
 }
 
 static void ATTR_FORMAT(4, 0)
-_testsuite_log_verror(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      const struct sieve_error_params *params,
-		      unsigned int flags ATTR_UNUSED,
-		      const char *fmt, va_list args)
+_testsuite_logv(struct sieve_error_handler *ehandler ATTR_UNUSED,
+		const struct sieve_error_params *params,
+		enum sieve_error_flags flags ATTR_UNUSED,
+		const char *fmt, va_list args)
 {
 	pool_t pool = _testsuite_logmsg_pool;
 	struct _testsuite_log_message msg;
+	const char *prefix;
 
-	_testsuite_stdout_vlog(params, "error", fmt, args);
+	switch (params->log_type) {
+	case LOG_TYPE_ERROR:
+		prefix = "error";
+		break;
+	case LOG_TYPE_WARNING:
+		prefix = "warning";
+		break;
+	case LOG_TYPE_INFO:
+		prefix = "info";
+		break;
+	case LOG_TYPE_DEBUG:
+		prefix = "debug";
+		break;
+	default:
+		i_unreached();
+	}
+
+	_testsuite_stdout_vlog(params, prefix, fmt, args);
 
 	msg.location = p_strdup(pool, params->location);
 	msg.message = p_strdup_vprintf(pool, fmt, args);
 
-	array_append(&_testsuite_log_errors, &msg, 1);
+	switch (params->log_type) {
+	case LOG_TYPE_ERROR:
+		array_append(&_testsuite_log_errors, &msg, 1);
+		break;
+	case LOG_TYPE_WARNING:
+		array_append(&_testsuite_log_warnings, &msg, 1);
+		break;
+	case LOG_TYPE_INFO:
+		array_append(&_testsuite_log_messages, &msg, 1);
+		break;
+	case LOG_TYPE_DEBUG:
+		break;
+	default:
+		i_unreached();
+	}
 }
 
 static void ATTR_FORMAT(4, 0)
-_testsuite_log_main_verror(struct sieve_error_handler *ehandler ATTR_UNUSED,
-			   const struct sieve_error_params *params,
-			   unsigned int flags ATTR_UNUSED,
-			   const char *fmt, va_list args)
+_testsuite_main_logv(struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
+		     enum sieve_error_flags flags,
+		     const char *fmt, va_list args)
 {
+	if (params->log_type != LOG_TYPE_ERROR)
+		return _testsuite_logv(ehandler, params, flags, fmt, args);
+
 	if (params->location == NULL || *params->location == '\0') {
 		fprintf(stderr, "error: %s\n",
 			t_strdup_vprintf(fmt, args));
@@ -87,49 +122,6 @@ _testsuite_log_main_verror(struct sieve_error_handler *ehandler ATTR_UNUSED,
 	}
 }
 
-static void ATTR_FORMAT(4, 0)
-_testsuite_log_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED,
-			const struct sieve_error_params *params,
-			unsigned int flags ATTR_UNUSED,
-			const char *fmt, va_list args)
-{
-	pool_t pool = _testsuite_logmsg_pool;
-	struct _testsuite_log_message msg;
-
-	_testsuite_stdout_vlog(params, "warning", fmt, args);
-
-	msg.location = p_strdup(pool, params->location);
-	msg.message = p_strdup_vprintf(pool, fmt, args);
-
-	array_append(&_testsuite_log_warnings, &msg, 1);
-}
-
-static void ATTR_FORMAT(4, 0)
-_testsuite_log_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		     const struct sieve_error_params *params,
-		     unsigned int flags ATTR_UNUSED,
-		     const char *fmt, va_list args)
-{
-	pool_t pool = _testsuite_logmsg_pool;
-	struct _testsuite_log_message msg;
-
-	_testsuite_stdout_vlog(params, "info", fmt, args);
-
-	msg.location = p_strdup(pool, params->location);
-	msg.message = p_strdup_vprintf(pool, fmt, args);
-
-	array_append(&_testsuite_log_messages, &msg, 1);
-}
-
-static void ATTR_FORMAT(4, 0)
-_testsuite_log_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      const struct sieve_error_params *params,
-		      unsigned int flags ATTR_UNUSED,
-		      const char *fmt, va_list args)
-{
-	_testsuite_stdout_vlog(params, "debug", fmt, args);
-}
-
 static struct sieve_error_handler *_testsuite_log_ehandler_create(void)
 {
 	pool_t pool;
@@ -140,10 +132,7 @@ static struct sieve_error_handler *_testsuite_log_ehandler_create(void)
 	ehandler = p_new(pool, struct sieve_error_handler, 1);
 	sieve_error_handler_init(ehandler, testsuite_sieve_instance, pool, 0);
 
-	ehandler->verror = _testsuite_log_verror;
-	ehandler->vwarning = _testsuite_log_vwarning;
-	ehandler->vinfo = _testsuite_log_vinfo;
-	ehandler->vdebug = _testsuite_log_vdebug;
+	ehandler->logv = _testsuite_logv;
 
 	return ehandler;
 }
@@ -158,10 +147,7 @@ static struct sieve_error_handler *_testsuite_log_main_ehandler_create(void)
 	ehandler = p_new(pool, struct sieve_error_handler, 1);
 	sieve_error_handler_init(ehandler, testsuite_sieve_instance, pool, 0);
 
-	ehandler->verror = _testsuite_log_main_verror;
-	ehandler->vwarning = _testsuite_log_vwarning;
-	ehandler->vinfo = _testsuite_log_vinfo;
-	ehandler->vdebug = _testsuite_log_vdebug;
+	ehandler->logv = _testsuite_main_logv;
 
 	return ehandler;
 }