GoFrame框架提供了完善的Server日志管理功能,包括access log以及error log,推荐使用配置文件的方式统一配置管理。

日志配置

配置对象

请查看API文档:

https://pkg.go.dev/github.com/gogf/gf/v2/net/ghttp#ServerConfig

配置属性

日志相关配置属性如下:

Logger            *glog.Logger      // Logger for server.
LogPath           string            // Directory for storing logging files.
LogStdout         bool              // Printing logging content to stdout.
ErrorStack        bool              // Logging stack information when error.
ErrorLogEnabled   bool              // Enable error logging files.
ErrorLogPattern   string            // Error log file pattern like: error-{Ymd}.log
AccessLogEnabled  bool              // Enable access logging files.
AccessLogPattern  string            // Error log file pattern like: access-{Ymd}.log

简要说明:

  1. 默认情况下,日志不会输出到文件中,而是直接打印到终端。默认情况下的access日志终端输出是关闭的,仅有error日志默认开启。
  2. 所有的选项均可通过Server.Set*方法设置,大部分选项可以通过Server.Get*方法获取。
  3. Logger是一个自定义的日志管理对象,开发者也可以传递一个完整的日志管理对象,忽略其他日志选项配置。
  4. LogPath属性用于设置日志目录,只有在设置了日志目录的情况下才会输出日志到日志文件中。
  5. ErrorLogPatternAccessLogPattern用于配置日志文件名称格式,默认为error-{Ymd}.logaccess-{Ymd}.log,例如:error-20191212.log, access-20191212.log
  6. 其他配置选项说明请参考注释和API文档。

配置文件

官方推荐使用配置文件的方式来管理服务配置以及日志日志配置。 一个参考的日志配置内容示例(以yaml格式为例):

server:
  LogPath:          "/var/log/gf-demos/server"
  LogStdout:        false
  ErrorStack:       true
  ErrorLogEnabled:  true
  ErrorLogPattern:  "error.{Ymd}.log"
  AccessLogEnabled: true
  AccessLogPattern: "access.{Ymd}.log"

Server启动时将会自动去读取默认配置文件config.yaml中的server节点配置。

配置方法

日志的配置也可以通过Server对象的Set*方法来进行配置,参考 服务配置 章节。

日志格式

配置文件的方式比较简单,这里不再示例说明。以下示例通过配置方法的方式进行对Server进行配置。

请求日志

请求日志:

2018-04-20 18:11:57.344 200 "GET http 127.0.0.1:8199 /log/access HTTP/1.1" 0.120, 127.0.0.1, "", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/53.0.2785.143 Chrome/53.0.2785.143 Safari/537.36"

日志格式:

请求时间(精确到毫秒) HTTP状态码 "请求方式 请求前缀 请求地址 请求协议" 执行时间(秒) 客户端IP "来源URL", "UserAgent"

其中,请求前缀http或者https请求协议往往为HTTP/1.0或者HTTP/1.1

注意,日志中记录的执行时间单位为,绝大多数情况下看到的时间几乎都是0.xxx秒时间,也就是说执行时间都是毫秒级不到1秒。

错误日志

错误日志:

2019-12-20 20:10:56.484 [ERRO] 500, "GET http 127.0.0.1:8199 /log/error HTTP/1.1" 0.210, 127.0.0.1, "", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
Stack:
1. OMG
   1).  main.main.func1
        /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/net/ghttp/server/log/log_error.go:10

错误信息会打印出对应错误产生的堆栈信息(堆栈信息中不包含框架内部调用信息),以便于错误定位以及开发者分析问题原因。

Server产生的任何panic错误都将会被自动捕获到错误日志中,因此对于业务端程序来讲,无论是在控制器中、业务封装层、数据模型中,如果产生了错误想要直接退出业务请求处理,直接panic即可。

自定义日志处理

开发者可以自定义处理Server的请求日志,方法有两种:

  1. 可以通过日志配置项传递自定义的*glog.Logger对象。
  2. 可以通过中间件来统一捕获处理,参考 路由管理-中间件/拦截器 章节。

Server日志与业务日志

这是一个FAQ

我们需要注意的是,这里提到的日志都是Server的日志,类似于nginx, apache, tomcat等等一系列Web Server服务的日志,只允许Server输出内容,开发者无法往Server的日志文件中写入日志内容,并且日志类型和格式是完全固定的。

GoFrame框架也提供了日志模块,由glog日志组件实现,开发者通过glog组件打印的日志属于业务日志,程序业务代码可以决定输出什么内容,输出到哪里,输出格式是什么样等。并且常用g.Log()方法来输出业务日志,该方法支持自动读取配置文件中的logger配置项。具体请参考 日志组件 章节。



Content Menu

  • No labels

3 Comments

  1. handleErrorLog

    handleAccessLog


    这两个方法我想自己写,但是又不想改动框架代码。


  2. 一看这个执行时间,本机上时间真快.  都是0.00x, 这PHP最少都得上1秒了.

  3. server:
      LogPath:          "/var/log/gf-demos/server"
      ErrorStack:       true
      ErrorLogEnabled:  true
      ErrorLogPattern:  "error.{Ymd}.log"
      AccessLogEnabled: true
      AccessLogPattern: "access.{Ymd}.log"

    这样写,服务启动的时候会生成一个 年-月-日.log 应该还少了一个路径没有列出来,这个log里面主要就是启动服务的端口+路由信息

    2024-08-28 18:06:36.125 [INFO] pid[3981]: http server started listening on [:10010]
    2024-08-28 18:06:36.125 [INFO] {689ac31978dcef1752f0676eb74ff02d} swagger ui is serving at address: http://127.0.0.1:10010/swagger/
    2024-08-28 18:06:36.125 [INFO] {689ac31978dcef1752f0676eb74ff02d} openapi specification is serving at address: http://127.0.0.1:10010/api.json