"bytes"
"fmt"
"os"
+ "sync"
"time"
"go.cypherpunks.ru/recfile"
"golang.org/x/sys/unix"
)
+const LogFdPrefix = "FD:"
+
+var (
+ LogFd *os.File
+ LogFdLock sync.Mutex
+)
+
type LE struct {
K string
V interface{}
}
func (ctx *Ctx) Log(rec string) {
+ if LogFd != nil {
+ LogFdLock.Lock()
+ LogFd.WriteString(rec)
+ LogFdLock.Unlock()
+ return
+ }
fdLock, err := os.OpenFile(
ctx.LogPath+".lock",
os.O_CREATE|os.O_WRONLY,
fmt.Fprintln(os.Stderr, "Can not open log:", err)
return
}
- fd.WriteString(rec) // #nosec G104
- fd.Close() // #nosec G104
+ fd.WriteString(rec)
+ fd.Close()
}
-func (ctx *Ctx) LogD(who string, les LEs, msg string) {
+func (ctx *Ctx) LogD(who string, les LEs, msg func(LEs) string) {
if !ctx.Debug {
return
}
les = append(LEs{{"Debug", true}, {"Who", who}}, les...)
- if msg != "" {
- les = append(les, LE{"Msg", msg})
- }
+ les = append(les, LE{"Msg", msg(les)})
fmt.Fprint(os.Stderr, les.Rec())
}
-func (ctx *Ctx) LogI(who string, les LEs, msg string) {
+func (ctx *Ctx) LogI(who string, les LEs, msg func(LEs) string) {
les = append(LEs{{"Who", who}}, les...)
- if msg != "" {
- les = append(les, LE{"Msg", msg})
- }
+ les = append(les, LE{"Msg", msg(les)})
rec := les.Rec()
if !ctx.Quiet {
fmt.Fprintln(os.Stderr, ctx.HumanizeRec(rec))
ctx.Log(rec)
}
-func (ctx *Ctx) LogE(who string, les LEs, err error, msg string) {
+func (ctx *Ctx) LogE(who string, les LEs, err error, msg func(LEs) string) {
les = append(LEs{{"Err", err.Error()}, {"Who", who}}, les...)
- if msg != "" {
- les = append(les, LE{"Msg", msg})
- }
+ les = append(les, LE{"Msg", msg(les)})
rec := les.Rec()
if !ctx.Quiet {
fmt.Fprintln(os.Stderr, ctx.HumanizeRec(rec))