PostgreSQL 打印日志信息所在的源文件和行数的实例

一直好奇在PG中, 当输出错误日志时, 如何能够附带错误信息所在的源代码文件名以及发生错误的代码行数.

postgres.conf中, log信息冗余级别为”default(默认)”, terse: 表示更加简单的日志信息, verbose: 表示更加冗余的日志信息(即: 附带”文件名和行数)

1#log_error_verbosity = default # terse, default, or verbose messages

修改为下面的”verbose”即可.

1log_error_verbosity = verbose # terse, default, or verbose messages

修改后, 重启实例后生效, 结果如下, 可以看到日志信息附带了”文件名”和”行数”信息.

2020-03-02 09:34:41.800 CST [9019] LOG: 00000: listening on IPv6 address “::1”, port 7433
2020-03-02 09:34:41.800 CST [9019] LOCATION: StreamServerPort, pqcomm.c:593
2020-03-02 09:34:41.800 CST [9019] LOG: 00000: listening on IPv4 address “127.0.0.1”, port 7433
2020-03-02 09:34:41.800 CST [9019] LOCATION: StreamServerPort, pqcomm.c:593
2020-03-02 09:34:41.801 CST [9019] LOG: 00000: listening on Unix socket “/tmp/.s.PGSQL.7433”
2020-03-02 09:34:41.801 CST [9019] LOCATION: StreamServerPort, pqcomm.c:587
2020-03-02 09:34:41.814 CST [9020] LOG: 00000: database system was shut down at 2020-03-02 09:34:24 CST
2020-03-02 09:34:41.814 CST [9020] LOCATION: StartupXLOG, xlog.c:6291
2020-03-02 09:34:41.819 CST [9019] LOG: 00000: database system is ready to accept connections
2020-03-02 09:34:41.819 CST [9019] LOCATION: reaper, postmaster.c:2938

 

备注: 以上verbose方法应该只能在debug模式下生效, 因为release下根本就没有文件名和行数相关的信息.

补充:PostgreSQL数据库之运行日志

PostgreSQL有三种日志:

1、pg_wal(WAL 日志,即重做日志) 内容一般不具有可读性强制开启

2、pg_log(数据库运行日志) 内容可读 默认关闭的,需要设置参数启动

3、pg_clog(事务提交日志,记录的是事务的元数据) 内容一般不具有可读性 强制开启

PostgreSQL运行日志可以实现日志输出记录,默认是没有启动记录。这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。

PostgreSQL常用日志参数

项目默认值设定值说明

logging_collectoroffon日志收集功能是否启动

log_destinationstderrcsvlog日志收集存储方式

log_directorylogpg_log日志收集存储路径

log_filenamepostgresql-%Y-%m-%d.logpostgresql-%Y-%m-%d_%H%M%S.log日志文件命名格式

log_timezoneRPCRPC日志时区

log_rotation_age14407d单个日志文件生存周期,默认1天

log_rotation_size10240100MB单个日志文件大小

log_truncate_on_retationoffofflog_rotation_age触发切换下一个日志,存在则附加,否则将覆盖

log_min_messageswarningwarning日志输出级别

log_min_duration_statement-13000-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。

log_checkpointsoffon记录Checkpoint信息

log_connectionsoffon是否记录连接日志

log_disconnectionsoffon是否记录连接断开日志

log_durationoffoff记录每条SQL语句执行完成消耗的时间

log_line_prefix%m[%p]%e: %t [%p]: [%l-1] user = %u,db = %d,remote = %r app = %a日志输出格式;

log_lock_waitsoffon控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。可判断是否存在锁等待问题

log_statementnoneddl控制记录哪些SQL语句。可选值:none=>不记录、ddl=>Create table之类的、mod=>DML语句、all=>记录所有

log_line_prefix参数说明:

