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