-
Notifications
You must be signed in to change notification settings - Fork 49
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add strings and sql log. (#24)
* optimization: slice sub. * fix: rpc logger add more detail info. * feat: add msg gateway error. * refactor: separate functions with error containing message and error with only stack trace. * feat: add stdout and stderr info. * feat: add strings and sql log.
- Loading branch information
1 parent
eab6641
commit 0edcd3c
Showing
8 changed files
with
265 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Copyright © 2023 OpenIM. All rights reserved. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package log | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"time" | ||
|
||
"github.com/pkg/errors" | ||
"gorm.io/gorm" | ||
gormLogger "gorm.io/gorm/logger" | ||
gormUtils "gorm.io/gorm/utils" | ||
) | ||
|
||
type SqlLogger struct { | ||
LogLevel gormLogger.LogLevel | ||
IgnoreRecordNotFoundError bool | ||
SlowThreshold time.Duration | ||
} | ||
|
||
func NewSqlLogger(logLevel gormLogger.LogLevel, ignoreRecordNotFoundError bool, slowThreshold time.Duration) *SqlLogger { | ||
return &SqlLogger{ | ||
LogLevel: logLevel, | ||
IgnoreRecordNotFoundError: ignoreRecordNotFoundError, | ||
SlowThreshold: slowThreshold, | ||
} | ||
} | ||
|
||
func (l *SqlLogger) LogMode(logLevel gormLogger.LogLevel) gormLogger.Interface { | ||
newLogger := *l | ||
newLogger.LogLevel = logLevel | ||
return &newLogger | ||
} | ||
|
||
func (SqlLogger) Info(ctx context.Context, msg string, args ...interface{}) { | ||
ZInfo(ctx, msg, args) | ||
} | ||
|
||
func (SqlLogger) Warn(ctx context.Context, msg string, args ...interface{}) { | ||
ZWarn(ctx, msg, nil, args) | ||
} | ||
|
||
func (SqlLogger) Error(ctx context.Context, msg string, args ...interface{}) { | ||
ZError(ctx, msg, nil, args) | ||
} | ||
|
||
func (l *SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { | ||
if l.LogLevel <= gormLogger.Silent { | ||
return | ||
} | ||
elapsed := time.Since(begin) | ||
switch { | ||
case err != nil && l.LogLevel >= gormLogger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError): | ||
sql, rows := fc() | ||
if rows == -1 { | ||
ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql) | ||
} else { | ||
ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) | ||
} | ||
case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= gormLogger.Warn: | ||
sql, rows := fc() | ||
slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) | ||
if rows == -1 { | ||
ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql) | ||
} else { | ||
ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) | ||
} | ||
case l.LogLevel == gormLogger.Info: | ||
sql, rows := fc() | ||
if rows == -1 { | ||
ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql) | ||
} else { | ||
ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// Copyright © 2023 OpenIM. All rights reserved. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package log | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
) | ||
|
||
type ZkLogger struct{} | ||
|
||
func NewZkLogger() *ZkLogger { | ||
return &ZkLogger{} | ||
} | ||
|
||
func (l *ZkLogger) Printf(format string, a ...interface{}) { | ||
ZInfo(context.Background(), "zookeeper output", "msg", fmt.Sprintf(format, a...)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
// Copyright © 2023 OpenIM. All rights reserved. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package utils | ||
|
||
import ( | ||
"encoding/json" | ||
"strconv" | ||
) | ||
|
||
func IntToString(i int) string { | ||
return strconv.FormatInt(int64(i), 10) | ||
} | ||
|
||
func StringToInt(i string) int { | ||
j, _ := strconv.Atoi(i) | ||
return j | ||
} | ||
func StringToInt64(i string) int64 { | ||
j, _ := strconv.ParseInt(i, 10, 64) | ||
return j | ||
} | ||
func StringToInt32(i string) int32 { | ||
j, _ := strconv.ParseInt(i, 10, 64) | ||
return int32(j) | ||
} | ||
func Int32ToString(i int32) string { | ||
return strconv.FormatInt(int64(i), 10) | ||
} | ||
|
||
func Uint32ToString(i uint32) string { | ||
return strconv.FormatInt(int64(i), 10) | ||
} | ||
|
||
// judge a string whether in the string list | ||
func IsContain(target string, List []string) bool { | ||
for _, element := range List { | ||
|
||
if target == element { | ||
return true | ||
} | ||
} | ||
return false | ||
} | ||
func IsContainInt32(target int32, List []int32) bool { | ||
for _, element := range List { | ||
if target == element { | ||
return true | ||
} | ||
} | ||
return false | ||
} | ||
func IsContainInt(target int, List []int) bool { | ||
for _, element := range List { | ||
if target == element { | ||
return true | ||
} | ||
} | ||
return false | ||
} | ||
func InterfaceArrayToStringArray(data []interface{}) (i []string) { | ||
for _, param := range data { | ||
i = append(i, param.(string)) | ||
} | ||
return i | ||
} | ||
|
||
func StructToJsonBytes(param interface{}) []byte { | ||
dataType, _ := json.Marshal(param) | ||
return dataType | ||
} | ||
|
||
// The incoming parameter must be a pointer | ||
func JsonStringToStruct(s string, args interface{}) error { | ||
err := json.Unmarshal([]byte(s), args) | ||
return err | ||
} | ||
|
||
func Int64ToString(i int64) string { | ||
return strconv.FormatInt(i, 10) | ||
} | ||
|
||
func RemoveDuplicateElement(idList []string) []string { | ||
result := make([]string, 0, len(idList)) | ||
temp := map[string]struct{}{} | ||
for _, item := range idList { | ||
if _, ok := temp[item]; !ok { | ||
temp[item] = struct{}{} | ||
result = append(result, item) | ||
} | ||
} | ||
return result | ||
} | ||
|
||
func RemoveDuplicate[T comparable](arr []T) []T { | ||
result := make([]T, 0, len(arr)) | ||
temp := map[T]struct{}{} | ||
for _, item := range arr { | ||
if _, ok := temp[item]; !ok { | ||
temp[item] = struct{}{} | ||
result = append(result, item) | ||
} | ||
} | ||
return result | ||
} | ||
|
||
func IsDuplicateStringSlice(arr []string) bool { | ||
t := make(map[string]struct{}) | ||
for _, s := range arr { | ||
if _, ok := t[s]; ok { | ||
return true | ||
} | ||
t[s] = struct{}{} | ||
} | ||
return false | ||
} |