限制 PostgreSQL 日志记录

Bru*_*uno 5 postgresql log bytea

我有一个可以包含相当大的BYTEA值的表(同样适用于大TEXT值)。它看起来像这样:

CREATE TABLE testtable (
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE NOT NULL, -- This is just an example: this could be the PK
    value BYTEA -- This could be TEXT
);
Run Code Online (Sandbox Code Playgroud)

如果使用此表的应用程序尝试使用相同的 插入两行name,我会在日志中收到此错误(当然,这是预期错误):

CREATE TABLE testtable (
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE NOT NULL, -- This is just an example: this could be the PK
    value BYTEA -- This could be TEXT
);
Run Code Online (Sandbox Code Playgroud)

虽然记录错误以及记录语句(在此特定上下文中可能还有“name”的值)很有用,但记录 longBYTEATEXTvalue 不是。事实上,日志中的二进制数据以文本形式(例如E'\\377\\327...')进行转义,这有效地使其比数据库中的二进制形式占用更多空间。当值的大小为数十 kB 或更多时,这可能会导致更多的问题而不是帮助。

有没有办法在出现错误时防止这些值出现在日志中?我仍然有兴趣知道有错误(最好有一些关于该语句的信息)。当然,这不仅仅是关于这个特定的错误和用例,而是任何可能在日志中转储数千字节无趣数据的错误日志。

否则,有没有办法截断“ STATEMENT: INSERT INTO ...”行?如果做不到这一点,是否有任何方法可以保留这ERROR:条线而STATEMENT:完全删除这条线?

我试过设置log_error_verbosity = tersein postgresql.conf,但这似乎并没有改变任何东西。

(我也使用log_destination = 'syslog'to log to rsyslog,因此将每个日志“捆绑”限制为几行的解决方案将是一个合理的妥协。)

我正在使用 PostgreSQL 8.4,但如果解决方案只出现在较新版本中也会很有趣。

fil*_*rem 1

是的,您可以在日志中隐藏这些消息。

在调用会话中,在运行该INSERT语句之前,发出以下语句:

SET log_min_messages TO log; 
Run Code Online (Sandbox Code Playgroud)

如果您仍想看到该ERROR:部分,并且仅隐藏该STATEMENT:部分,请使用另一个参数:

SET log_min_error_statement TO log; 
Run Code Online (Sandbox Code Playgroud)

请参阅文档

仅使用会话参数,您的应用程序必须知道哪些语句将被静默。从技术上讲,您可以使该设置永久化(在 postgresql.conf 中),但这不是一个好主意。在某些情况下,这将是一把步枪。