diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
index 15ffd9355e31c274671ba2b8d3f532d7def1305e..ae1f90f4e67ad5f76d962f38add8caae8bc4e57d 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-activate.c
@@ -21,6 +21,7 @@ static int cmd_sieve_activate_run(struct doveadm_sieve_cmd_context *_ctx)
 	struct doveadm_sieve_activate_cmd_context *ctx =
 		container_of(_ctx, struct doveadm_sieve_activate_cmd_context,
 			     ctx);
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_storage *storage = _ctx->storage;
 	struct sieve_script *script;
 	enum sieve_error error;
@@ -28,7 +29,7 @@ static int cmd_sieve_activate_run(struct doveadm_sieve_cmd_context *_ctx)
 
 	script = sieve_storage_open_script(storage, ctx->scriptname, NULL);
 	if (script == NULL) {
-		i_error("Failed to activate Sieve script: %s",
+		e_error(event, "Failed to activate Sieve script: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		return -1;
@@ -64,7 +65,7 @@ static int cmd_sieve_activate_run(struct doveadm_sieve_cmd_context *_ctx)
 		 */
 		ret = sieve_script_activate(script, (time_t)-1);
 		if (ret < 0) {
-			i_error("Failed to activate Sieve script: %s",
+			e_error(event, "Failed to activate Sieve script: %s",
 				sieve_storage_get_last_error(storage, &error));
 			doveadm_sieve_cmd_failed_error(_ctx, error);
 			ret = -1;
@@ -77,11 +78,12 @@ static int cmd_sieve_activate_run(struct doveadm_sieve_cmd_context *_ctx)
 
 static int cmd_sieve_deactivate_run(struct doveadm_sieve_cmd_context *_ctx)
 {
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_storage *storage = _ctx->storage;
 	enum sieve_error error;
 
 	if (sieve_storage_deactivate(storage, (time_t)-1) < 0) {
-		i_error("Failed to deactivate Sieve script: %s",
+		e_error(event, "Failed to deactivate Sieve script: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		return -1;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
index eea67a0a7534017d60317df50511238e63f93388..da82aabede4d4e7bbaaf6951116375ea1664193b 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
@@ -23,6 +23,7 @@ static int cmd_sieve_delete_run(struct doveadm_sieve_cmd_context *_ctx)
 	struct doveadm_sieve_delete_cmd_context *ctx =
 		container_of(_ctx, struct doveadm_sieve_delete_cmd_context,
 			     ctx);
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_storage *storage = _ctx->storage;
 	const ARRAY_TYPE(const_string) *scriptnames = &ctx->scriptnames;
 	const char *scriptname;
@@ -47,7 +48,7 @@ static int cmd_sieve_delete_run(struct doveadm_sieve_cmd_context *_ctx)
 		}
 
 		if (sret < 0) {
-			i_error("Failed to delete Sieve script: %s",
+			e_error(event, "Failed to delete Sieve script: %s",
 				sieve_storage_get_last_error(storage, &error));
 			doveadm_sieve_cmd_failed_error(_ctx, error);
 			ret = -1;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
index 711e697dbd8aa81cd8847349a605a952822d294f..129c0a52b6ac7bef6220c96bddb55e35dd0ca0c4 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-get.c
@@ -21,6 +21,7 @@ static int cmd_sieve_get_run(struct doveadm_sieve_cmd_context *_ctx)
 {
 	struct doveadm_sieve_get_cmd_context *ctx =
 		container_of(_ctx, struct doveadm_sieve_get_cmd_context, ctx);
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_script *script;
 	struct istream *input;
 	enum sieve_error error;
@@ -30,7 +31,7 @@ static int cmd_sieve_get_run(struct doveadm_sieve_cmd_context *_ctx)
 					  &error);
 	if (script == NULL ||
 	    sieve_script_get_stream(script, &input, &error) < 0 ) {
-		i_error("Failed to open Sieve script: %s",
+		e_error(event, "Failed to open Sieve script: %s",
 			sieve_storage_get_last_error(_ctx->storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		if (script != NULL)
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
index 1b2224aa9e62d381b989001494729ad30edc41ca..79adf80bfd6eb3eededaa3dd854aadcfefc9f4d5 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
@@ -12,6 +12,7 @@
 
 static int cmd_sieve_list_run(struct doveadm_sieve_cmd_context *_ctx)
 {
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_storage *storage = _ctx->storage;
 	struct sieve_storage_list_context *lctx;
 	enum sieve_error error;
@@ -20,7 +21,7 @@ static int cmd_sieve_list_run(struct doveadm_sieve_cmd_context *_ctx)
 
 	lctx = sieve_storage_list_init(storage);
 	if (lctx == NULL) {
-		i_error("Listing Sieve scripts failed: %s",
+		e_error(event, "Listing Sieve scripts failed: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		return -1;
@@ -35,7 +36,7 @@ static int cmd_sieve_list_run(struct doveadm_sieve_cmd_context *_ctx)
 	}
 
 	if (sieve_storage_list_deinit(&lctx) < 0) {
-		i_error("Listing Sieve scripts failed: %s",
+		e_error(event, "Listing Sieve scripts failed: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		return -1;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
index 2bd1bbeb1ce464c32ee756c3f532ac7b4ff535e0..35fed10716d79bda678551e1812cf923895616f1 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-put.c
@@ -23,6 +23,7 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 {
 	struct doveadm_sieve_put_cmd_context *ctx =
 		container_of(_ctx, struct doveadm_sieve_put_cmd_context, ctx);
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_storage_save_context *save_ctx;
 	struct sieve_storage *storage = _ctx->storage;
 	struct istream *input = _ctx->ctx.cmd_input;
@@ -32,7 +33,7 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 
 	save_ctx = sieve_storage_save_init(storage, ctx->scriptname, input);
 	if (save_ctx == NULL) {
-		i_error("Saving failed: %s",
+		e_error(event, "Saving failed: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		return -1;
@@ -48,16 +49,16 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 	i_assert(ret == -1);
 
 	if (input->stream_errno != 0) {
-		i_error("read(script input) failed: %s",
+		e_error(event, "read(script input) failed: %s",
 			i_stream_get_error(input));
 		doveadm_sieve_cmd_failed_error(&ctx->ctx,
 					       SIEVE_ERROR_TEMP_FAILURE);
 	} else if (save_failed) {
-		i_error("Saving failed: %s",
+		e_error(event, "Saving failed: %s",
 			sieve_storage_get_last_error(storage, NULL));
 		doveadm_sieve_cmd_failed_storage(&ctx->ctx, storage);
 	} else if (sieve_storage_save_finish(save_ctx) < 0) {
-		i_error("Saving failed: %s",
+		e_error(event, "Saving failed: %s",
 			sieve_storage_get_last_error(storage, NULL));
 		doveadm_sieve_cmd_failed_storage(&ctx->ctx, storage);
 	} else {
@@ -78,7 +79,7 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 
 		/* Check result */
 		if (script == NULL) {
-			i_error("Saving failed: %s",
+			e_error(event, "Saving failed: %s",
 				sieve_storage_get_last_error(storage, &error));
 			doveadm_sieve_cmd_failed_error(_ctx, error);
 			ret = -1;
@@ -105,7 +106,7 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 				/* Script is valid; commit it to storage */
 				ret = sieve_storage_save_commit(&save_ctx);
 				if (ret < 0) {
-					i_error("Saving failed: %s",
+					e_error(event, "Saving failed: %s",
 						sieve_storage_get_last_error(
 							storage, &error));
 					doveadm_sieve_cmd_failed_error(
@@ -126,7 +127,7 @@ static int cmd_sieve_put_run(struct doveadm_sieve_cmd_context *_ctx)
 						  NULL);
 		if (script == NULL ||
 		    sieve_script_activate(script, (time_t)-1) < 0) {
-			i_error("Failed to activate Sieve script: %s",
+			e_error(event, "Failed to activate Sieve script: %s",
 				sieve_storage_get_last_error(storage, &error));
 			doveadm_sieve_cmd_failed_error(_ctx, error);
 			ret = -1;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c
index d3fce4dcee926d1dfbc20debf0000fd06b2825a1..238635917015b4877af9e47c1d761516020752b7 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-rename.c
@@ -21,6 +21,7 @@ static int cmd_sieve_rename_run(struct doveadm_sieve_cmd_context *_ctx)
 	struct doveadm_sieve_rename_cmd_context *ctx =
 		container_of(_ctx, struct doveadm_sieve_rename_cmd_context,
 			     ctx);
+	struct event *event = _ctx->ctx.cctx->event;
 	struct sieve_storage *storage = _ctx->storage;
 	struct sieve_script *script;
 	enum sieve_error error;
@@ -28,12 +29,12 @@ static int cmd_sieve_rename_run(struct doveadm_sieve_cmd_context *_ctx)
 
 	script = sieve_storage_open_script(storage, ctx->oldname, NULL);
 	if (script == NULL) {
-		i_error("Failed to rename Sieve script: %s",
+		e_error(event, "Failed to rename Sieve script: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		ret = -1;
 	} else if (sieve_script_rename(script, ctx->newname) < 0) {
-		i_error("Failed to rename Sieve script: %s",
+		e_error(event, "Failed to rename Sieve script: %s",
 			sieve_storage_get_last_error(storage, &error));
 		doveadm_sieve_cmd_failed_error(_ctx, error);
 		ret = -1;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
index b4a7d6aa58b659b466f56bf67a0f2aac9d591f98..662c977a34f3f8a3824c332383b560f2e3e778de 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c
@@ -100,6 +100,7 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx,
 {
 	struct doveadm_sieve_cmd_context *ctx =
 		container_of(_ctx, struct doveadm_sieve_cmd_context, ctx);
+	struct event *event = _ctx->cctx->event;
 
 	struct sieve_environment svenv;
 	enum sieve_error error;
@@ -120,15 +121,15 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx,
 		switch (error) {
 		case SIEVE_ERROR_NOT_POSSIBLE:
 			error = SIEVE_ERROR_NOT_FOUND;
-			i_error("Failed to open Sieve storage: "
+			e_error(event, "Failed to open Sieve storage: "
 				"Sieve is disabled for this user");
 			break;
 		case SIEVE_ERROR_NOT_FOUND:
-			i_error("Failed to open Sieve storage: "
+			e_error(event, "Failed to open Sieve storage: "
 				"User cannot manage personal Sieve scripts.");
 			break;
 		default:
-			i_error("Failed to open Sieve storage.");
+			e_error(event, "Failed to open Sieve storage.");
 		}
 		doveadm_sieve_cmd_failed_error(ctx, error);
 		ret =  -1;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index 78421f829c3779eb2acf20ba3d9592ba3641af50..eab140447c7e6867f22efe52a7456e4bfce921cf 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -22,6 +22,7 @@
 
 struct sieve_mail_user {
 	union mail_user_module_context module_ctx;
+	struct event *event;
 
 	struct sieve_instance *svinst;
 	struct sieve_storage *sieve_storage;
@@ -66,6 +67,7 @@ static void mail_sieve_user_deinit(struct mail_user *user)
 		sieve_deinit(&suser->svinst);
 	}
 
+	event_unref(&suser->event);
 	suser->module_ctx.super.deinit(user);
 }
 
@@ -376,6 +378,7 @@ sieve_attribute_set(struct mailbox_transaction_context *t,
 		    const struct mail_attribute_value *value)
 {
 	struct mail_user *user = t->box->storage->user;
+	struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user);
 	union mailbox_module_context *sbox = SIEVE_MAIL_CONTEXT(t->box);
 
 	if (t->box->storage->user->dsyncing &&
@@ -383,24 +386,22 @@ sieve_attribute_set(struct mailbox_transaction_context *t,
 	    str_begins_with(key, MAILBOX_ATTRIBUTE_PREFIX_SIEVE)) {
 		time_t ts = (value->last_change != 0 ?
 			     value->last_change : ioloop_time);
+		const char *change;
 
 		if (sieve_attribute_set_sieve(t->box->storage, key, value) < 0)
 			return -1;
-
-		if (user->mail_debug) {
-			const char *change;
-			if (value->last_change != 0) {
-				change = t_strflocaltime(
-					"(last change: %Y-%m-%d %H:%M:%S)",
-					value->last_change);
-			} else {
-				change = t_strflocaltime(
-					"(time: %Y-%m-%d %H:%M:%S)",
-					ioloop_time);
-			}
-			i_debug("doveadm-sieve: Assigned value for key `%s' %s",
-				key, change);
+		
+		if (value->last_change != 0) {
+			change = t_strflocaltime(
+				"(last change: %Y-%m-%d %H:%M:%S)",
+				value->last_change);
+		} else {
+			change = t_strflocaltime(
+				"(time: %Y-%m-%d %H:%M:%S)",
+				ioloop_time);
 		}
+		e_debug(suser->event, "Assigned value for key `%s' %s",
+			key, change);
 
 		/* FIXME: set value len to sieve script size / active name
 		   length */
@@ -564,13 +565,14 @@ sieve_attribute_get(struct mailbox *box,
 {
 	union mailbox_module_context *sbox = SIEVE_MAIL_CONTEXT(box);
 	struct mail_user *user = box->storage->user;
+	struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user);
 	int ret;
 
 	if (box->storage->user->dsyncing &&
 	    type == MAIL_ATTRIBUTE_TYPE_PRIVATE &&
 	    str_begins_with(key, MAILBOX_ATTRIBUTE_PREFIX_SIEVE)) {
 		ret = sieve_attribute_get_sieve(box->storage, key, value_r);
-		if (ret >= 0 && user->mail_debug) {
+		if (ret >= 0) {
 			struct tm *tm = localtime(&value_r->last_change);
 			char str[256];
 			const char *timestamp = "";
@@ -581,11 +583,11 @@ sieve_attribute_get(struct mailbox *box,
 				timestamp = str;
 
 			if (ret > 0) {
-				i_debug("doveadm-sieve: "
+				e_debug(user->event,
 					"Retrieved value for key `%s'%s",
 					key, timestamp);
 			} else {
-				i_debug("doveadm-sieve: "
+				e_debug(suser->event,
 					"Value missing for key `%s'%s",
 					key, timestamp);
 			}
@@ -599,11 +601,11 @@ static int
 sieve_attribute_iter_script_init(struct sieve_mailbox_attribute_iter *siter)
 {
 	struct mail_user *user = siter->iter.box->storage->user;
+	struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user);
 	struct sieve_storage *svstorage;
 	int ret;
 
-	if (user->mail_debug)
-		i_debug("doveadm-sieve: Iterating Sieve mailbox attributes");
+	e_debug(suser->event, "Iterating Sieve mailbox attributes");
 
 	ret = mail_sieve_user_init(user, &svstorage);
 	if (ret <= 0)
@@ -698,16 +700,14 @@ sieve_attribute_iter_next(struct mailbox_attribute_iter *iter)
 		(struct sieve_mailbox_attribute_iter *)iter;
 	union mailbox_module_context *sbox = SIEVE_MAIL_CONTEXT(iter->box);
 	struct mail_user *user = iter->box->storage->user;
+	struct sieve_mail_user *suser = SIEVE_USER_CONTEXT(user);
 	const char *key;
 
 	if (siter->sieve_list != NULL) {
 		key = sieve_attribute_iter_next_script(siter);
 		if (key != NULL) {
-			if (user->mail_debug) {
-				i_debug("doveadm-sieve: "
-					"Iterating Sieve mailbox attribute: %s",
-					key);
-			}
+			e_debug(suser->event,
+				"Iterating Sieve mailbox attribute: %s", key);
 			return key;
 		}
 	}
@@ -743,6 +743,9 @@ static void sieve_mail_user_created(struct mail_user *user)
 	user->vlast = &suser->module_ctx.super;
 	v->deinit = mail_sieve_user_deinit;
 	MODULE_CONTEXT_SET(user, sieve_user_module, suser);
+
+	suser->event = event_create(user->event);
+	event_set_append_log_prefix(suser->event, "doveadm-sieve: ");
 }
 
 static void sieve_mailbox_allocated(struct mailbox *box)