PostgreSQL 服务器日志 pg_log

本文详细介绍了 PostgreSQL 10.0 版本中的三种日志类型及其配置方法,特别是针对数据库运行日志的各项参数进行了深入解析,并提供了如何启用 SQL 执行时间记录等功能的具体步骤。

10.0版本PostgreSQL,存在三种日志

WAL日志,即重做日志,一般不可读

  • 日志对应目录为 $PGDATA/pg_xlog

事务提交日志,记录的是事务的元数据

  • 日志对应目录为 $PGDATA/pg_clog

数据库运行日志

  • 日志对应目录为$PGDATA/pg_log

前两种日志,虽然仍然非常重要,但却是不可读的,我们日常使用不多。
本次重点说明第三种日志。


数据库运行日志的相关配置

1.logging_collector = on/off
是否将日志重定向至文件中,默认是off(该配置修改后,需要重启DB服务)

2.log_directory = 'pg_log' ---- 日志文件目录,默认是PGDATA的相对路径,即{PGDATA}/pg_log,也可以改为绝对路径

3.log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' ---- 日志文件命名形式,其中格式化格式与linux date格式化相同。

4.log_rotation_age = 1d ---- 单个日志文件的生存期,默认1天,在日志文件大小没有达到log_rotation_size时,一天只生成一个日志文件

5.log_rotation_size = 10MB ---- 单个日志文件的大小,如果时间没有超过log_rotation_age,一个日志文件最大只能到10M,否则将新生成一个日志文件。

6.log_truncate_on_rotation = off ---- 当日志文件已存在时,该配置如果为off,新生成的日志将在文件尾部追加,如果为on,则会覆盖原来的日志。

7.log_lock_waits = off ---- 控制当一个会话等待时间超过deadlock_timeout而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是off。

8.log_duration = off ---- 记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。

9.log_statement
设置日志记录内容--log_statement:none, ddl, mod, and all 。

None表示不记录(默认项)

ddl记录所有数据定义命令,比如CREATE,ALTER,和DROP语句。

mod记录所有ddl语句,加上数据修改语句INSERT,UPDATE等。

all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句,但会对数据库性能产生较大影响,生产环境不建议配置此值。

postgres=# alter system set log_statement=ddl;
ALTER SYSTEM
# show log_statement仍然显示原来的设置,需要退出,执行pg_ctl reload才能生效
postgres=# show log_statement;
 log_statement 
---------------
 mod
(1 row)

postgres=# \q
[postgres@localhost data]$ pg_ctl reload
server signaled
[postgres@localhost data]$ psql
psql (10.7)
Type "help" for help.

postgres=# show log_statement;
 log_statement 
---------------
 ddl
(1 row)

postgres=#

注:此处未记录select查询语句(log_min_duration_statement=-1 此处为默认值)。当同时设置log_statement=’mod’和log_min_duration_statement=0后,也会记录select。

highgo=#alter system set log_statement=mod;

ALTERSYSTEM

highgo=#alter system set log_min_duration_statement=0;

ALTERSYSTEM

highgo=#\q

[highgo@sourcedbdata]$ pg_ctl reload

serversignaled

10.log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements and their durations, > 0 logs only statements running at least this number of milliseconds
-1表示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。个人更喜欢使用该配置来跟踪那些耗时较长,可能存在性能问题的SQL语句。虽然使用log_statement和log_duration也能够统计SQL语句及耗时,但是SQL语句和耗时统计结果可能相差很多行,或在不同的文件中,但是log_min_duration_statement会将SQL语句和耗时在同一行记录,更方便阅读

11.log_connections = off ----是否记录连接信息(修改后需要重启数据库)

12.log_disconnections = off ---- 是否记录连接断开日志

13.log_line_prefix = '%m %p %u %d %r ' ---- 日志输出格式(%m,%p实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端IP和端口,方便定位问题)

#log_line_prefix = '%m [%p] ' 
# special value
# %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

14.log_timezone = 'Asia/Shanghai' ---- 日志时区,最好和服务器设置同一个时区,方便问题定位

--视图pg_timezone_names保存了所有可供选择的时区

select * from pg_timezone_names;

服务器时区设置
[root@localhost ~]# cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

