【发布时间】:2019-12-12 22:19:43
【问题描述】:
问题:
现在,我正在记录我的 SQL 查询和与该查询相关的 args,但如果我的 args 很重会发生什么?说100MB?
解决方案:
我想遍历 args,一旦它们超过 0.5MB,我想将 args 带到这一点并只记录它们(当然,我将使用实际 SQL 查询中设置的整个 args)。
卡在哪里:
- 我发现很难在磁盘上找到
interface{}的大小。 - 如何打印? (有比
%v更好的方法吗?)
关注点主要集中在第一部分,如何找到大小,我需要知道类型,如果是数组,堆栈,堆等。
如果代码有帮助,这是我的代码结构(所有内容都位于 util 文件中的 dal pkg 中):
package dal
import (
"fmt"
)
const limitedLogArgsSizeB = 100000 // ~ 0.1MB
func parsedArgs(args ...interface{}) string {
currentSize := 0
var res string
for i := 0; i < len(args); i++ {
currentEleSize := getSizeOfElement(args[i])
if !(currentSize+currentEleSize =< limitedLogArgsSizeB) {
break
}
currentSize += currentEleSize
res = fmt.Sprintf("%s, %v", res, args[i])
}
return "[" + res + "]"
}
func getSizeOfElement(interface{}) (sizeInBytes int) {
}
如您所见,我希望从 parsedArgs() 中返回一个字符串,如下所示:
“[4378233, 33, 真]”
为了完整起见,附带的查询:
INSERT INTO Person (id,age,is_healthy) VALUES ($0,$1,$2)
为了证明这一切的意义:
假设前两个 args 完全等于我要记录的大小限制的阈值,我只会从 parsedArgs() 中返回前两个 args 作为这样的字符串:
“[4378233, 33]”
我可以根据要求提供更多详细信息,谢谢:)
【问题讨论】:
-
如果我这样做,我会使用
len(fmt.Sprintf(", %v", e))作为 size ,但在日志中使用 ` ...` 表示 args 列表不完整 -
好点,我会记住的谢谢 :)
标签: go