下面是@Patrik建議的方法的實現,該方法可用於針對PostgreSQL的插入和更新。正則表達式可能需要根據其他數據庫的SQL格式進行調整。
class ActiveRecord::ConnectionAdapters::AbstractAdapter
protected
def log_with_binary_truncate(sql, name="SQL", binds=[], &block)
binds = binds.map do |col, data|
if col.type == :binary && data.is_a?(String) && data.size > 27
data = "#{data[0,10]}[REDACTED #{data.size - 20} bytes]#{data[-10,10]}"
end
[col, data]
end
sql = sql.gsub(/(?<='\\x[0-9a-f]{20})[0-9a-f]{20,}?(?=[0-9a-f]{20}')/) do |match|
"[REDACTED #{match.size} chars]"
end
log_without_binary_truncate(sql, name, binds, &block)
end
alias_method_chain :log, :binary_truncate
end
我對此並不滿意,但現在已經足夠了。它保留二進制字符串的第一個和最後10個字節,並指示從中間移除了多少個字節/字符。它不會編輯,除非編輯的文本比替換的文本長(即如果沒有至少20個字符要刪除,那麼「[編輯xx字符]」會比替換的文本更長,所以沒有意義) 。我沒有進行性能測試,以確定對編輯塊使用貪婪還是懶惰重複的速度更快。我的直覺是懶惰,所以我做了,但是貪婪可能會更快,特別是如果SQL中只有一個二進制字段。
有一個選項可以像密碼一樣過濾,不知道這是否有幫助。你會考慮重寫ActiveRecord執行hacky嗎?如果不是那麼你的提示。 –