-
Notifications
You must be signed in to change notification settings - Fork 1
/
logger.go
68 lines (55 loc) · 1.67 KB
/
logger.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
package kmodules
import (
"github.com/relationsone/gomini"
"github.com/apex/log"
"fmt"
)
const kmoduleLoggerId = "3c6bddf9-7c84-41c4-8796-22379c4a5e29"
type kmoduleLogger struct {
}
func NewLoggerModule() gomini.KernelModule {
return &kmoduleLogger{}
}
func (*kmoduleLogger) ID() string {
return kmoduleLoggerId
}
func (*kmoduleLogger) Name() string {
return "logger"
}
func (*kmoduleLogger) ApiDefinitionFile() string {
return "/kernel/@types/logger"
}
func (*kmoduleLogger) SecurityInterceptor() gomini.SecurityInterceptor {
return func(caller gomini.Bundle, property string) bool {
// Everyone's supposed to use the logger API
return true
}
}
func (*kmoduleLogger) KernelModuleBinder() gomini.KernelModuleBinder {
return func(bundle gomini.Bundle, builder gomini.ObjectBuilder) {
consoleBuilder := func(builder gomini.ObjectBuilder) {
method := func(call gomini.FunctionCall) gomini.Value {
sandbox := bundle.Sandbox()
if len(call.Arguments) < 1 {
return bundle.NewTypeError("info called without arguments")
}
msg := call.Argument(0).String()
if len(call.Arguments) > 1 {
args := make([]interface{}, len(call.Arguments)-1)
for i := 1; i < len(call.Arguments); i++ {
args[i-1] = call.Argument(i)
}
msg = fmt.Sprintf(msg, args...)
}
stackFrames := sandbox.CaptureCallStack(1)
frame := stackFrames[0]
pos := frame.Position()
log.Infof("%s#%s[%d:%d]: %s", frame.SrcName(), frame.FuncName(), pos.Line, pos.Col, msg)
return bundle.Undefined()
}
builder.DefineFunction("info", "info", method).
DefineFunction("log", "log", method)
}
builder.DefineObjectProperty("console", consoleBuilder)
}
}