diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index e3dc23bf130..3ced3997309 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -4629,6 +4629,11 @@ local0.* /var/log/postgresql
Time stamp with milliseconds
no
+
+ %n
+ Time stamp with milliseconds (as a Unix epoch)
+ no
+
%i
Command tag: type of session's current command
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 088c714821b..9114c55b66b 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -2438,6 +2438,20 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
appendStringInfoString(buf, strfbuf);
}
break;
+ case 'n':
+ {
+ struct timeval tv;
+ char strfbuf[128];
+
+ gettimeofday(&tv, NULL);
+ sprintf(strfbuf, "%ld.%03d", tv.tv_sec, (int)(tv.tv_usec / 1000));
+
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, strfbuf);
+ else
+ appendStringInfoString(buf, strfbuf);
+ }
+ break;
case 's':
if (formatted_start_time[0] == '\0')
setup_formatted_start_time();
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 695a88fe7d1..c33e5856197 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -425,6 +425,7 @@
# %p = process ID
# %t = timestamp without milliseconds
# %m = timestamp with milliseconds
+ # %n = timestamp with milliseconds (as a Unix epoch)
# %i = command tag
# %e = SQL state
# %c = session ID