mirror of
https://github.com/fatedier/frp.git
synced 2026-03-19 00:09:14 +08:00
In AddPrefix, the loop `for _, p := range l.prefixes` creates a copy of each element. Assignments to p.Value and p.Priority only modify the local copy, not the original slice element, causing updates to existing prefixes to be silently lost. This affects client/service.go where AddPrefix is called with Name:"runID" on reconnection — the old runID value would persist in log output instead of being updated to the new one. Fix by using index-based access `l.prefixes[i]` to modify the original slice element, and add break since prefix names are unique.
117 lines
2.7 KiB
Go
117 lines
2.7 KiB
Go
// Copyright 2019 fatedier, fatedier@gmail.com
|
|
//
|
|
// 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 xlog
|
|
|
|
import (
|
|
"cmp"
|
|
"slices"
|
|
|
|
"github.com/fatedier/frp/pkg/util/log"
|
|
)
|
|
|
|
type LogPrefix struct {
|
|
// Name is the name of the prefix, it won't be displayed in log but used to identify the prefix.
|
|
Name string
|
|
// Value is the value of the prefix, it will be displayed in log.
|
|
Value string
|
|
// The prefix with higher priority will be displayed first, default is 10.
|
|
Priority int
|
|
}
|
|
|
|
// Logger is not thread safety for operations on prefix
|
|
type Logger struct {
|
|
prefixes []LogPrefix
|
|
|
|
prefixString string
|
|
}
|
|
|
|
func New() *Logger {
|
|
return &Logger{
|
|
prefixes: make([]LogPrefix, 0),
|
|
}
|
|
}
|
|
|
|
func (l *Logger) ResetPrefixes() (old []LogPrefix) {
|
|
old = l.prefixes
|
|
l.prefixes = make([]LogPrefix, 0)
|
|
l.prefixString = ""
|
|
return
|
|
}
|
|
|
|
func (l *Logger) AppendPrefix(prefix string) *Logger {
|
|
return l.AddPrefix(LogPrefix{
|
|
Name: prefix,
|
|
Value: prefix,
|
|
Priority: 10,
|
|
})
|
|
}
|
|
|
|
func (l *Logger) AddPrefix(prefix LogPrefix) *Logger {
|
|
found := false
|
|
if prefix.Priority <= 0 {
|
|
prefix.Priority = 10
|
|
}
|
|
for i, p := range l.prefixes {
|
|
if p.Name == prefix.Name {
|
|
found = true
|
|
l.prefixes[i].Value = prefix.Value
|
|
l.prefixes[i].Priority = prefix.Priority
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
l.prefixes = append(l.prefixes, prefix)
|
|
}
|
|
l.renderPrefixString()
|
|
return l
|
|
}
|
|
|
|
func (l *Logger) renderPrefixString() {
|
|
slices.SortStableFunc(l.prefixes, func(a, b LogPrefix) int {
|
|
return cmp.Compare(a.Priority, b.Priority)
|
|
})
|
|
l.prefixString = ""
|
|
for _, v := range l.prefixes {
|
|
l.prefixString += "[" + v.Value + "] "
|
|
}
|
|
}
|
|
|
|
func (l *Logger) Spawn() *Logger {
|
|
nl := New()
|
|
nl.prefixes = append(nl.prefixes, l.prefixes...)
|
|
nl.renderPrefixString()
|
|
return nl
|
|
}
|
|
|
|
func (l *Logger) Errorf(format string, v ...any) {
|
|
log.Logger.Errorf(l.prefixString+format, v...)
|
|
}
|
|
|
|
func (l *Logger) Warnf(format string, v ...any) {
|
|
log.Logger.Warnf(l.prefixString+format, v...)
|
|
}
|
|
|
|
func (l *Logger) Infof(format string, v ...any) {
|
|
log.Logger.Infof(l.prefixString+format, v...)
|
|
}
|
|
|
|
func (l *Logger) Debugf(format string, v ...any) {
|
|
log.Logger.Debugf(l.prefixString+format, v...)
|
|
}
|
|
|
|
func (l *Logger) Tracef(format string, v ...any) {
|
|
log.Logger.Tracef(l.prefixString+format, v...)
|
|
}
|