gf icon indicating copy to clipboard operation
gf copied to clipboard

log:本该写入access文件的日志写到了error文件里

Open runsong2018 opened this issue 4 months ago • 11 comments

Go version

go version go1.23.3 windows/amd64

GoFrame version

2.9

Can this bug be reproduced with the latest release?

Option Yes

What did you do?

Image

What did you see happen?

1.请求返回不带error,日志写入access.log文件 2.请求返回带error,日志写入error.log文件 3.请求返回不带error,日志也写入了error.log文件

What did you expect to see?

请求有error返回时才写入error.log文件

runsong2018 avatar Aug 01 '25 09:08 runsong2018

配置信息贴一下,是不是配置信息写错了呢?

houseme avatar Sep 01 '25 07:09 houseme

# gf配置
server:
  address: ":8000"
  openapiPath: "/api.json"
  # swaggerPath: "/swagger"
  serverRoot: "resource/public"
  DumpRouterMap: false
  logPath: "/data/logs/your_service"
  logStdout: true                             # 日志是否输出到终端。默认为true
  ErrorStack: true                            # 当Server捕获到异常时是否记录堆栈信息到日志中。默认为true
  ErrorLogEnabled: true                       # 是否记录异常日志信息到日志中。默认为true
  errorLogPattern: "error-{Y-m-d}.log"        # 异常错误日志文件格式。默认为"error-{Ymd}.log"
  accessLogEnabled: true                      # 是否记录访问日志。默认为false
  accessLogPattern: "access-{Y-m-d}.log"      # 访问日志文件格式。默认为"access-{Ymd}.log"
  serverAgent: "HTTP Server"

  # PProf配置
  pprofEnabled: true                        # 是否开启PProf性能调试特性。默认为false
  pprofPattern: "/pprof"                    # 开启PProf时有效,表示PProf特性的页面访问路径,对当前Server绑定的所有域名有效。


# Global logging.
logger:
  level: "all"
  flags: 44                               # 年-月-日 时:分:秒.毫秒 文件名:行号
  path: "/data/logs/your_service"                            # 日志文件路径。默认为空,表示关闭,仅输出到终端
  file: "{Y-m-d}.log"              # 日志文件格式。默认为"{Y-m-d}.log"
  stdout: true                            # 日志是否同时输出到终端。默认true
  stdoutColorDisabled: true               # 关闭终端的颜色打印。默认开启
  writerColorEnable: false                # 日志文件是否带上颜色。默认false,表示不带颜色
  rotateExpire: "7d"                      # 日志保留天数
  rotateBackupLimit: 2                    # 最大备份数量
  rotateBackupCompress: 9                 # 日志文件压缩级别,0-9,9最高

runsong2018 avatar Sep 01 '25 07:09 runsong2018

请求返回不带error,日志也写入了error.log文件 有具体的代码吗 ?

比如其他逻辑代码里有错误出现呢?只是Controller中处理掉了呢?

houseme avatar Sep 01 '25 07:09 houseme

这个到没注意,只是原本不应该写入error日志文件的日志写入了error日志文件

runsong2018 avatar Sep 01 '25 07:09 runsong2018

Image 看着好像是公用这个的问题

runsong2018 avatar Sep 01 '25 07:09 runsong2018

http 记录的日志,可以看下源码的实现

houseme avatar Sep 01 '25 07:09 houseme

看了 貌似用的同一个logger指针 然后再加上缓存get 导致后面的把前面的信息覆盖了。 流程如下: 1.access log 设置了logger 为access ,设置了access log缓存 2.error log 设置了logger为error,设置了error log 缓存 3.access log 直接使用了缓存,但是logger已经变为了error的设置

runsong2018 avatar Sep 01 '25 07:09 runsong2018

大佬???

runsong2018 avatar Sep 01 '25 09:09 runsong2018

看了 貌似用的同一个logger指针 然后再加上缓存get 导致后面的把前面的信息覆盖了。 流程如下: 1.access log 设置了logger 为access ,设置了access log缓存 2.error log 设置了logger为error,设置了error log 缓存 3.access log 直接使用了缓存,但是logger已经变为了error的设置

按照这个猜测验证一下,error.log 有日志,肯定是其中有地方出现了错误,才会被记录,因为有 traceid,可以看下日志模块的日志和error.log进行对比

houseme avatar Sep 01 '25 15:09 houseme

@runsong2018 排查过后发现是logger的文件名发生了改变,并不是缓存替换了,这块的逻辑目前有bug, 可以使用代码验证

type HelloReq struct {
	g.Meta `path:"/hello/{index}" tags:"Hello" method:"get" summary:"You first hello api"`
	Index  int `json:"index"`
}

func (c *ControllerV1) Hello(ctx context.Context, req *v1.HelloReq) (res *v1.HelloRes, err error) {
	index := req.Index
	arr := []int{10, 20, 30}
       // index超过范围后会返回error
	if index > len(arr) {
		err = fmt.Errorf("index out of range: %d", index)
	}
	l := g.RequestFromCtx(ctx).Server.Logger()
	fmt.Printf("index=%d err=%v, logger=%p\n", index, err != nil, l)
	return
}

Image

wln32 avatar Sep 14 '25 19:09 wln32

@gqcn 目前不太清楚这块的逻辑是只用一个logger完成不同文件的写入,还是access log用一个logger,error log用另一个logger

wln32 avatar Sep 14 '25 19:09 wln32