2023-05-24 15:10:15 +09:00
|
|
|
package logger
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"log"
|
|
|
|
|
"os"
|
2023-09-19 18:50:17 +09:00
|
|
|
"runtime"
|
2023-05-24 15:10:15 +09:00
|
|
|
"runtime/debug"
|
2024-07-24 17:49:45 +09:00
|
|
|
"strconv"
|
2023-05-24 15:10:15 +09:00
|
|
|
"strings"
|
2024-07-08 15:09:21 +09:00
|
|
|
|
|
|
|
|
"repositories.action2quare.com/ayo/gocommon/flagx"
|
2023-05-24 15:10:15 +09:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var stdlogger *log.Logger
|
2024-07-24 17:49:45 +09:00
|
|
|
var _ = flagx.Int("logprefix", 3, "0 : no_prefix, 1 : date, 2 : time, 3 : datetime")
|
2023-05-24 15:10:15 +09:00
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
binpath, _ := os.Executable()
|
2024-08-22 10:53:32 +09:00
|
|
|
outWriter := os.Stdout
|
2023-05-24 15:10:15 +09:00
|
|
|
|
2024-07-24 17:49:45 +09:00
|
|
|
args := os.Args
|
|
|
|
|
logprefix := 3
|
|
|
|
|
for _, arg := range args {
|
|
|
|
|
if strings.HasPrefix(arg, "-logprefix=") {
|
|
|
|
|
logprefix, _ = strconv.Atoi(arg[11:])
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-22 09:14:48 +09:00
|
|
|
pid := fmt.Sprintf("[%d]", os.Getpid())
|
|
|
|
|
outWriter.Write([]byte(strings.Join(append([]string{pid, binpath}, args...), " ")))
|
|
|
|
|
|
2024-07-24 17:49:45 +09:00
|
|
|
if logprefix < 4 {
|
|
|
|
|
stdlogger = log.New(outWriter, "", logprefix)
|
2024-07-24 17:12:54 +09:00
|
|
|
} else {
|
|
|
|
|
stdlogger = log.New(outWriter, "", log.LstdFlags)
|
|
|
|
|
}
|
2023-05-24 15:10:15 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Println(v ...interface{}) {
|
|
|
|
|
stdlogger.Output(2, fmt.Sprintln(v...))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Printf(format string, v ...interface{}) {
|
|
|
|
|
stdlogger.Output(2, fmt.Sprintf(format, v...))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Error(v ...interface{}) {
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, fmt.Sprintln(v...))
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Errorf(format string, v ...interface{}) {
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, fmt.Sprintf(format, v...))
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Fatal(v ...interface{}) {
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, fmt.Sprint(v...))
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
func Fatalln(v ...interface{}) {
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, fmt.Sprintln(v...))
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
func Panic(v ...interface{}) {
|
|
|
|
|
s := fmt.Sprint(v...)
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, s)
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
panic(s)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Panicf(format string, v ...interface{}) {
|
|
|
|
|
s := fmt.Sprintf(format, v...)
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, s)
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
panic(s)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Panicln(v ...interface{}) {
|
|
|
|
|
s := fmt.Sprintln(v...)
|
2023-11-14 11:21:47 +09:00
|
|
|
stdlogger.Output(2, s)
|
|
|
|
|
stdlogger.Output(2, string(debug.Stack()))
|
2023-05-24 15:10:15 +09:00
|
|
|
panic(s)
|
|
|
|
|
}
|
2023-09-19 18:50:17 +09:00
|
|
|
|
|
|
|
|
type errWithCallstack struct {
|
|
|
|
|
inner error
|
|
|
|
|
frames []*runtime.Frame
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ecs *errWithCallstack) Error() string {
|
|
|
|
|
if ecs.frames == nil {
|
|
|
|
|
return ecs.inner.Error()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out := make([]string, 0, len(ecs.frames)+1)
|
|
|
|
|
out = append(out, ecs.inner.Error())
|
|
|
|
|
for i := len(ecs.frames) - 1; i >= 0; i-- {
|
|
|
|
|
frame := ecs.frames[i]
|
|
|
|
|
out = append(out, fmt.Sprintf("%s\n\t%s:%d", frame.Function, frame.File, frame.Line))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return strings.Join(out, "\n")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ErrorWithCallStack(err error) error {
|
|
|
|
|
var frames []*runtime.Frame
|
|
|
|
|
|
|
|
|
|
if recur, ok := err.(*errWithCallstack); ok {
|
|
|
|
|
err = recur.inner
|
|
|
|
|
frames = recur.frames
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pc, _, _, ok := runtime.Caller(1)
|
|
|
|
|
if ok {
|
|
|
|
|
curframes := runtime.CallersFrames([]uintptr{pc})
|
|
|
|
|
f, _ := curframes.Next()
|
|
|
|
|
frames = append(frames, &f)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &errWithCallstack{
|
|
|
|
|
inner: err,
|
|
|
|
|
frames: frames,
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-05-14 16:14:35 +09:00
|
|
|
|
|
|
|
|
func ErrorSmallStack() {
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
n := runtime.Stack(buf, false)
|
|
|
|
|
if n < len(buf) {
|
|
|
|
|
buf = buf[:n]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error(string(buf))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func RecoverAndErrorSmallStack(r any) any {
|
|
|
|
|
if r != nil {
|
|
|
|
|
pc := make([]uintptr, 10)
|
|
|
|
|
runtime.Callers(1, pc)
|
|
|
|
|
curframes := runtime.CallersFrames(pc)
|
|
|
|
|
var out []string
|
|
|
|
|
for {
|
|
|
|
|
frame, more := curframes.Next()
|
|
|
|
|
out = append(out, fmt.Sprintf("%s\n\t%s:%d", frame.Function, frame.File, frame.Line))
|
|
|
|
|
if !more {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error(strings.Join(out, "\n"))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return r
|
|
|
|
|
}
|