%a = application name 应用名称
%u = user name 用户名称
%d = database name 数据库名称
%r = remote host and port 远程主机与端口
%h = remote host 远程主机
%p = process ID 进程号
%t = timestamp without milliseconds 时间戳格式
%m = timestamp with millisecond 时间戳格式
%n = timestamp with milliseconds (as a Unix epoch) 时间戳格式
%i = command tag 命令标签
%e = SQL state SQL语句状态

 

日志设置方式

启动pg_log配置与日志参数

ALTER SYSTEM SET log_destination = ‘csvlog’;
ALTER SYSTEM SET logging_collector = on;
ALTER SYSTEM SET log_directory = ‘pg_log’;
ALTER SYSTEM SET log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’;
ALTER SYSTEM SET log_rotation_age = ‘7d’;
ALTER SYSTEM SET log_rotation_size = ‘100MB’;
ALTER SYSTEM SET log_min_messages = warning;

 

记录执行慢的SQL语句

ALTER SYSTEM SET log_min_duration_statement = 3000;
ALTER SYSTEM SET log_checkpoints = on;
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
ALTER SYSTEM SET log_duration = off;
ALTER SYSTEM SET log_line_prefix = ‘%e: %t [%p]: [%l-1] user = %u,db = %d,remote = %r app = %a’;

 

监控数据库中长时间的锁

1ALTER SYSTEM SET log_lock_waits = on;

记录DDL操作

1ALTER SYSTEM SET log_statement = ‘ddl’;

参数查询

1select name,setting,short_desc from pg_settings where name like ‘log_%’;

重启服务&Reload参数

// 重启服务
pg_ctl restart -m fast -D /pgdata/11.2/data
// Reload参数
select pg_reload_conf();

 

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)
);

 

:# CSV日志加载

1\copy postgres_log from ‘’ with csv;

PostgreSQL 打印日志信息所在的源文件和行数的实例

:# 数据检索测试

// csv日志区间范围
select min(log_time),max(log_time) from postgres_log;
  min  |  max
—————————-+—————————
 2019-12-11 23:18:17.334+08 | 2019-12-11 23:30:49.04+08
(1 行记录)
// 模糊检索字段信息
select log_time,database_name,user_name,application_name,message from postgres_log where message like ‘%duration%’;
  log_time  | database_name | user_name | application_name | message
—————————-+—————+———–+——————+———————–
 2019-12-11 23:18:33.559+08 | pgbench | pgbench | pgbench  | duration: 36.286 ms
 2019-12-11 23:18:33.573+08 | pgbench | pgbench | pgbench  | duration: 13.944 ms
 2019-12-11 23:18:33.581+08 | pgbench | pgbench | pgbench  | duration: 7.953 ms
 2019-12-11 23:18:34.561+08 | pgbench | pgbench | pgbench  | duration: 976.103 ms

 

SQL统计信息

pg_stat_statements统计了SQL的很多信息,方便我们分析SQL的性能。

:# 参数配置

1alter system set shared_preload_libraries = pg_stat_statements;

:# 重启服务&Reload参数

1pg_ctl restart -m fast -D /pgdata/11.2/data

:# 创建扩展表

1CREATE EXTENSION pg_stat_statements;

:# 查询TOP10

SELECT query, calls, total_time, (total_time/calls) as average ,rows,
 100.0 * shared_blks_hit /nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
ORDER BY average DESC LIMIT 10;

 

※ 统计结果一直都在,重启也不会清零。通过如下命令可以手工清零。

1select pg_stat_statements_reset() ;

日志保留周期

通常我们会对日志进行定期保留以保证不会撑爆磁盘容量,此时需要考虑日志保留周期。

核心参数:

项目默认值设定值说明

log_truncate_on_retationoffofflog_rotation_age触发切换下一个日志,存在则附加,否则将覆盖

log_rotation_age14407d单个日志文件生存周期,默认1天

log_rotation_size10240100MB单个日志文件大小

按照每分钟创建文件,保留1小时:

log_destination = ‘csvlog’
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%M.log’
log_truncate_on_rotation = on
log_rotation_age = 1min
log_rotation_size = 100MB

 

