mirror of
https://github.com/v2ray/v2ray-core.git
synced 2026-10-27 16:04:24 +00:00
lazy evaluation of log fields
This commit is contained in:
@@ -27,7 +27,7 @@ func (this *accessLog) String() string {
|
||||
func InitAccessLogger(file string) error {
|
||||
logger, err := newFileLogWriter(file)
|
||||
if err != nil {
|
||||
Error("Failed to create access logger on file (%s): %v", file, err)
|
||||
Error("Failed to create access logger on file (", file, "): ", file, err)
|
||||
return err
|
||||
}
|
||||
accessLoggerInstance = logger
|
||||
|
||||
+21
-15
@@ -2,6 +2,8 @@ package log
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -13,16 +15,24 @@ const (
|
||||
|
||||
type errorLog struct {
|
||||
prefix string
|
||||
format string
|
||||
values []interface{}
|
||||
}
|
||||
|
||||
func (this *errorLog) String() string {
|
||||
var data string
|
||||
if len(this.values) == 0 {
|
||||
data = this.format
|
||||
} else {
|
||||
data = fmt.Sprintf(this.format, this.values...)
|
||||
data := ""
|
||||
for _, value := range this.values {
|
||||
switch typedVal := value.(type) {
|
||||
case string:
|
||||
data += typedVal
|
||||
case *string:
|
||||
data += *typedVal
|
||||
case serial.String:
|
||||
data += typedVal.String()
|
||||
case error:
|
||||
data += typedVal.Error()
|
||||
default:
|
||||
data += fmt.Sprintf("%v", value)
|
||||
}
|
||||
}
|
||||
return this.prefix + data
|
||||
}
|
||||
@@ -64,7 +74,7 @@ func SetLogLevel(level LogLevel) {
|
||||
func InitErrorLogger(file string) error {
|
||||
logger, err := newFileLogWriter(file)
|
||||
if err != nil {
|
||||
Error("Failed to create error logger on file (%s): %v", file, err)
|
||||
Error("Failed to create error logger on file (", file, "): ", err)
|
||||
return err
|
||||
}
|
||||
streamLoggerInstance = logger
|
||||
@@ -72,37 +82,33 @@ func InitErrorLogger(file string) error {
|
||||
}
|
||||
|
||||
// Debug outputs a debug log with given format and optional arguments.
|
||||
func Debug(format string, v ...interface{}) {
|
||||
func Debug(v ...interface{}) {
|
||||
debugLogger.Log(&errorLog{
|
||||
prefix: "[Debug]",
|
||||
format: format,
|
||||
values: v,
|
||||
})
|
||||
}
|
||||
|
||||
// Info outputs an info log with given format and optional arguments.
|
||||
func Info(format string, v ...interface{}) {
|
||||
func Info(v ...interface{}) {
|
||||
infoLogger.Log(&errorLog{
|
||||
prefix: "[Info]",
|
||||
format: format,
|
||||
values: v,
|
||||
})
|
||||
}
|
||||
|
||||
// Warning outputs a warning log with given format and optional arguments.
|
||||
func Warning(format string, v ...interface{}) {
|
||||
func Warning(v ...interface{}) {
|
||||
warningLogger.Log(&errorLog{
|
||||
prefix: "[Warning]",
|
||||
format: format,
|
||||
values: v,
|
||||
})
|
||||
}
|
||||
|
||||
// Error outputs an error log with given format and optional arguments.
|
||||
func Error(format string, v ...interface{}) {
|
||||
func Error(v ...interface{}) {
|
||||
errorLogger.Log(&errorLog{
|
||||
prefix: "[Error]",
|
||||
format: format,
|
||||
values: v,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"log"
|
||||
"testing"
|
||||
|
||||
"github.com/v2ray/v2ray-core/common/serial"
|
||||
v2testing "github.com/v2ray/v2ray-core/testing"
|
||||
"github.com/v2ray/v2ray-core/testing/assert"
|
||||
)
|
||||
@@ -28,11 +29,11 @@ func TestStreamLogger(t *testing.T) {
|
||||
infoLogger = &stdOutLogWriter{
|
||||
logger: log.New(buffer, "", 0),
|
||||
}
|
||||
Info("Test %s Format", "Stream Logger")
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte("[Info]Test Stream Logger Format\n"))
|
||||
Info("Test ", "Stream Logger", " Format")
|
||||
assert.StringLiteral(string(buffer.Bytes())).Equals("[Info]Test Stream Logger Format\n")
|
||||
|
||||
buffer.Reset()
|
||||
errorLogger = infoLogger
|
||||
Error("Test No Format")
|
||||
assert.Bytes(buffer.Bytes()).Equals([]byte("[Error]Test No Format\n"))
|
||||
Error("Test ", serial.StringLiteral("literal"), " Format")
|
||||
assert.StringLiteral(string(buffer.Bytes())).Equals("[Error]Test literal Format\n")
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ func IPAddress(ip []byte) Address {
|
||||
}
|
||||
return &addr
|
||||
default:
|
||||
log.Error("Invalid IP format: %v", ip)
|
||||
log.Error("Invalid IP format: ", ip)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ func (this *PortRange) UnmarshalJSON(data []byte) error {
|
||||
err := json.Unmarshal(data, &maybeint)
|
||||
if err == nil {
|
||||
if maybeint <= 0 || maybeint >= 65535 {
|
||||
log.Error("Invalid port [%s]", string(data))
|
||||
log.Error("Invalid port [", string(data), "]")
|
||||
return InvalidPortRange
|
||||
}
|
||||
this.From = Port(maybeint)
|
||||
@@ -35,7 +35,7 @@ func (this *PortRange) UnmarshalJSON(data []byte) error {
|
||||
if len(pair) == 1 {
|
||||
value, err := strconv.Atoi(pair[0])
|
||||
if err != nil || value <= 0 || value >= 65535 {
|
||||
log.Error("Invalid from port %s", pair[0])
|
||||
log.Error("Invalid from port ", pair[0])
|
||||
return InvalidPortRange
|
||||
}
|
||||
this.From = Port(value)
|
||||
@@ -44,20 +44,20 @@ func (this *PortRange) UnmarshalJSON(data []byte) error {
|
||||
} else if len(pair) == 2 {
|
||||
from, err := strconv.Atoi(pair[0])
|
||||
if err != nil || from <= 0 || from >= 65535 {
|
||||
log.Error("Invalid from port %s", pair[0])
|
||||
log.Error("Invalid from port ", pair[0])
|
||||
return InvalidPortRange
|
||||
}
|
||||
this.From = Port(from)
|
||||
|
||||
to, err := strconv.Atoi(pair[1])
|
||||
if err != nil || to <= 0 || to >= 65535 {
|
||||
log.Error("Invalid to port %s", pair[1])
|
||||
log.Error("Invalid to port ", pair[1])
|
||||
return InvalidPortRange
|
||||
}
|
||||
this.To = Port(to)
|
||||
|
||||
if this.From > this.To {
|
||||
log.Error("Invalid port range %d -> %d", this.From, this.To)
|
||||
log.Error("Invalid port range ", this.From, " -> ", this.To)
|
||||
return InvalidPortRange
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user