From 79a9a6ba640afee89e9e0669efeeb74146c003db Mon Sep 17 00:00:00 2001 From: houseme Date: Thu, 6 Apr 2023 00:17:39 +0800 Subject: [PATCH] feat: improve log code --- .gitignore | 2 +- go.mod | 7 +- go.sum | 55 +++++++++- imdada.go | 30 +++--- log.go | 116 +++++++++++++++++++++ log/logger.go | 249 --------------------------------------------- log/logger_test.go | 87 ---------------- 7 files changed, 191 insertions(+), 355 deletions(-) create mode 100644 log.go delete mode 100644 log/logger.go delete mode 100644 log/logger_test.go diff --git a/.gitignore b/.gitignore index 3dd598e..979dc56 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ -.log +*.log *_test.go \ No newline at end of file diff --git a/go.mod b/go.mod index 0c4fabd..72da5a6 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.19 require ( github.com/bytedance/sonic v1.8.7 github.com/cloudwego/hertz v0.6.1 + github.com/hertz-contrib/logger/zap v0.0.0-20230320032231-b153fe729ee7 github.com/natefinch/lumberjack v2.0.0+incompatible go.uber.org/zap v1.24.0 ) @@ -14,7 +15,7 @@ require ( github.com/andeya/ameda v1.5.3 // indirect github.com/andeya/goutil v1.0.1 // indirect github.com/bytedance/go-tagexpr/v2 v2.9.7 // indirect - github.com/bytedance/gopkg v0.0.0-20230320040348-5f61dd13ae7a // indirect + github.com/bytedance/gopkg v0.0.0-20230324090325-a00d8057bef9 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/cloudwego/netpoll v0.3.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -26,9 +27,9 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/sys v0.7.0 // indirect golang.org/x/text v0.8.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect diff --git a/go.sum b/go.sum index 9be0737..f43bd82 100644 --- a/go.sum +++ b/go.sum @@ -5,12 +5,16 @@ github.com/andeya/ameda v1.5.3/go.mod h1:FQDHRe1I995v6GG+8aJ7UIUToEmbdTJn/U26NCP github.com/andeya/goutil v1.0.1 h1:eiYwVyAnnK0dXU5FJsNjExkJW4exUGn/xefPt3k4eXg= github.com/andeya/goutil v1.0.1/go.mod h1:jEG5/QnnhG7yGxwFUX6Q+JGMif7sjdHmmNVjn7nhJDo= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM= github.com/bytedance/go-tagexpr/v2 v2.9.7 h1:y1b2Qv1fYFNpFEQ1jC3DCB2NZZNrKIpUYRiEj7TfUYE= github.com/bytedance/go-tagexpr/v2 v2.9.7/go.mod h1:SyfF2dfcKGKIfTL2trRu+LW4x2mH6ehuigpkvv9JtpY= github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= github.com/bytedance/gopkg v0.0.0-20230320040348-5f61dd13ae7a h1:U26UQTgPYXfdzWm7a/jHUeKwpGR8GNY/6nUeeydTZ6I= github.com/bytedance/gopkg v0.0.0-20230320040348-5f61dd13ae7a/go.mod h1:5tCTcGDVBC/YUpwmVUI14jYgkemT1CAeUyQe0J5DLUs= +github.com/bytedance/gopkg v0.0.0-20230324090325-a00d8057bef9 h1:YTSJ7dHOZHZJxCwj4WuLPAwKGIbWs2fiMY2CatwDToQ= +github.com/bytedance/gopkg v0.0.0-20230324090325-a00d8057bef9/go.mod h1:5tCTcGDVBC/YUpwmVUI14jYgkemT1CAeUyQe0J5DLUs= +github.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.8.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/bytedance/sonic v1.8.7 h1:d3sry5vGgVq/OpgozRUNP6xBsSo0mtNdwliApw+SAMQ= @@ -18,8 +22,10 @@ github.com/bytedance/sonic v1.8.7/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZX github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/cloudwego/hertz v0.3.2/go.mod h1:hnv3B7eZ6kMv7CKFHT2OC4LU0mA4s5XPyu/SbixLcrU= github.com/cloudwego/hertz v0.6.1 h1:wUk7Jq8OHZGjR+Ik2DNFsph0qZAvhLnXoTNH2W5HFsI= github.com/cloudwego/hertz v0.6.1/go.mod h1:83EedHQvCXpveYh2r9us8YlQ1C28vPg93wPdB/QpJiA= +github.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E= github.com/cloudwego/netpoll v0.3.1/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E= github.com/cloudwego/netpoll v0.3.2 h1:/998ICrNMVBo4mlul4j7qcIeY7QnEfuCCPPwck9S3X4= github.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= @@ -29,29 +35,41 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4= github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8/go.mod h1:Nhe/DM3671a5udlv2AdV2ni/MZzgfv2qrPL5nIi3EGQ= +github.com/hertz-contrib/logger/zap v0.0.0-20230320032231-b153fe729ee7 h1:v0AFqGJfauQgR2i0JR6W5D2ThusaWxzAfKBSQLavVhM= +github.com/hertz-contrib/logger/zap v0.0.0-20230320032231-b153fe729ee7/go.mod h1:kL1oi/2n+55rdmaYqKrb+CckS+jUVMwxVDhomebsa6c= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= github.com/nyaruka/phonenumbers v1.1.6 h1:DcueYq7QrOArAprAYNoQfDgp0KetO4LqtnBtQC6Wyes= github.com/nyaruka/phonenumbers v1.1.6/go.mod h1:yShPJHDSH3aTKzCbXyVxNpbl2kA+F+Ne5Pun/MvFRos= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -61,6 +79,7 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -69,20 +88,42 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -92,19 +133,31 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= diff --git a/imdada.go b/imdada.go index 275311c..3b74639 100644 --- a/imdada.go +++ b/imdada.go @@ -21,11 +21,11 @@ import ( "github.com/bytedance/sonic" "github.com/cloudwego/hertz/pkg/app/client" + "github.com/cloudwego/hertz/pkg/common/hlog" "github.com/cloudwego/hertz/pkg/protocol" "github.com/cloudwego/hertz/pkg/protocol/consts" "github.com/houseme/imdada-go/domain" - "github.com/houseme/imdada-go/log" ) // options is the configuration for the ImDada client. @@ -36,8 +36,8 @@ type options struct { Gateway string Callback string ShopNo string - LogPath string // 日志路径 - Level log.Level // 日志级别 + LogPath string // 日志路径 + Level hlog.Level // 日志级别 TimeOut time.Duration UserAgent []byte Debug bool @@ -117,7 +117,7 @@ func WithLogPath(logPath string) Option { } // WithLevel sets the log level. -func WithLevel(level log.Level) Option { +func WithLevel(level hlog.Level) Option { return func(o *options) { o.Level = level } @@ -127,7 +127,7 @@ func WithLevel(level log.Level) Option { type Client struct { request *domain.Request response *protocol.Response - log log.ILogger + log hlog.FullLogger op options gateway string } @@ -138,7 +138,7 @@ func New(ctx context.Context, opts ...Option) *Client { TimeOut: 5 * time.Second, UserAgent: []byte(userAgent), Gateway: gateway, - Level: log.DebugLevel, + Level: hlog.LevelDebug, LogPath: os.TempDir(), } @@ -146,9 +146,9 @@ func New(ctx context.Context, opts ...Option) *Client { option(&op) } - return &Client{ + c := &Client{ op: op, - log: log.New(ctx, log.WithLevel(op.Level), log.WithLogPath(op.LogPath)), + log: nil, response: &protocol.Response{}, request: &domain.Request{ AppKey: op.AppKey, @@ -157,6 +157,8 @@ func New(ctx context.Context, opts ...Option) *Client { SourceID: op.SourceID, }, } + c.initLog(ctx, op) + return c } // generateTimestamp Generate current time @@ -192,21 +194,21 @@ func (c *Client) initRequest(method string) { // doRequest does the request. func (c *Client) doRequest(ctx context.Context, method string) error { c.initRequest(method) - c.log.Debug(ctx, "request data: ", c.request) + c.log.CtxDebugf(ctx, "request data: %+v", c.request) jsonBytes, err := sonic.Marshal(c.request) if err != nil { return err } - c.log.Debug(ctx, "jsonBytes: ", string(jsonBytes)) + c.log.CtxDebugf(ctx, "jsonBytes: %s", string(jsonBytes)) request := &protocol.Request{} request.SetBody(jsonBytes) request.Header.SetContentTypeBytes([]byte("application/json")) request.Header.Set("accept", "application/json") - c.log.Debug(ctx, "request url: ", c.gateway) + c.log.CtxDebugf(ctx, "request url: %s", c.gateway) request.SetRequestURI(c.gateway) request.Header.SetMethod(consts.MethodPost) request.Header.SetUserAgentBytes(c.op.UserAgent) - c.log.Debug(ctx, "request create end") + c.log.CtxDebugf(ctx, "request create end") hertz, err := client.NewClient(client.WithTLSConfig(&tls.Config{ InsecureSkipVerify: true, @@ -215,7 +217,7 @@ func (c *Client) doRequest(ctx context.Context, method string) error { return err } - c.log.Debug(ctx, "do request start") + c.log.CtxDebugf(ctx, "do request start") if err = hertz.Do(ctx, request, c.response); err != nil { return err } @@ -230,7 +232,7 @@ func (c *Client) QueryBalance(ctx context.Context, req *domain.QueryBalanceReque if err = c.doRequest(ctx, queryBalance); err != nil { return nil, err } - c.log.Debug(ctx, "response data: ", string(c.response.Body())) + c.log.CtxDebugf(ctx, "response data: %s", string(c.response.Body())) if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { return nil, err } diff --git a/log.go b/log.go new file mode 100644 index 0000000..dcbeeb7 --- /dev/null +++ b/log.go @@ -0,0 +1,116 @@ +/* + * Copyright ImDaDa-Go Author(https://houseme.github.io/imdada-go/). All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Apache-2.0 License. + * If a copy of the MIT was not distributed with this file, + * You can obtain one at https://github.com/houseme/imdada-go. + */ + +package dada + +import ( + "context" + "os" + + "github.com/cloudwego/hertz/pkg/common/hlog" + hertzzap "github.com/hertz-contrib/logger/zap" + "github.com/natefinch/lumberjack" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +func (c *Client) initLog(ctx context.Context, op options) { + dynamicLevel := zap.NewAtomicLevel() + dynamicLevel.SetLevel(zap.DebugLevel) + logger := hertzzap.NewLogger( + hertzzap.WithCores([]hertzzap.CoreConfig{ + { + Enc: zapcore.NewConsoleEncoder(humanEncoderConfig()), + Ws: os.Stdout, + Lvl: dynamicLevel, + }, + { + Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), + Ws: getWriteSyncer(op.LogPath + "/all.log"), + Lvl: zap.NewAtomicLevelAt(zapcore.DebugLevel), + }, + { + Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), + Ws: getWriteSyncer(op.LogPath + "/debug.log"), + Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( + zap.LevelEnablerFunc(func(lev zapcore.Level) bool { + return lev == zap.DebugLevel + }))), + }, + { + Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), + Ws: getWriteSyncer(op.LogPath + "/info.log"), + Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( + zap.LevelEnablerFunc(func(lev zapcore.Level) bool { + return lev == zap.InfoLevel + }))), + }, + { + Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), + Ws: getWriteSyncer(op.LogPath + "/warn.log"), + Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( + zap.LevelEnablerFunc(func(lev zapcore.Level) bool { + return lev == zap.WarnLevel + }))), + }, + { + Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), + Ws: getWriteSyncer(op.LogPath + "/error.log"), + Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( + zap.LevelEnablerFunc(func(lev zapcore.Level) bool { + return lev >= zap.ErrorLevel + }))), + }, + }...), + ) + defer logger.Sync() + hlog.SetLogger(logger) + hlog.SetLevel(op.Level) + c.log = logger + c.log.SetLevel(op.Level) + c.log.CtxInfof(ctx, "im dada init log start level:%s", op.Level) +} + +// humanEncoderConfig copy from zap +func humanEncoderConfig() zapcore.EncoderConfig { + cfg := encoderConfig() + cfg.EncodeTime = zapcore.ISO8601TimeEncoder + cfg.EncodeLevel = zapcore.CapitalLevelEncoder + cfg.EncodeDuration = zapcore.StringDurationEncoder + return cfg +} + +func getWriteSyncer(file string) zapcore.WriteSyncer { + lumberJackLogger := &lumberjack.Logger{ + Filename: file, + MaxSize: 10, + MaxBackups: 50000, + MaxAge: 1000, + Compress: true, + LocalTime: true, + } + return zapcore.AddSync(lumberJackLogger) +} + +// encoderConfig encoder config for testing, copy from zap +func encoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + NameKey: "name", + TimeKey: "ts", + CallerKey: "caller", + FunctionKey: "func", + StacktraceKey: "stacktrace", + LineEnding: "\n", + EncodeTime: zapcore.EpochTimeEncoder, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} diff --git a/log/logger.go b/log/logger.go deleted file mode 100644 index 93b28a1..0000000 --- a/log/logger.go +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright ImDaDa-Go Author(https://houseme.github.io/imdada-go/). All Rights Reserved. - * - * This Source Code Form is subject to the terms of the Apache-2.0 License. - * If a copy of the MIT was not distributed with this file, - * You can obtain one at https://github.com/houseme/imdada-go. - */ - -// Package log is the logger. -package log - -import ( - "context" - "errors" - "os" - - "github.com/natefinch/lumberjack" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -// ILogger is the interface for logger -type ILogger interface { - Print(ctx context.Context, v ...interface{}) - Printf(ctx context.Context, format string, v ...interface{}) - Debug(ctx context.Context, v ...interface{}) - Debugf(ctx context.Context, format string, v ...interface{}) - Info(ctx context.Context, v ...interface{}) - Infof(ctx context.Context, format string, v ...interface{}) - Notice(ctx context.Context, v ...interface{}) - Noticef(ctx context.Context, format string, v ...interface{}) - Warning(ctx context.Context, v ...interface{}) - Warningf(ctx context.Context, format string, v ...interface{}) - Error(ctx context.Context, v ...interface{}) - Errorf(ctx context.Context, format string, v ...interface{}) - Critical(ctx context.Context, v ...interface{}) - Criticalf(ctx context.Context, format string, v ...interface{}) - Panic(ctx context.Context, v ...interface{}) - Panicf(ctx context.Context, format string, v ...interface{}) - Fatal(ctx context.Context, v ...interface{}) - Fatalf(ctx context.Context, format string, v ...interface{}) -} - -var ( - // ErrInvalidKey is the error for invalid key. - ErrInvalidKey = errors.New("invalid key") -) - -const ( - // DebugLevel logs are typically voluminous, and are usually disabled in - // production. - DebugLevel = Level(zap.DebugLevel) - // InfoLevel is the default logging priority. - InfoLevel = Level(zap.InfoLevel) - // WarnLevel logs are more important than Info, but don't need individual - // human review. - WarnLevel = Level(zap.WarnLevel) - // ErrorLevel logs are high-priority. If an application is running smoothly, - // it shouldn't generate any error-level logs. - ErrorLevel = Level(zap.ErrorLevel) - // DPanicLevel logs are particularly important errors. In development the - // logger panics after writing the message. - DPanicLevel = Level(zap.DPanicLevel) - // PanicLevel logs a message, then panics. - PanicLevel = Level(zap.PanicLevel) - // FatalLevel logs a message, then calls os.Exit(1). - FatalLevel = Level(zapcore.FatalLevel) -) - -type ( - // Level is the level of logger. - Level zapcore.Level - // Logger is the global logger instance. - Logger struct { - op options - level Level - log *zap.SugaredLogger - } - options struct { - LogPath string - Level Level - } - // Option is the option for logger. - Option func(o *options) -) - -// WithLogPath is the option for log path. -func WithLogPath(path string) Option { - return func(o *options) { - o.LogPath = path - } -} - -// WithLevel is the option for log level. -func WithLevel(level Level) Option { - return func(o *options) { - o.Level = level - } -} - -// New is the global logger instance. -func New(_ context.Context, opts ...Option) *Logger { - var ( - coreArr []zapcore.Core - op = options{ - LogPath: os.TempDir(), - Level: InfoLevel, - } - ) - for _, option := range opts { - option(&op) - } - - // 获取编码器 - encoderConfig := zap.NewProductionEncoderConfig() // NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式 - encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 指定时间格式 - encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder // 按级别显示不同颜色,不需要的话取值zapcore.CapitalLevelEncoder就可以了 - encoderConfig.EncodeCaller = zapcore.FullCallerEncoder // 显示完整文件路径 - encoderConfig.EncodeDuration = zapcore.MillisDurationEncoder // 指定时间格式 - encoderConfig.EncodeName = zapcore.FullNameEncoder // 显示完整文件路径 - encoder := zapcore.NewConsoleEncoder(encoderConfig) // 创建一个文件输出器,参数是指定文件路径,不存在则创建 - - // 日志级别 - highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { // error级别 - return lev >= zap.ErrorLevel - }) - if op.Level <= InfoLevel { - lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { // info和debug级别,debug级别是最低的 - return lev < zap.ErrorLevel && lev >= zap.DebugLevel - }) - - // info文件writeSyncer - infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ - Filename: op.LogPath + "/log/info.log", // 日志文件存放目录,如果文件夹不存在会自动创建 - MaxSize: 2, // 文件大小限制,单位MB - MaxBackups: 100, // 最大保留日志文件数量 - MaxAge: 30, // 日志文件保留天数 - Compress: false, // 是否压缩处理 - }) - infoFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer, zapcore.AddSync(os.Stdout)), lowPriority) // 第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 - coreArr = append(coreArr, infoFileCore) - } - // error文件writeSyncer - errorFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ - Filename: op.LogPath + "/log/error.log", // 日志文件存放目录 - MaxSize: 1, // 文件大小限制,单位MB - MaxBackups: 5, // 最大保留日志文件数量 - MaxAge: 30, // 日志文件保留天数 - Compress: false, // 是否压缩处理 - }) - errorFileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(errorFileWriteSyncer, zapcore.AddSync(os.Stdout)), highPriority) // 第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 - - coreArr = append(coreArr, errorFileCore) - zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()).Log(zap.InfoLevel, "logger init success") - return &Logger{ - level: op.Level, - log: zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()).Sugar(), // zap.AddCaller()为显示文件名和行号,可省略 - } -} - -// Print is the interface for print -func (l *Logger) Print(ctx context.Context, v ...interface{}) { - l.log.Info(v...) -} - -// Printf is the interface for printf -func (l *Logger) Printf(ctx context.Context, format string, v ...interface{}) { - l.log.Infof(format, v...) -} - -// Debug is the interface for debug -func (l *Logger) Debug(ctx context.Context, v ...interface{}) { - l.log.Debug(v...) -} - -// Debugf is the interface for debugf -func (l *Logger) Debugf(ctx context.Context, format string, v ...interface{}) { - l.log.Debugf(format, v...) -} - -// Info is the interface for info -func (l *Logger) Info(ctx context.Context, v ...interface{}) { - l.log.Info(v...) -} - -// Infof is the interface for infof -func (l *Logger) Infof(ctx context.Context, format string, v ...interface{}) { - l.log.Infof(format, v...) -} - -// Notice is the interface for notice -func (l *Logger) Notice(ctx context.Context, v ...interface{}) { - l.log.Info(v...) -} - -// Noticef is the interface for noticef -func (l *Logger) Noticef(ctx context.Context, format string, v ...interface{}) { - l.log.Infof(format, v...) -} - -// Warning is the interface for warning -func (l *Logger) Warning(ctx context.Context, v ...interface{}) { - l.log.Warn(v...) -} - -// Warningf is the interface for warningf -func (l *Logger) Warningf(ctx context.Context, format string, v ...interface{}) { - l.log.Warnf(format, v...) -} - -// Error is the interface for error -func (l *Logger) Error(ctx context.Context, v ...interface{}) { - l.log.Error(v...) -} - -// Errorf is the interface for errorf -func (l *Logger) Errorf(ctx context.Context, format string, v ...interface{}) { - l.log.Errorf(format, v...) -} - -// Critical is the interface for critical -func (l *Logger) Critical(ctx context.Context, v ...interface{}) { - l.log.Fatal(v...) -} - -// Criticalf is the interface for criticalf -func (l *Logger) Criticalf(ctx context.Context, format string, v ...interface{}) { - l.log.Fatalf(format, v...) -} - -// Panic is the interface for panic -func (l *Logger) Panic(ctx context.Context, v ...interface{}) { - l.log.Panic(v...) -} - -// Panicf is the interface for panicf -func (l *Logger) Panicf(ctx context.Context, format string, v ...interface{}) { - l.log.Panicf(format, v...) -} - -// Fatal is the interface for fatal -func (l *Logger) Fatal(ctx context.Context, v ...interface{}) { - l.log.Fatal(v...) -} - -// Fatalf is the interface for fatalf -func (l *Logger) Fatalf(ctx context.Context, format string, v ...interface{}) { - l.log.Fatalf(format, v...) -} diff --git a/log/logger_test.go b/log/logger_test.go deleted file mode 100644 index c244589..0000000 --- a/log/logger_test.go +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright ImDaDa-Go Author(https://houseme.github.io/imdada-go/). All Rights Reserved. - * - * This Source Code Form is subject to the terms of the Apache-2.0 License. - * If a copy of the MIT was not distributed with this file, - * You can obtain one at https://github.com/houseme/imdada-go. - */ - -package log - -import ( - "context" - "os" - "reflect" - "testing" - "time" - - "go.uber.org/zap" -) - -func TestNew(t *testing.T) { - type args struct { - in0 context.Context - opts []Option - } - var ( - opts = []Option{WithLogPath(os.TempDir()), WithLevel(DebugLevel)} - ctx = context.Background() - want = New(ctx, opts...) - ) - - tests := []struct { - name string - args args - want *Logger - }{ - { - name: "TestNew", - args: args{ - in0: ctx, - opts: opts, - }, - want: want, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := New(tt.args.in0, tt.args.opts...); reflect.DeepEqual(got, tt.want) { - t.Errorf("New() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestLogger_Debug(t *testing.T) { - type fields struct { - op options - level Level - log *zap.Logger - } - type args struct { - ctx context.Context - v []interface{} - } - var ( - opts = []Option{WithLogPath(os.TempDir()), WithLevel(DebugLevel)} - ctx = context.Background() - want = New(ctx, opts...) - ) - tests := []struct { - name string - fields fields - args args - }{ - { - name: "TestLogger_Debug", - args: args{ - ctx: ctx, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - want.Debug(tt.args.ctx, "xxxx,", "ces time: ", time.Now().Format("20221015181222")) - }) - } -}