通过PostgreSQL的log_statement参数获取审计日志

你好!

这次我们将总结一下与 log_statement 参数相关的审计日志。

“log_statement是什么意思?”

log_statement参数控制着要将哪些SQL语句记录到日志中。
只有超级用户可以更改此参数,并且有以下四个配置值。

none
出力をoffにする。デフォルトの状態。

ddl
CREATE、ALTER、およびDROP文といったデータ定義分を全てログに記録します。

mod
ddl文に加えて、INSERT、UPDATE、DELETE、TRUNCATE、およびCOPY FROMといった、データ変更文をログに記録します。
PREPAREとEXPLAIN ANALYZEコマンドも、そこに含まれるコマンドが適切な種類であればログが録られます。

all
全てを記録する。
単純な構文エラーは記録されないため、記録したい場合はlog_min_error_statement を eror に設定することで記録される。

这里是情报来源

日志声明=’无’

1. 更改设置 shè zhì)

postgres=# alter system set log_statement='none';
ALTER SYSTEM

2. 重新启动服务器

[postgres@postgresql ~]$ pg_ctl stop
サーバーは停止しました
[postgres@postgresql ~]$ pg_ctl start
サーバー起動完了

3. 创建测试数据。

postgres=# create table ta_1(id integer,name varchar(10));
CREATE TABLE
postgres=# insert into ta_1  values(1,'tanaka');
INSERT 0 1
postgres=# select * from ta_1;
 id |  name
----+--------
  1 | tanaka
(1 行)

根据设定,未生成任何审计日志。

[postgres@postgresql log]$ ll
合計 0

过了大约5分钟,以下日志被输出了。
这是执行检查点的历史记录。

[postgres@postgresql log]$ ll
合計 4
-rw-------. 1 postgres postgres 703 11月  9 00:37 postgresql-Wed.log
[postgres@postgresql log]$ tail -f postgresql-Wed.log
-rw-------. 1 postgres postgres 322 11月  9 00:02 postgresql-Wed.log
2022-11-09 00:02:41.346 EST [5213] LOG:  checkpoint starting: time
2022-11-09 00:02:43.520 EST [5213] LOG:  checkpoint complete: wrote 24 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=2.114 s, sync=0.057 s, total=2.174 s; sync files=18, longest=0.056 s, average=0.004 s; distance=99 kB, estimate=99 kB

检查点是指删除积压的事务日志的功能。
通过检查点可以确保数据的可靠性。
检查点通过checkpoint_timeout进行控制,默认执行间隔为5分钟。
另一种控制方法是通过checkpoint_segments参数控制最大日志文件数。
这里的默认值为3个段。

postgres=# select name, setting, unit from pg_settings where name='checkpoint_timeout';
        name        | setting | unit
--------------------+---------+------
 checkpoint_timeout | 300     | s
(1 行)

日志声明=’数据定义语言’

1. 更改设置

postgres=# alter system set log_statement='ddl';
ALTER SYSTEM

2. 重新启动服务器

[postgres@postgresql ~]$ pg_ctl stop
サーバーは停止しました
[postgres@postgresql ~]$ pg_ctl start
サーバー起動完了

创建测试数据

postgres=# create table ta_1(id integer,name varchar(10));
CREATE TABLE
postgres=# insert into ta_1  values(1,'tanaka');
INSERT 0 1
postgres=# select * from ta_1;
 id |  name
----+--------
  1 | tanaka
(1 行)

4. 监审日志确认
本次是从 PostgreSQL 重新启动之后进行记录的。
另外,DDL 的创建语句已被记录,但插入语句和查询语句没有被记录。

[postgres@postgresql log]$ ll
合計 4
-rw-------. 1 postgres postgres 703 11月  9 00:21 postgresql-Wed.log
[postgres@postgresql log]$ tail -f postgresql-Wed.log
2022-11-09 00:21:31.286 EST [6261] LOG:  starting PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10), 64-bit
2022-11-09 00:21:31.287 EST [6261] LOG:  listening on IPv6 address "::1", port 5432
2022-11-09 00:21:31.287 EST [6261] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2022-11-09 00:21:31.289 EST [6261] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2022-11-09 00:21:31.296 EST [6261] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2022-11-09 00:21:31.302 EST [6265] LOG:  database system was shut down at 2022-11-09 00:21:29 EST
2022-11-09 00:21:31.307 EST [6261] LOG:  database system is ready to accept connections
2022-11-09 00:23:28.152 EST [6270] LOG:  statement: create table ta_1(id integer,name varchar(10));

