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”的值)很有用,但记录 longBYTEA
或TEXT
value 不是。事实上,日志中的二进制数据以文本形式(例如E'\\377\\327...'
)进行转义,这有效地使其比数据库中的二进制形式占用更多空间。当值的大小为数十 kB 或更多时,这可能会导致更多的问题而不是帮助。
有没有办法在出现错误时防止这些值出现在日志中?我仍然有兴趣知道有错误(最好有一些关于该语句的信息)。当然,这不仅仅是关于这个特定的错误和用例,而是任何可能在日志中转储数千字节无趣数据的错误日志。
否则,有没有办法截断“ STATEMENT: INSERT INTO ...
”行?如果做不到这一点,是否有任何方法可以保留这ERROR:
条线而STATEMENT:
完全删除这条线?
我试过设置log_error_verbosity = terse
in postgresql.conf
,但这似乎并没有改变任何东西。
(我也使用log_destination = 'syslog'
to log to rsyslog
,因此将每个日志“捆绑”限制为几行的解决方案将是一个合理的妥协。)
我正在使用 PostgreSQL 8.4,但如果解决方案只出现在较新版本中也会很有趣。
是的,您可以在日志中隐藏这些消息。
在调用会话中,在运行该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 中),但这不是一个好主意。在某些情况下,这将是一把步枪。
归档时间: |
|
查看次数: |
603 次 |
最近记录: |