diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index eb9737c7229bd9f89ca4abf06825ec9bf1523d8b..cecbdec5caa59a8436dfdece7d66ea7c14855148 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -173,12 +173,16 @@ void sieve_global_info_logv(struct sieve_instance *svinst,
 			   SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args);
 }
 
+#undef sieve_global_error
 void sieve_global_error(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
+			const char *csrc_filename, unsigned int csrc_linenum,
 			const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -191,12 +195,16 @@ void sieve_global_error(struct sieve_instance *svinst,
 	va_end(args);
 }
 
+#undef sieve_global_warning
 void sieve_global_warning(struct sieve_instance *svinst,
 			  struct sieve_error_handler *ehandler,
+			  const char *csrc_filename, unsigned int csrc_linenum,
 			  const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -209,12 +217,16 @@ void sieve_global_warning(struct sieve_instance *svinst,
 	va_end(args);
 }
 
+#undef sieve_global_info
 void sieve_global_info(struct sieve_instance *svinst,
 		       struct sieve_error_handler *ehandler,
+		       const char *csrc_filename, unsigned int csrc_linenum,
 		       const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_INFO,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -227,12 +239,17 @@ void sieve_global_info(struct sieve_instance *svinst,
 	va_end(args);
 }
 
+#undef sieve_global_info_error
 void sieve_global_info_error(struct sieve_instance *svinst,
 			     struct sieve_error_handler *ehandler,
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
 			     const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -245,12 +262,17 @@ void sieve_global_info_error(struct sieve_instance *svinst,
 	va_end(args);
 }
 
+#undef sieve_global_info_warning
 void sieve_global_info_warning(struct sieve_instance *svinst,
 			       struct sieve_error_handler *ehandler,
+			       const char *csrc_filename,
+			       unsigned int csrc_linenum,
 			       const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -267,11 +289,15 @@ void sieve_global_info_warning(struct sieve_instance *svinst,
  * Default (user) error functions
  */
 
+#undef sieve_internal_error
 void sieve_internal_error(struct sieve_error_handler *ehandler,
+			  const char *csrc_filename, unsigned int csrc_linenum,
 			  const char *location, const char *user_prefix)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	char str[256];
@@ -314,14 +340,20 @@ void sieve_criticalv(struct sieve_instance *svinst,
 
 	sieve_direct_logv(svinst, svinst->system_ehandler, &new_params, 0,
 			  fmt, args);
-	sieve_internal_error(ehandler, params->location, user_prefix);
+	sieve_internal_error(ehandler,
+			     params->csrc.filename, params->csrc.linenum,
+			     params->location, user_prefix);
 }
 
-void sieve_error(struct sieve_error_handler *ehandler, const char *location,
-		 const char *fmt, ...)
+#undef sieve_error
+void sieve_error(struct sieve_error_handler *ehandler,
+		 const char *csrc_filename, unsigned int csrc_linenum,
+		 const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -334,11 +366,15 @@ void sieve_error(struct sieve_error_handler *ehandler, const char *location,
 	va_end(args);
 }
 
-void sieve_warning(struct sieve_error_handler *ehandler, const char *location,
-		   const char *fmt, ...)
+#undef sieve_warning
+void sieve_warning(struct sieve_error_handler *ehandler,
+		   const char *csrc_filename, unsigned int csrc_linenum,
+		   const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -351,11 +387,15 @@ void sieve_warning(struct sieve_error_handler *ehandler, const char *location,
 	va_end(args);
 }
 
-void sieve_info(struct sieve_error_handler *ehandler, const char *location,
-		const char *fmt, ...)
+#undef sieve_info
+void sieve_info(struct sieve_error_handler *ehandler,
+		const char *csrc_filename, unsigned int csrc_linenum,
+		const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_INFO,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -368,11 +408,15 @@ void sieve_info(struct sieve_error_handler *ehandler, const char *location,
 	va_end(args);
 }
 
-void sieve_debug(struct sieve_error_handler *ehandler, const char *location,
-		 const char *fmt, ...)
+#undef sieve_debug
+void sieve_debug(struct sieve_error_handler *ehandler,
+		 const char *csrc_filename, unsigned int csrc_linenum,
+		 const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_DEBUG,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -385,12 +429,17 @@ void sieve_debug(struct sieve_error_handler *ehandler, const char *location,
 	va_end(args);
 }
 
+#undef sieve_critical
 void sieve_critical(struct sieve_instance *svinst,
-		    struct sieve_error_handler *ehandler, const char *location,
-		    const char *user_prefix, const char *fmt, ...)
+		    struct sieve_error_handler *ehandler,
+		    const char *csrc_filename, unsigned int csrc_linenum,
+		    const char *location, const char *user_prefix,
+		    const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -786,13 +835,16 @@ sieve_logfile_vprintf(struct sieve_logfile_ehandler *ehandler,
 	}
 }
 
-inline static void ATTR_FORMAT(4, 5)
+inline static void ATTR_FORMAT(6, 7)
 sieve_logfile_printf(struct sieve_logfile_ehandler *ehandler,
+		     const char *csrc_filename, unsigned int csrc_linenum,
 		     const char *location, const char *prefix,
 		     const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_INFO,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -921,7 +973,8 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler)
 		tm = localtime(&now);
 
 		if (strftime(buf, sizeof(buf), "%b %d %H:%M:%S", tm) > 0) {
-			sieve_logfile_printf(ehandler, "sieve", "info",
+			sieve_logfile_printf(ehandler, __FILE__, __LINE__,
+					     "sieve", "info",
 					     "started log at %s", buf);
 		}
 	}
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index 9b6e988f4e31b59b9d18856e92fcb1e67d16d047..564b704406952f711ea229d69dc2b64de865cb3e 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -23,6 +23,12 @@ struct sieve_error_handler;
 struct sieve_error_params {
 	enum log_type log_type;
 
+	/* Location log command in C source code */
+	struct {
+		const char *filename;
+		unsigned int linenum;
+	} csrc;
+
 	/* Location in Sieve source script */
 	const char *location;
 };
@@ -50,24 +56,46 @@ void sieve_global_info_logv(struct sieve_instance *svinst,
 
 void sieve_global_error(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
+			const char *csrc_filename,
+			unsigned int csrc_linenum,
 			const char *location, const char *fmt, ...)
-			ATTR_FORMAT(4, 5);
+			ATTR_FORMAT(6, 7);
+#define sieve_global_error(svinst, ehandler, ...) \
+	sieve_global_error(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_global_warning(struct sieve_instance *svinst,
 			  struct sieve_error_handler *ehandler,
+			  const char *csrc_filename,
+			  unsigned int csrc_linenum,
 			  const char *location, const char *fmt, ...)
-			  ATTR_FORMAT(4, 5);
+			  ATTR_FORMAT(6, 7);
+#define sieve_global_warning(svinst, ehandler, ...) \
+	sieve_global_warning(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_global_info(struct sieve_instance *svinst,
 		       struct sieve_error_handler *ehandler,
+		       const char *csrc_filename,
+		       unsigned int csrc_linenum,
 		       const char *location, const char *fmt, ...)
-		       ATTR_FORMAT(4, 5);
+		       ATTR_FORMAT(6, 7);
+#define sieve_global_info(svinst, ehandler, ...) \
+	sieve_global_info(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_global_info_error(struct sieve_instance *svinst,
 			     struct sieve_error_handler *ehandler,
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
 			     const char *location, const char *fmt, ...)
-			     ATTR_FORMAT(4, 5);
+			     ATTR_FORMAT(6, 7);
+#define sieve_global_info_error(svinst, ehandler, ...) \
+	sieve_global_info_error(svinst, ehandler, __FILE__, __LINE__, \
+				__VA_ARGS__)
 void sieve_global_info_warning(struct sieve_instance *svinst,
 			       struct sieve_error_handler *ehandler,
+			       const char *csrc_filename,
+			       unsigned int csrc_linenum,
 			       const char *location, const char *fmt, ...)
-			       ATTR_FORMAT(4, 5);
+			       ATTR_FORMAT(6, 7);
+#define sieve_global_info_warning(svinst, ehandler, ...) \
+	sieve_global_info_warning(svinst, ehandler, __FILE__, __LINE__, \
+				  __VA_ARGS__)
 
 /*
  * Main (user) error functions
@@ -91,22 +119,41 @@ void sieve_criticalv(struct sieve_instance *svinst,
 		     ATTR_FORMAT(5, 0);
 
 void sieve_error(struct sieve_error_handler *ehandler,
-		 const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4);
+		 const char *csrc_filename, unsigned int csrc_linenum,
+		 const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_error(ehandler, ...) \
+	sieve_error(ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_warning(struct sieve_error_handler *ehandler,
+		   const char *csrc_filename, unsigned int csrc_linenum,
 		   const char *location, const char *fmt, ...)
-		   ATTR_FORMAT(3, 4);
+		   ATTR_FORMAT(5, 6);
+#define sieve_warning(ehandler, ...) \
+	sieve_warning(ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_info(struct sieve_error_handler *ehandler,
-		const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4);
+		const char *csrc_filename, unsigned int csrc_linenum,
+		const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_info(ehandler, ...) \
+	sieve_info(ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_debug(struct sieve_error_handler *ehandler,
-		 const char *location, const char *fmt, ...) ATTR_FORMAT(3, 4);
+		 const char *csrc_filename, unsigned int csrc_linenum,
+		 const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_debug(ehandler, ...) \
+	sieve_debug(ehandler, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_critical(struct sieve_instance *svinst,
-		    struct sieve_error_handler *ehandler, const char *location,
-		    const char *user_prefix, const char *fmt, ...)
-		    ATTR_FORMAT(5, 6);
+		    struct sieve_error_handler *ehandler,
+		    const char *csrc_filename, unsigned int csrc_linenum,
+		    const char *location, const char *user_prefix,
+		    const char *fmt, ...) ATTR_FORMAT(7, 8);
+#define sieve_critical(svinst, ehandler, ...) \
+	sieve_critical(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
+
 
 void sieve_internal_error(struct sieve_error_handler *ehandler,
+			  const char *csrc_filename, unsigned int csrc_linenum,
 			  const char *location, const char *user_prefix)
-			  ATTR_NULL(1, 2, 3);
+			  ATTR_NULL(1, 4, 5);
+#define sieve_internal_error(ehandler, ...) \
+	sieve_internal_error(ehandler, __FILE__, __LINE__, __VA_ARGS__)
 
 /*
  * Error handler configuration
diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c
index 00f4989beb8f27d9b12bdc7e91db5f69cbe2a3ee..ae47067b80535e7d24bfaf8ff10cf71a7c088fb9 100644
--- a/src/lib-sieve/sieve-generator.c
+++ b/src/lib-sieve/sieve-generator.c
@@ -510,11 +510,15 @@ sieve_generator_run(struct sieve_generator *gentr,
  * Error handling
  */
 
+#undef sieve_generator_error
 void sieve_generator_error(struct sieve_generator *gentr,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -526,11 +530,16 @@ void sieve_generator_error(struct sieve_generator *gentr,
 	va_end(args);
 }
 
+#undef sieve_generator_warning
 void sieve_generator_warning(struct sieve_generator *gentr,
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
 			     unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -542,11 +551,16 @@ void sieve_generator_warning(struct sieve_generator *gentr,
 	va_end(args);
 }
 
+#undef sieve_generator_critical
 void sieve_generator_critical(struct sieve_generator *gentr,
+			      const char *csrc_filename,
+			      unsigned int csrc_linenum,
 			      unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
diff --git a/src/lib-sieve/sieve-generator.h b/src/lib-sieve/sieve-generator.h
index c31823cbad07df361961433554a73670a9ef2435..fab2023ba15b2a6ea76d075e6d39b84136ea8115 100644
--- a/src/lib-sieve/sieve-generator.h
+++ b/src/lib-sieve/sieve-generator.h
@@ -97,14 +97,25 @@ sieve_generator_run(struct sieve_generator *gentr,
  */
 
 void sieve_generator_error(struct sieve_generator *gentr,
-			   unsigned int source_line,
-			   const char *fmt, ...) ATTR_FORMAT(3, 4);
+			   const char *csrc_filename, unsigned int csrc_linenum,
+			   unsigned int source_line, const char *fmt, ...)
+			   ATTR_FORMAT(5, 6);
+#define sieve_generator_error(gentr, ...) \
+	sieve_generator_error(gentr, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_generator_warning(struct sieve_generator *gentr,
-			     unsigned int source_line,
-			     const char *fmt, ...) ATTR_FORMAT(3, 4);
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
+			     unsigned int source_line, const char *fmt, ...)
+			     ATTR_FORMAT(5, 6);
+#define sieve_generator_warning(gentr, ...) \
+	sieve_generator_warning(gentr, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_generator_critical(struct sieve_generator *gentr,
-			      unsigned int source_line,
-			      const char *fmt, ...) ATTR_FORMAT(3, 4);
+			      const char *csrc_filename,
+			      unsigned int csrc_linenum,
+			      unsigned int source_line, const char *fmt, ...)
+			      ATTR_FORMAT(5, 6);
+#define sieve_generator_critical(gentr, ...) \
+	sieve_generator_critical(gentr, __FILE__, __LINE__, __VA_ARGS__)
 
 #endif
 
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 36df8c242d7179c72eaf2d731a542fadb4dd3b31..67a70351598c30e6a94fd73038d9c76d8dfd84f3 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -964,11 +964,15 @@ sieve_runtime_logv(const struct sieve_runtime_env *renv,
 	} T_END;
 }
 
+#undef sieve_runtime_error
 void sieve_runtime_error(const struct sieve_runtime_env *renv,
+			 const char *csrc_filename, unsigned int csrc_linenum,
 			 const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -978,11 +982,15 @@ void sieve_runtime_error(const struct sieve_runtime_env *renv,
 	va_end(args);
 }
 
+#undef sieve_runtime_warning
 void sieve_runtime_warning(const struct sieve_runtime_env *renv,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -992,11 +1000,15 @@ void sieve_runtime_warning(const struct sieve_runtime_env *renv,
 	va_end(args);
 }
 
+#undef sieve_runtime_log
 void sieve_runtime_log(const struct sieve_runtime_env *renv,
+		       const char *csrc_filename, unsigned int csrc_linenum,
 		       const char *location, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_INFO,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -1006,12 +1018,17 @@ void sieve_runtime_log(const struct sieve_runtime_env *renv,
 	va_end(args);
 }
 
+#undef sieve_runtime_critical
 void sieve_runtime_critical(const struct sieve_runtime_env *renv,
+			    const char *csrc_filename,
+			    unsigned int csrc_linenum,
 			    const char *location, const char *user_prefix,
 			    const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 		.location = location,
 	};
 	va_list args;
@@ -1031,8 +1048,12 @@ void sieve_runtime_critical(const struct sieve_runtime_env *renv,
 	va_end(args);
 }
 
+#undef sieve_runtime_mail_error
 int sieve_runtime_mail_error(const struct sieve_runtime_env *renv,
-			     struct mail *mail, const char *fmt, ...)
+			     struct mail *mail,
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
+			     const char *fmt, ...)
 {
 	const char *error_msg, *user_prefix;
 	va_list args;
@@ -1041,7 +1062,8 @@ int sieve_runtime_mail_error(const struct sieve_runtime_env *renv,
 
 	va_start(args, fmt);
 	user_prefix = t_strdup_vprintf(fmt, args);
-	sieve_runtime_critical(renv, NULL, user_prefix, "%s: %s",
+	sieve_runtime_critical(renv, csrc_filename, csrc_linenum,
+			       NULL, user_prefix, "%s: %s",
 			       user_prefix, error_msg);
 	va_end(args);
 
diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h
index 1e28e03345e9d66d720faacbdb154e0389cf8bb1..2a81c8d05723a578c8be225b35e419a4b2299209 100644
--- a/src/lib-sieve/sieve-interpreter.h
+++ b/src/lib-sieve/sieve-interpreter.h
@@ -170,19 +170,36 @@ int sieve_interpreter_run(struct sieve_interpreter *interp,
  */
 
 void sieve_runtime_error(const struct sieve_runtime_env *renv,
+			 const char *csrc_filename, unsigned int csrc_linenum,
 			 const char *location, const char *fmt, ...)
-			 ATTR_FORMAT(3, 4);
+			 ATTR_FORMAT(5, 6);
+#define sieve_runtime_error(renv, ...) \
+	sieve_runtime_error(renv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_runtime_warning(const struct sieve_runtime_env *renv,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   const char *location, const char *fmt, ...)
-			   ATTR_FORMAT(3, 4);
+			   ATTR_FORMAT(5, 6);
+#define sieve_runtime_warning(renv, ...) \
+	sieve_runtime_warning(renv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_runtime_log(const struct sieve_runtime_env *renv,
+		       const char *csrc_filename, unsigned int csrc_linenum,
 		       const char *location, const char *fmt, ...)
-		       ATTR_FORMAT(3, 4);
+		       ATTR_FORMAT(5, 6);
+#define sieve_runtime_log(renv, ...) \
+	sieve_runtime_log(renv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_runtime_critical(const struct sieve_runtime_env *renv,
+			    const char *csrc_filename,
+			    unsigned int csrc_linenum,
 			    const char *location, const char *user_prefix,
-			    const char *fmt, ...) ATTR_FORMAT(4, 5);
+			    const char *fmt, ...) ATTR_FORMAT(6, 7);
+#define sieve_runtime_critical(renv, ...) \
+	sieve_runtime_critical(renv, __FILE__, __LINE__, __VA_ARGS__)
 int sieve_runtime_mail_error(const struct sieve_runtime_env *renv,
-			     struct mail *mail, const char *fmt, ...)
-			     ATTR_FORMAT(3, 4);
+			     struct mail *mail, 
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
+			     const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_runtime_mail_error(renv, mail, ...) \
+	sieve_runtime_mail_error(renv, mail, __FILE__, __LINE__, __VA_ARGS__)
 
 #endif
diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c
index 1e38556d0507407507f56a1a2986e26645cdfad7..1572a455a443b91e77fb49ec82172fc19f6bff22 100644
--- a/src/lib-sieve/sieve-lexer.c
+++ b/src/lib-sieve/sieve-lexer.c
@@ -120,12 +120,16 @@ void sieve_lexer_free(const struct sieve_lexer **_lexer)
  * Internal error handling
  */
 
-inline static void ATTR_FORMAT(2, 3)
-sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...)
+inline static void ATTR_FORMAT(4, 5)
+sieve_lexer_error(const struct sieve_lexer *lexer,
+		  const char *csrc_filename, unsigned int csrc_linenum,
+		  const char *fmt, ...)
 {
 	struct sieve_lexical_scanner *scanner = lexer->scanner;
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -140,13 +144,19 @@ sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...)
 
 	va_end(args);
 }
+#define sieve_lexer_error(lexer, ...) \
+	sieve_lexer_error(lexer, __FILE__, __LINE__, __VA_ARGS__)
 
-inline static void ATTR_FORMAT(2, 3)
-sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...)
+inline static void ATTR_FORMAT(4, 5)
+sieve_lexer_warning(const struct sieve_lexer *lexer,
+		    const char *csrc_filename, unsigned int csrc_linenum,
+		    const char *fmt, ...)
 {
 	struct sieve_lexical_scanner *scanner = lexer->scanner;
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -161,6 +171,8 @@ sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...)
 
 	va_end(args);
 }
+#define sieve_lexer_warning(lexer, ...) \
+	sieve_lexer_warning(lexer, __FILE__, __LINE__, __VA_ARGS__)
 
 const char *sieve_lexer_token_description(const struct sieve_lexer *lexer)
 {
diff --git a/src/lib-sieve/sieve-parser.c b/src/lib-sieve/sieve-parser.c
index bfe38553e0c66f916d74da547a3dd4635cd078e5..71dc1f75084e8770e498461c4b716f02d633a480 100644
--- a/src/lib-sieve/sieve-parser.c
+++ b/src/lib-sieve/sieve-parser.c
@@ -88,11 +88,15 @@ void sieve_parser_free(struct sieve_parser **parser)
  * Internal error handling
  */
 
-inline static void ATTR_FORMAT(2, 3)
-sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...)
+inline static void ATTR_FORMAT(4, 5)
+sieve_parser_error(struct sieve_parser *parser,
+		   const char *csrc_filename, unsigned int csrc_linenum,
+		   const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -112,6 +116,8 @@ sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...)
 
 	va_end(args);
 }
+#define sieve_parser_error(parser, ...) \
+	sieve_parser_error(parser, __FILE__, __LINE__, __VA_ARGS__)
 
 /*
  * Sieve grammar parsing
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index b409db63221c0dd87563b37a50f12316e902eead..a6694f71263725e940ccc22c2cbed9a2a1129fde 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1530,11 +1530,15 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list,
  * Error handling
  */
 
+#undef sieve_result_error
 void sieve_result_error(const struct sieve_action_exec_env *aenv,
+			const char *csrc_filename, unsigned int csrc_linenum,
 			const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1543,11 +1547,15 @@ void sieve_result_error(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_global_error
 void sieve_result_global_error(const struct sieve_action_exec_env *aenv,
-			       const char *fmt, ...)
+			       const char *csrc_filename,
+			       unsigned int csrc_linenum, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1556,11 +1564,15 @@ void sieve_result_global_error(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_warning
 void sieve_result_warning(const struct sieve_action_exec_env *aenv,
+			  const char *csrc_filename, unsigned int csrc_linenum,
 			  const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1569,11 +1581,16 @@ void sieve_result_warning(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_global_warning
 void sieve_result_global_warning(const struct sieve_action_exec_env *aenv,
+				 const char *csrc_filename,
+				 unsigned int csrc_linenum,
 				 const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1582,11 +1599,15 @@ void sieve_result_global_warning(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_log
 void sieve_result_log(const struct sieve_action_exec_env *aenv,
+		      const char *csrc_filename, unsigned int csrc_linenum,
 		      const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_INFO,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1595,11 +1616,15 @@ void sieve_result_log(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_global_log
 void sieve_result_global_log(const struct sieve_action_exec_env *aenv,
-			     const char *fmt, ...)
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_INFO,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1608,11 +1633,16 @@ void sieve_result_global_log(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_global_log_error
 void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv,
+				   const char *csrc_filename,
+				   unsigned int csrc_linenum,
 				   const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1622,11 +1652,16 @@ void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_global_log_warning
 void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv,
+				     const char *csrc_filename,
+				     unsigned int csrc_linenum,
 				     const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1636,11 +1671,15 @@ void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_critical
 void sieve_result_critical(const struct sieve_action_exec_env *aenv,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   const char *user_prefix, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1654,8 +1693,11 @@ void sieve_result_critical(const struct sieve_action_exec_env *aenv,
 	va_end(args);
 }
 
+#undef sieve_result_mail_error
 int sieve_result_mail_error(const struct sieve_action_exec_env *aenv,
-			    struct mail *mail, const char *fmt, ...)
+			    struct mail *mail,
+			    const char *csrc_filename,
+			    unsigned int csrc_linenum, const char *fmt, ...)
 {
 	const char *error_msg, *user_prefix;
 	va_list args;
@@ -1664,8 +1706,8 @@ int sieve_result_mail_error(const struct sieve_action_exec_env *aenv,
 
 	va_start(args, fmt);
 	user_prefix = t_strdup_vprintf(fmt, args);
-	sieve_result_critical(aenv, user_prefix, "%s: %s",
-			      user_prefix, error_msg);
+	sieve_result_critical(aenv, csrc_filename, csrc_linenum,
+			      user_prefix, "%s: %s", user_prefix, error_msg);
 	va_end(args);
 
 	return 	SIEVE_EXEC_TEMP_FAILURE;
diff --git a/src/lib-sieve/sieve-result.h b/src/lib-sieve/sieve-result.h
index 194720706157ced851d72b5fe036b456af3e9789..5d7f4ecf56f3b319636f71a7cee8fa4fdc4f686f 100644
--- a/src/lib-sieve/sieve-result.h
+++ b/src/lib-sieve/sieve-result.h
@@ -142,27 +142,69 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list,
  */
 
 void sieve_result_error(const struct sieve_action_exec_env *aenv,
-			const char *fmt, ...) ATTR_FORMAT(2, 3);
+			const char *csrc_filename, unsigned int csrc_linenum,
+			const char *fmt, ...)
+			ATTR_FORMAT(4, 5);
+#define sieve_result_error(aenv, ...) \
+	sieve_result_error(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_global_error(const struct sieve_action_exec_env *aenv,
-			       const char *fmt, ...) ATTR_FORMAT(2, 3);
+			       const char *csrc_filename,
+			       unsigned int csrc_linenum, const char *fmt, ...)
+			       ATTR_FORMAT(4, 5);
+#define sieve_result_global_error(aenv, ...) \
+	sieve_result_global_error(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_warning(const struct sieve_action_exec_env *aenv,
-			  const char *fmt, ...) ATTR_FORMAT(2, 3);
+			  const char *csrc_filename, unsigned int csrc_linenum,
+			  const char *fmt, ...)
+			  ATTR_FORMAT(4, 5);
+#define sieve_result_warning(aenv, ...) \
+	sieve_result_warning(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_global_warning(const struct sieve_action_exec_env *aenv,
-				 const char *fmt, ...) ATTR_FORMAT(2, 3);
+				 const char *csrc_filename,
+				 unsigned int csrc_linenum,
+				 const char *fmt, ...)
+				 ATTR_FORMAT(4, 5);
+#define sieve_result_global_warning(aenv, ...) \
+	sieve_result_global_warning(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_log(const struct sieve_action_exec_env *aenv,
-		      const char *fmt, ...) ATTR_FORMAT(2, 3);
+		      const char *csrc_filename, unsigned int csrc_linenum,
+		      const char *fmt, ...)
+		      ATTR_FORMAT(4, 5);
+#define sieve_result_log(aenv, ...) \
+	sieve_result_log(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_global_log(const struct sieve_action_exec_env *aenv,
-			     const char *fmt, ...) ATTR_FORMAT(2, 3);
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum, const char *fmt, ...)
+			     ATTR_FORMAT(4, 5);
+#define sieve_result_global_log(aenv, ...) \
+	sieve_result_global_log(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv,
-				   const char *fmt, ...) ATTR_FORMAT(2, 3);
+				   const char *csrc_filename,
+				   unsigned int csrc_linenum,
+				   const char *fmt, ...)
+				   ATTR_FORMAT(4, 5);
+#define sieve_result_global_log_error(aenv, ...) \
+	sieve_result_global_log_error(aenv, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv,
-				     const char *fmt, ...) ATTR_FORMAT(2, 3);
+				     const char *csrc_filename,
+				     unsigned int csrc_linenum,
+				     const char *fmt, ...)
+				     ATTR_FORMAT(4, 5);
+#define sieve_result_global_log_warning(aenv, ...) \
+	sieve_result_global_log_warning(aenv, __FILE__, __LINE__, __VA_ARGS__)
 
 void sieve_result_critical(const struct sieve_action_exec_env *aenv,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   const char *user_prefix, const char *fmt, ...)
-			   ATTR_FORMAT(3, 4);
+			   ATTR_FORMAT(5, 6);
+#define sieve_result_critical(aenv, ...) \
+	sieve_result_critical(aenv, __FILE__, __LINE__, __VA_ARGS__)
 int sieve_result_mail_error(const struct sieve_action_exec_env *aenv,
-			    struct mail *mail, const char *fmt, ...)
-			    ATTR_FORMAT(3, 4);
+			    struct mail *mail,
+			    const char *csrc_filename,
+			    unsigned int csrc_linenum, const char *fmt, ...)
+			    ATTR_FORMAT(5, 6);
+#define sieve_result_mail_error(aenv, mail, ...) \
+	sieve_result_mail_error(aenv, mail, __FILE__, __LINE__, __VA_ARGS__)
 
 #endif
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index 6f605564ada691fc5a0d12cfe64f4de0f2f53600..d0c96f81a5b09005426999df221e17bee75655f7 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -1659,11 +1659,15 @@ sieve_validator_object_registry_init(struct sieve_validator *valdtr,
  * Error handling
  */
 
+#undef sieve_validator_error
 void sieve_validator_error(struct sieve_validator *valdtr,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_ERROR,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
@@ -1675,11 +1679,16 @@ void sieve_validator_error(struct sieve_validator *valdtr,
 	va_end(args);
 }
 
+#undef sieve_validator_warning
 void sieve_validator_warning(struct sieve_validator *valdtr,
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
 			     unsigned int source_line, const char *fmt, ...)
 {
 	struct sieve_error_params params = {
 		.log_type = LOG_TYPE_WARNING,
+		.csrc.filename = csrc_filename,
+		.csrc.linenum = csrc_linenum,
 	};
 	va_list args;
 
diff --git a/src/lib-sieve/sieve-validator.h b/src/lib-sieve/sieve-validator.h
index 43d9cf6c99870b07fda07a6d9d990c790f79b8e3..21b41ccf166d84c351870c9ae682ee06a76272bf 100644
--- a/src/lib-sieve/sieve-validator.h
+++ b/src/lib-sieve/sieve-validator.h
@@ -181,10 +181,17 @@ sieve_validator_object_registry_init(struct sieve_validator *valdtr,
  */
 
 void sieve_validator_error(struct sieve_validator *valdtr,
+			   const char *csrc_filename, unsigned int csrc_linenum,
 			   unsigned int source_line, const char *fmt, ...)
-			   ATTR_FORMAT(3, 4);
+			   ATTR_FORMAT(5, 6);
+#define sieve_validator_error(valdtr, ...) \
+	sieve_validator_error(valdtr, __FILE__, __LINE__, __VA_ARGS__)
 void sieve_validator_warning(struct sieve_validator *valdtr,
+			     const char *csrc_filename,
+			     unsigned int csrc_linenum,
 			     unsigned int source_line, const char *fmt, ...)
-			     ATTR_FORMAT(3, 4);
+			     ATTR_FORMAT(5, 6);
+#define sieve_validator_warning(valdtr, ...) \
+	sieve_validator_warning(valdtr, __FILE__, __LINE__, __VA_ARGS__)
 
 #endif