PostgreSQL可以不借助任何扩展实现对SQL日志的记录,主要依靠于两个参数,也即log_statement和log_min_duration_statement,
1,记录的sql范例
log_statement='all' 可以是none, ddl, mod, all
2,记录的sql执行时间阈值
log_min_duration_statement='1000',单位毫秒,记录超出该单位时间的log_statement中定义范例的SQL
以上两个参数规定了记录超出log_min_duration_statement时间的log_statement范例的SQL语句到日志文件中
3,PostgreSQL日志行前缀的格式,
log_line_prefix = '%m [%p] ' # special values:
# %a = application name
# %u = user name
# %d = database name
# %r = remote host and port
# %h = remote host
# %b = backend type
# %p = process ID
# %P = process ID of parallel group leader
# %t = timestamp without milliseconds
# %m = timestamp with milliseconds
# %n = timestamp with milliseconds (as a Unix epoch)
# %Q = query ID (0 if none or not computed)
# %i = command tag
# %e = SQL state
# %c = session ID
# %l = session line number
# %s = session start timestamp
# %v = virtual transaction ID
# %x = transaction ID (0 if none)
# %q = stop here in non-session
# processes
# %% = '%'
# e.g. ' '
需要注意的是,PostgreSQL慢日志信息是一个过程,有多行文本构成,每个步调在日志里都是一行文本信息,大概步调如下,
step 1,执行开始前,即被记入日志(log_statement生效)
step 2,语句执行的过程中,会涉及绑定变量解析等等
step 3,语句执行完成后,将duration记入日志
由于以上过程存在并发Session交织写入的情况,因此要考虑如何解析(记录足够具体的log_line_prefix )。由于慢日志都以文本的方式分行存储,以上日志会存在交织存储的场景,也即session1和Session2会并行地往log里写入日志信息,从而导致两者的日志交织写入,雷同于如下如许,真正写代码做过解析的都知道(如果不记录SessionID)这个难点。