每小时一个文件,保留一天:

log_destination = ‘csvlog’
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%H.log’
log_truncate_on_rotation = on
log_rotation_age = 1hour
log_rotation_size = 100MB

 

每天一个文件,保留一个月:

log_destination = ‘csvlog’
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%d.log’
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 100MB

 

每个月一个文件,保留一年:

log_destination = ‘csvlog’
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%m.log’
log_truncate_on_rotation = on
log_rotation_age = 1month
log_rotation_size = 100MB

 

每天一个文件,保留一年:

log_destination = ‘csvlog’
logging_collector = on
log_directory = ‘log’
log_filename = ‘postgresql-%m-%d.log’
log_truncate_on_rotation = on
log_rotation_age = 1day
log_rotation_size = 100MB

文章来源:脚本之家

来源地址:https://www.jb51.net/article/204277.htm

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:SEO优化专员,转转请注明出处:https://www.chuangxiangniao.com/p/891769.html

(0)
上一篇 2025年1月3日 23:27:14
下一篇 2025年1月3日 23:27:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • SQLite 中文指南之FAQ第1/6页

    sqllite使用过程中碰到的一些问题解决,中文版 1. 如何创建自增字段? 2. SQLite 支持哪些数据类型? 3. 为什么能向 SQLite 数据库的整型字段中插入字符串? 4. 为什么 SQLite 认为表达式 ‘0&…

    数据库 2025年1月4日
    100
  • Access创建一个简单MIS管理系统

    所谓MIS管理系统,是一个由人、计算机及其他外围设备等组成的能进行信息的收集、传递、存贮、加工、维护和使用的系统。MIS管理系统是一种新兴的技术,那么下文中就给大家介绍Access这个有历史的数据库系统如何创建一个简单的MIS管理系统。 M…

    数据库 2025年1月4日
    100
  • 读取注册表根据Office版本获取数据库连接字段

    本节主要介绍了如何根据Office版本获取数据库连接字段,以读取注册表获取Office版本,实现代码如下,感兴趣的朋友不要错过 /// /// 读取注册表,根据Office版本获取数据库连接字段 /// /// 数据库连接字段 privat…

    数据库 2025年1月4日
    100
  • PostgreSQL操作符实践技巧分享

    这篇文章主要给大家介绍了关于PostgreSQL基础知识之SQL操作符实践的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 操作符是数据库具有的…

    2025年1月4日
    100
  • SQL Server如何通过创建临时表遍历更新数据详解

    这篇文章主要给大家介绍了关于SQL Server如何通过创建临时表遍历更新数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 前言: 前段时间新项目上线为了赶…

    2025年1月4日
    100
  • Mac系统重置PostgreSQL密码技巧及代码展示

    PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。这篇文章主要介绍了Mac系统重置PostgreSQL密码的方法示例代码,需要的朋友可以参考下 PostgreSQL是一种特性非常齐全的自由…

    数据库 2025年1月4日
    100
  • PostgreSQL技巧分享:图(graph)的递归查询实例

    这篇文章主要给大家介绍了关于PostgreSQL图(graph)的递归查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 背景 在树形递归查询这篇文…

    2025年1月4日
    100
  • PostgreSQL技巧 如何获取当前日期时间

    这篇文章主要介绍了PostgreSQL 如何获取当前日期时间及注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 在开发数据库应用或者调试代码时,经常需要获取系统的…

    数据库 2025年1月4日
    100
  • postgresql中的ltree类型使用技巧

    这篇文章主要给大家介绍了关于postgresql中ltree类型使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用postgresql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 postgresql有很多比较妖…

    2025年1月4日
    100
  • MongoDB通配符索引的用法实例

    这篇文章主要给大家介绍了关于MongoDB通配符索引的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 指南 MongoDB在4.2 版本推出了Wildcard …

    数据库 2025年1月4日
    100

发表回复

登录后才能评论

联系我们

156-6553-5169

在线咨询: QQ交谈

邮件:253000106@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

联系微信