parent
3f2c51b56e
commit
c243e54e2b
@ -0,0 +1,50 @@ |
||||
package log |
||||
|
||||
import ( |
||||
"bytes" |
||||
"fmt" |
||||
"strconv" |
||||
"strings" |
||||
) |
||||
|
||||
type verboseModule map[string]int32 |
||||
|
||||
type logFilter []string |
||||
|
||||
func (f *logFilter) String() string { |
||||
return fmt.Sprint(*f) |
||||
} |
||||
|
||||
// Set sets the value of the named command-line flag.
|
||||
// format: -log.filter key1,key2
|
||||
func (f *logFilter) Set(value string) error { |
||||
for _, i := range strings.Split(value, ",") { |
||||
*f = append(*f, strings.TrimSpace(i)) |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func (m verboseModule) String() string { |
||||
// FIXME strings.Builder
|
||||
var buf bytes.Buffer |
||||
for k, v := range m { |
||||
buf.WriteString(k) |
||||
buf.WriteString(strconv.FormatInt(int64(v), 10)) |
||||
buf.WriteString(",") |
||||
} |
||||
return buf.String() |
||||
} |
||||
|
||||
// Set sets the value of the named command-line flag.
|
||||
// format: -log.module file=1,file2=2
|
||||
func (m verboseModule) Set(value string) error { |
||||
for _, i := range strings.Split(value, ",") { |
||||
kv := strings.Split(i, "=") |
||||
if len(kv) == 2 { |
||||
if v, err := strconv.ParseInt(kv[1], 10, 64); err == nil { |
||||
m[strings.TrimSpace(kv[0])] = int32(v) |
||||
} |
||||
} |
||||
} |
||||
return nil |
||||
} |
@ -0,0 +1,61 @@ |
||||
package log |
||||
|
||||
import ( |
||||
"context" |
||||
"io/ioutil" |
||||
"os" |
||||
|
||||
"github.com/sirupsen/logrus" |
||||
) |
||||
|
||||
func init() { |
||||
redirectLogrus() |
||||
} |
||||
|
||||
func redirectLogrus() { |
||||
// FIXME: because of different stack depth call runtime.Caller will get error function name.
|
||||
logrus.AddHook(redirectHook{}) |
||||
if os.Getenv("LOGRUS_STDOUT") == "" { |
||||
logrus.SetOutput(ioutil.Discard) |
||||
} |
||||
} |
||||
|
||||
type redirectHook struct{} |
||||
|
||||
func (redirectHook) Levels() []logrus.Level { |
||||
return logrus.AllLevels |
||||
} |
||||
|
||||
func (redirectHook) Fire(entry *logrus.Entry) error { |
||||
lv := _infoLevel |
||||
var logrusLv string |
||||
var verbose int32 |
||||
switch entry.Level { |
||||
case logrus.FatalLevel, logrus.PanicLevel: |
||||
logrusLv = entry.Level.String() |
||||
fallthrough |
||||
case logrus.ErrorLevel: |
||||
lv = _errorLevel |
||||
case logrus.WarnLevel: |
||||
lv = _warnLevel |
||||
case logrus.InfoLevel: |
||||
lv = _infoLevel |
||||
case logrus.DebugLevel: |
||||
// use verbose log replace of debuglevel
|
||||
verbose = 10 |
||||
} |
||||
args := make([]D, 0, len(entry.Data)+1) |
||||
args = append(args, D{Key: _log, Value: entry.Message}) |
||||
for k, v := range entry.Data { |
||||
args = append(args, D{Key: k, Value: v}) |
||||
} |
||||
if logrusLv != "" { |
||||
args = append(args, D{Key: "logrus_lv", Value: logrusLv}) |
||||
} |
||||
if verbose != 0 { |
||||
V(verbose).Infov(context.Background(), args...) |
||||
} else { |
||||
h.Log(context.Background(), lv, args...) |
||||
} |
||||
return nil |
||||
} |
@ -0,0 +1,54 @@ |
||||
package log |
||||
|
||||
import ( |
||||
"reflect" |
||||
"strings" |
||||
"testing" |
||||
"time" |
||||
) |
||||
|
||||
func TestFuncName(t *testing.T) { |
||||
name := funcName(1) |
||||
if !strings.Contains(name, "util_test.go:11") { |
||||
t.Errorf("expect contains util_test.go:11 got %s", name) |
||||
} |
||||
} |
||||
|
||||
func Test_toMap(t *testing.T) { |
||||
type args struct { |
||||
args []D |
||||
} |
||||
tests := []struct { |
||||
name string |
||||
args args |
||||
want map[string]interface{} |
||||
}{ |
||||
{ |
||||
args: args{[]D{KVString("test", "hello")}}, |
||||
want: map[string]interface{}{"test": "hello"}, |
||||
}, |
||||
{ |
||||
args: args{[]D{KVInt64("test", 123)}}, |
||||
want: map[string]interface{}{"test": int64(123)}, |
||||
}, |
||||
{ |
||||
args: args{[]D{KVFloat32("test", float32(1.01))}}, |
||||
want: map[string]interface{}{"test": float32(1.01)}, |
||||
}, |
||||
{ |
||||
args: args{[]D{KVFloat32("test", float32(1.01))}}, |
||||
want: map[string]interface{}{"test": float32(1.01)}, |
||||
}, |
||||
{ |
||||
args: args{[]D{KVDuration("test", time.Second)}}, |
||||
want: map[string]interface{}{"test": time.Second}, |
||||
}, |
||||
} |
||||
for _, tt := range tests { |
||||
t.Run(tt.name, func(t *testing.T) { |
||||
if got := toMap(tt.args.args...); !reflect.DeepEqual(got, tt.want) { |
||||
t.Errorf("toMap() = %v, want %v", got, tt.want) |
||||
} |
||||
}) |
||||
} |
||||
} |
Loading…
Reference in new issue