-
Notifications
You must be signed in to change notification settings - Fork 0
/
caller_hook.go
70 lines (59 loc) · 1.79 KB
/
caller_hook.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
///
// Copyright 2019 Insolar Technologies
//
// 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 zlogadapter
import (
"github.com/rs/zerolog"
"runtime"
"strings"
)
// FuncFieldName is the field name used for func field.
var FuncFieldName = "func"
type callerHook struct {
callerSkipFrameCount int
}
func newCallerHook(skipFrameCount int) *callerHook {
return &callerHook{callerSkipFrameCount: skipFrameCount}
}
// Run implements zerolog.Hook.
func (ch *callerHook) Run(e *zerolog.Event, level zerolog.Level, msg string) {
if level == zerolog.NoLevel {
return
}
info := getCallInfo(ch.callerSkipFrameCount)
e.Str(zerolog.CallerFieldName, info.fileName)
e.Str(FuncFieldName, info.funcName)
}
// callInfo bundles the info about the call environment
// when a logging statement occurred.
type callInfo struct {
fileName string
funcName string
line int
}
func getCallInfo(skipCallNumber int) *callInfo {
pc, file, line, _ := runtime.Caller(skipCallNumber)
parts := strings.Split(runtime.FuncForPC(pc).Name(), ".")
pl := len(parts)
funcName := parts[pl-1]
if pl > 1 && strings.HasPrefix(parts[pl-2], "(") {
funcName = parts[pl-2] + "." + funcName
}
return &callInfo{
fileName: trimInsolarPrefix(file, line),
funcName: funcName,
line: line,
}
}