log icon indicating copy to clipboard operation
log copied to clipboard

index out of range error due 0 len log entry buffer

Open repelliuss opened this issue 7 months ago • 2 comments

Version: v1.0.118

I am trying to achieve following setup:

log.DefaultLogger = log.Logger{
		Level:      log.ParseLevel(cliArgs.LogLevel),
		Caller:     1,
		TimeField:  "time",
		TimeFormat: "",
		Writer:     &log.MultiEntryWriter{
			&log.ConsoleWriter { ColorOutput: true },
			&log.MultiLevelWriter{
				InfoWriter: &log.AsyncWriter {
					ChannelSize: 16384,
					DiscardOnFull: false,
					Writer: &log.FileWriter {
						Filename: "info.log",
						FileMode: 0600,
						MaxSize: 4 * 1024 * 1024 * 1024,
						MaxBackups: 32,
						EnsureFolder: false,
						LocalTime: false,
					},
				},
				WarnWriter: &log.AsyncWriter {
					ChannelSize: 16384,
					DiscardOnFull: false,
					Writer: &log.FileWriter {
						Filename: "warn.log",
						FileMode: 0600,
						MaxSize: 4 * 1024 * 1024 * 1024,
						MaxBackups: 32,
						EnsureFolder: false,
						LocalTime: false,
					},
				},
				ErrorWriter: &log.AsyncWriter {
					ChannelSize: 16384,
					DiscardOnFull: false,
					Writer: &log.FileWriter {
						Filename: "error.log",
						FileMode: 0600,
						MaxSize: 4 * 1024 * 1024 * 1024,
						MaxBackups: 32,
						EnsureFolder: false,
						LocalTime: false,
					},
				},
			},
			&log.AsyncWriter {
				ChannelSize: 16384,
				DiscardOnFull: false,
				Writer: &log.FileWriter {
					Filename: "universal.log",
					FileMode: 0600,
					MaxSize: 4 * 1024 * 1024 * 1024,
					MaxBackups: 32,
					EnsureFolder: false,
					LocalTime: false,
				},
			},
		},
	}

log.Info().Msg("Hello world Log")

log.DefaultLogger.Writer.(io.Closer).Close()

this results with following error:

[90m2025-06-12T00:34:00.976+03:00[0m [32mINF[0m 1 backend/main.go:109 [36m>[0m Hello world Log
panic: runtime error: index out of range [0] with length 0

goroutine 21 [running]:
github.com/phuslu/log.(*AsyncWriter).writever(0xc0000ac500)
	/home/repelliuss/go/pkg/mod/github.com/phuslu/[email protected]/async_linux.go:23 +0x2e5
created by github.com/phuslu/log.(*AsyncWriter).init in goroutine 1
	/home/repelliuss/go/pkg/mod/github.com/phuslu/[email protected]/async.go:36 +0xff
exit status 2

due log entry buffer being empty.

repelliuss avatar Jun 11 '25 21:06 repelliuss

reproed

// You can edit this code!
// Click here and start typing.
package main

import (
	"io"

	"github.com/phuslu/log"
)

func main() {
	log.DefaultLogger = log.Logger{
		Writer: &log.MultiEntryWriter{
			&log.AsyncWriter{
				ChannelSize:   16384,
				DiscardOnFull: false,
				Writer: &log.FileWriter{
					Filename:     "info.log",
					FileMode:     0600,
					MaxSize:      4 * 1024 * 1024 * 1024,
					MaxBackups:   32,
					EnsureFolder: false,
					LocalTime:    false,
				},
			},
			&log.AsyncWriter{
				ChannelSize:   16384,
				DiscardOnFull: false,
				Writer: &log.FileWriter{
					Filename:     "universal.log",
					FileMode:     0600,
					MaxSize:      4 * 1024 * 1024 * 1024,
					MaxBackups:   32,
					EnsureFolder: false,
					LocalTime:    false,
				},
			},
		},
	}

	log.Info().Msg("Hello world Log")

	log.DefaultLogger.Writer.(io.Closer).Close()
}

phuslu avatar Jun 12 '25 02:06 phuslu

the root cause maybe from this cheating https://github.com/phuslu/log/blob/master/async.go#L79-L82

seems that it brings an unexpected limitation: we cannot support multiple AyncWriter in single logger, let me consider how to fix/improve it.

phuslu avatar Jun 12 '25 02:06 phuslu