日志声明为’mod’

1. 更改设置

postgres=# alter system set log_statement='mod';
ALTER SYSTEM

2. 重新启动服务器

[postgres@postgresql ~]$ pg_ctl stop
サーバーは停止しました
[postgres@postgresql ~]$ pg_ctl start
サーバー起動完了

3. 制作测试数据。

postgres=# create table ta_1(id integer,name varchar(10));
CREATE TABLE
postgres=# insert into ta_1  values(1,'tanaka');
INSERT 0 1
postgres=# select * from ta_1;
 id |  name
----+--------
  1 | tanaka
(1 行)

4. 监审日志确认
本次检查发现,insert语句已经有记录,但select语句没有记录。

[postgres@postgresql log]$ ll
合計 4
-rw-------. 1 postgres postgres 703 11月  9 00:30 postgresql-Wed.log
[postgres@postgresql log]$ tail -f postgresql-Wed.log
2022-11-09 00:30:30.407 EST [6643] LOG:  starting PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10), 64-bit
2022-11-09 00:30:30.407 EST [6643] LOG:  listening on IPv6 address "::1", port 5432
2022-11-09 00:30:30.407 EST [6643] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2022-11-09 00:30:30.409 EST [6643] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2022-11-09 00:30:30.415 EST [6643] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2022-11-09 00:30:30.457 EST [6647] LOG:  database system was shut down at 2022-11-09 00:30:28 EST
2022-11-09 00:30:30.462 EST [6643] LOG:  database system is ready to accept connections
2022-11-09 00:30:59.664 EST [6660] LOG:  statement: create table ta_1(id integer,name varchar(10));
2022-11-09 00:31:04.788 EST [6660] LOG:  statement: insert into ta_1  values(1,'tanaka');

日志语句=’全部’

更改设置

postgres=# alter system set log_statement='all';
ALTER SYSTEM

2. 重新启动服务器

[postgres@postgresql ~]$ pg_ctl stop
サーバーは停止しました
[postgres@postgresql ~]$ pg_ctl start
サーバー起動完了

3. 创建测试数据

postgres=# create table ta_1(id integer,name varchar(10));
CREATE TABLE
postgres=# insert into ta_1  values(1,'tanaka');
INSERT 0 1
postgres=# select * from ta_1;
 id |  name
----+--------
  1 | tanaka
(1 行)

4. 监审日志确认
由于设置为”all”,所以所有执行的命令都已经被记录下来了。

[postgres@postgresql log]$ ll
合計 4
-rw-------. 1 postgres postgres 703 11月  9 00:37 postgresql-Wed.log
[postgres@postgresql log]$ tail -f postgresql-Wed.log
2022-11-09 00:37:54.859 EST [6934] LOG:  starting PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-10), 64-bit
2022-11-09 00:37:54.860 EST [6934] LOG:  listening on IPv6 address "::1", port 5432
2022-11-09 00:37:54.860 EST [6934] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2022-11-09 00:37:54.861 EST [6934] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2022-11-09 00:37:54.867 EST [6934] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2022-11-09 00:37:54.909 EST [6938] LOG:  database system was shut down at 2022-11-09 00:37:45 EST
2022-11-09 00:37:54.914 EST [6934] LOG:  database system is ready to accept connections
2022-11-09 00:38:50.259 EST [6945] LOG:  statement: create table ta_1(id integer,name varchar(10));
2022-11-09 00:38:53.761 EST [6945] LOG:  statement: insert into ta_1  values(1,'tanaka');
2022-11-09 00:38:57.202 EST [6945] LOG:  statement: select * from ta_1;

以上で,我们已经确认了所有的四个设置项目。
结束了!

广告
将在 10 秒后关闭
bannerAds