19.8.4. 使用 CSV 格式的日志输出
包括在log_destination中的csvlog,提供了一个 便捷的方式向数据库中导入日志文件。这个选项以CSV格式发出日志行, 带有这些列: 以毫秒为单位的时间戳,用户名,数据库名,进程ID,客户端主机:端口号, 会话ID,每个会话的行号,命令标签,会话开始时间,虚拟事务ID,日常事务ID, 错误严重性,SQLSTATE代码,错误信息,错误信息的详细信息,建议, 导致错误的内部查询(如果存在),其中的错误位置的字符统计, 错误范围,导致错误的用户查询(如果存在,并且启用log_min_error_statement), 其中的错误位置的字符统计,PostgreSQL源代码中报错的位置(如果 log_error_verbosity设置为verbose)和应用程序名。 下面是一个用于存储CSV格式日志暑促的简单表定义: 在log_destination
列表中包括csvlog
提供了一种便捷方式将日志文件导入到一个数据库表。这个选项发出逗号分隔值(CSV)格式的日志行,包括这些列: 带毫秒的时间戳、 用户名、 数据库名、 进程 ID、 客户端主机:端口号、 会话 ID、 每个会话的行号、 命令标签、 会话开始时间、 虚拟事务 ID、 普通事务 ID、 错误严重性、 SQLSTATE 代码、 错误消息、 错误消息详情、 提示、 导致错误的内部查询(如果有)、 错误位置所在的字符计数、 错误上下文、 导致错误的用户查询(如果有且被log_min_error_statement
启用)、 错误位置所在的字符计数、 在 PostgreSQL 源代码中错误的位置(如果log_error_verbosity
被设置为verbose
)以及应用名。 下面是一个定义用来存储 CSV 格式日志输出的样表:
CREATE TABLE postgres_log
(
log_time timestamp(3) with time zone,
user_name text,
database_name text,
process_id integer,
connection_from text,
session_id text,
session_line_num bigint,
command_tag text,
session_start_time timestamp with time zone,
virtual_transaction_id text,
transaction_id bigint,
error_severity text,
sql_state_code text,
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
PRIMARY KEY (session_id, session_line_num)
);
使用COPY FROM
命令将一个日志文件导入到这个表中:
COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
你可以做一些事情来简化导入 CSV 日志文件:
-
设置log_filename
和log_rotation_age
为你的日志文件提供一种一致的、可预测的命名空间。这让你预测文件名会是怎样以及知道什么时候一个个体日志文件完成并且因此准备好被导入。
-
将log_rotation_size
设置为 0 来禁用基于尺寸的日志轮转,因为它使得日志文件名难以预测。
-
将log_truncate_on_rotation
设置为on
,这样在同一个文件中旧日志数据不会与新数据混杂。
-
上述表定义包括一个主键声明。这有助于避免意外地两次导入相同的信息。COPY
命令一次提交所有它导入的数据,因此任何错误将导致整个导入失败。如果你导入一个部分完成的日志文件并且稍后当它完全完成后再次导入,主键违背将导致导入失败。请等到日志完成且被关闭之后再导入。这个过程也可以避免意外地导入部分完成的行,这种行也将导致COPY
失败。