Files
yusing 92bf8b196f refactor(accesslog): restructure access logging; enhance console output format
Major refactoring of the access logging infrastructure to improve code organization and add proper console/stdout logging support.

- Renamed `Writer` interface to `File` and consolidated with `SupportRotate`
- Renamed `Log(req, res)` to `LogRequest(req, res)` for clarity
- Added new `ConsoleLogger` with zerolog console writer for formatted stdout output
- Moved type definitions to new `types.go` file
- Changed buffer handling from `[]byte` returns to `*bytes.Buffer` parameters
- Renamed internal files for clarity (`access_logger.go` → `file_access_logger.go`)
- Fixed fileserver access logging timing: moved logging after handler execution with defer
- Correct response handling in Fileserver
- Remove deprecated field `buffer_size`
- Simplify and removed unnecessary code

All callers have been updated to use the new APIs.
2026-01-19 15:00:37 +08:00

74 lines
1.3 KiB
Go

package rules
import (
"bytes"
"fmt"
"io"
"math/rand"
"os"
"sync"
"github.com/yusing/godoxy/internal/common"
"github.com/yusing/godoxy/internal/logging/accesslog"
gperr "github.com/yusing/goutils/errs"
)
type noopWriteCloser struct {
io.Writer
}
func (n noopWriteCloser) Close() error {
return nil
}
var (
stdout io.WriteCloser = noopWriteCloser{os.Stdout}
stderr io.WriteCloser = noopWriteCloser{os.Stderr}
)
var (
testFiles = make(map[string]*bytes.Buffer)
testFilesLock sync.Mutex
)
func openFile(path string) (io.WriteCloser, gperr.Error) {
switch path {
case "/dev/stdout":
return stdout, nil
case "/dev/stderr":
return stderr, nil
}
if common.IsTest {
testFilesLock.Lock()
defer testFilesLock.Unlock()
if buf, ok := testFiles[path]; ok {
return noopWriteCloser{buf}, nil
}
buf := bytes.NewBuffer(nil)
testFiles[path] = buf
return noopWriteCloser{buf}, nil
}
f, err := accesslog.OpenFile(path)
if err != nil {
return nil, ErrInvalidArguments.With(err)
}
return f, nil
}
func TestRandomFileName() string {
return fmt.Sprintf("test-file-%d.txt", rand.Intn(1000000))
}
func TestFileContent(path string) []byte {
testFilesLock.Lock()
defer testFilesLock.Unlock()
buf, ok := testFiles[path]
if !ok {
return nil
}
return buf.Bytes()
}