<think>首先,用户的问题是关于在PostgreSQL中开启安全审计日志并设置log_statement来记录SQL语句。用户引用了三个参考信息,我需要基于这些引用提供答案。 关键点: - 用户想开启安全审计日志。 - 具体设置log_statement来记录SQL语句。 - 参考引用提供了关于log_min_duration_statement和log_statement的信息。 从引用中: - [^1]: 解释了log_min_duration_statement,用于记录运行时间超过指定阈值的SQL语句。 - [^2]: 展示了如何设置log_statement,例如使用`alter system set log_statement='all';`,然后重新加载配置。 - [^3]: 讨论了log_statement和log_min_duration_statement的交互:log_statement在语句解析后、执行前记录,而log_min_duration_statement在语句执行后记录duration,但不重复记录语句。建议使用log_line_prefix来关联日志。 用户的问题焦点是开启安全审计日志并设置log_statement。所以,我应该优先基于引用[^2]和[^3]来回答。 步骤: 1. **理解安全审计日志**:在PostgreSQL中,安全审计日志通常涉及记录用户活动,包括SQL语句。log_statement是用于记录SQL语句的关键参数。 2. **设置log_statement**: - 如引用[^2]所示,可以使用`alter system set log_statement='all';`来设置log_statement为'all',记录所有SQL语句。 - 然后,使用`SELECT pg_reload_conf();`来重新加载配置,使更改生效。 - 也可以设置log_statement为其他值,如'ddl'(只记录数据定义语言)或'mod'(记录数据修改语言),但用户想记录所有SQL,所以'all'是合适的。 3. **其他相关设置**: - 引用[^1]提到log_min_duration_statement,但用户主要关心log_statement。不过,为了完整性,我可以提到它。 - 引用[^3]强调了log_statement和log_min_duration_statement的交互:如果同时设置,log_statement记录语句本身,log_min_duration_statement记录执行时间。 - 建议使用log_line_prefix来添加前缀(如PID或会话ID),以便在日志中关联语句和duration。 4. **开启审计日志**:PostgreSQL没有内置的“安全审计日志”功能;它通过日志记录参数来实现。log_statement是核心部分。用户可能还需要设置其他日志参数,如log_directory、log_filename等,但这些不是用户直接询问的。 5. **验证设置**:如引用[^2]所示,可以使用`show log_statement;`和`show log_min_duration_statement;`来检查当前设置。 回答结构: - 既然用户要求“回答结构清晰,帮助用户逐步解决问题”,我应该分步解释。 - 使用中文回答。 - 确保LaTeX语法正确:所有行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学,所以可能不需要。 - 生成相关问题:在末尾添加相关问题,如示例所示。 - 添加引用标识:在相关段落末尾自然地添加引用标识,如[^1]、[^2]、[^3]。 完整回答: - 介绍如何设置log_statement。 - 解释相关参数。 - 给出命令示例。 - 讨论日志文件位置和查看。 - 生成相关问题。 相关问题: - 基于主题,如:如何优化日志记录?如何分析日志?其他审计设置? 最终输出: - 回答部分。 - §§相关问题§§部分。</think>### 在PostgreSQL中开启安全审计日志并设置log_statement记录SQL语句 在PostgreSQL中,开启安全审计日志主要涉及配置日志参数来记录SQL语句,其中`log_statement`参数是关键,用于控制哪些SQL语句被记录到日志中。以下是逐步配置指南,基于PostgreSQL的官方文档和最佳实践。所有操作需在数据库超级用户权限下执行(例如使用`psql`命令行工具)。 #### 步骤1: 设置log_statement参数 `log_statement`参数决定记录SQL语句的范围。可设置为: - `'none'`: 不记录任何语句(默认值)。 - `'ddl'`: 只记录数据定义语言(DDL)语句(如`CREATE`, `ALTER`)。 - `'mod'`: 记录数据修改语言(DML)和DDL语句(如`INSERT`, `UPDATE`, `DELETE`)。 - `'all'`: 记录所有SQL语句(包括`SELECT`),适用于全面审计。 要开启所有SQL语句记录,执行以下SQL命令: ```sql -- 设置log_statement为'all',记录所有SQL语句 ALTER SYSTEM SET log_statement = 'all'; ``` - 此命令修改`postgresql.conf`文件(或`postgresql.auto.conf`),无需手动编辑文件[^2]。 - 使用`ALTER SYSTEM`确保更改持久化,即使服务器重启也生效。 #### 步骤2: 重新加载配置使更改生效 更改参数后,需重新加载配置而不重启数据库服务: ```sql -- 重新加载配置 SELECT pg_reload_conf(); ``` - 这会立即应用新设置,无需中断数据库服务[^2]。 #### 步骤3: 验证设置 检查参数是否生效: ```sql -- 查看log_statement当前值 SHOW log_statement; -- 预期输出:all ``` - 同时建议检查其他相关参数,确保日志系统正常工作[^2]。 #### 步骤4: 配置日志文件和关联标识(可选但推荐) 为便于审计,建议添加日志前缀来关联语句和执行详情: - **设置`log_line_prefix`**: 在日志行中添加进程ID(PID)或会话ID,便于跟踪语句来源。 ```sql ALTER SYSTEM SET log_line_prefix = '%m [%p] '; -- %m: 时间戳, %p: 进程ID SELECT pg_reload_conf(); ``` - **日志文件位置**: 默认日志路径在`log_directory`参数指定(通常为`/var/log/postgresql/`或`$PGDATA/log`)。使用`SHOW log_directory;`查看路径。 - **处理与`log_min_duration_statement`的交互**: 如果同时设置`log_min_duration_statement`(记录慢查询),需注意: - `log_statement`在语句解析后、执行前记录语句本身。 - `log_min_duration_statement`在语句执行后记录执行时间(duration),但不重复记录语句内容。 - 因此,添加`log_line_prefix`(如PID)能帮助在日志中关联语句和其执行时间,避免混淆[^3]。 #### 步骤5: 查看和分析日志 - 日志文件通常命名为`postgresql-YYYY-MM-DD.log`。使用文本工具(如`grep`)或日志分析工具查看: ```bash tail -f /var/log/postgresql/postgresql-*.log ``` - 示例日志输出(启用`log_line_prefix`后): ``` 2023-10-01 12:00:00 UTC [1234] LOG: statement: SELECT * FROM users; ``` 这里`[1234]`是进程ID,用于关联其他日志条目(如慢查询记录)。 #### 注意事项 - **性能影响**: 设置`log_statement='all'`会记录大量数据,可能增加I/O负载。建议在生产环境中评估需求,或结合`log_min_duration_statement`(例如设置为`100ms`)只记录慢查询[^1]。 - **安全审计扩展**: 对于更高级的审计(如用户登录审计),可安装扩展如`pgAudit`,它提供细粒度的审计策略。 - **参数持久性**: 所有`ALTER SYSTEM`更改存储在`postgresql.auto.conf`中。重启数据库后,设置仍有效。 通过以上步骤,您已成功开启PostgreSQL的安全审计日志,并配置了所有SQL语句的记录。这有助于追踪未授权访问或异常操作[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值