相关配置

配置对象:

日志相关配置属性如下:

简要说明:

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

配置文件

一个参考的配置文件示例(以toml格式为例):

  1. [server]
  2. LogPath = "/var/log/gf-demos/server"
  3. LogStdout = false
  4. ErrorStack = true
  5. ErrorLogEnabled = true
  6. ErrorLogPattern = "error.{Ymd}.log"
  7. AccessLogEnabled = true
  8. AccessLogPattern = "access.{Ymd}.log"

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

使用示例

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

  1. package main
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/net/ghttp"
  5. )
  6. s := g.Server()
  7. s.BindHandler("/log/access", func(r *ghttp.Request){
  8. r.Response.Writeln("请在运行终端查看日志输出")
  9. })
  10. s.SetAccessLogEnabled(true)
  11. s.SetPort(8199)
  12. s.Run()
  13. }

我们在任何地方(包括运行时)可以调用SetAccessLogEnabled(true)开启access log的记录功能(并可通过随时动态关闭日志记录功能),默认情况下,日志内容将会输出到终端界面。如以上示例程序执行后,访问 ,日志内容将会输出到终端上,如下:

日志格式: 访问时间(精确到毫秒) HTTP状态码请求方式 请求前缀 请求地址 请求协议执行时间(毫秒) 客户端IP 来源URL UserAgent。其中,请求前缀http或者https请求协议往往为HTTP/1.0或者HTTP/1.1

错误日志

WebServer运行产生的任何错误信息(默认开启,输出到终端),都将会被记录到error log中,以下是一个手动触发异常的示例:

  1. package main
  2. import (
  3. "github.com/gogf/gf/frame/g"
  4. "github.com/gogf/gf/net/ghttp"
  5. )
  6. func main() {
  7. s := g.Server()
  8. s.BindHandler("/log/error", func(r *ghttp.Request){
  9. panic("OMG")
  10. })
  11. s.SetErrorLogEnabled(true)
  12. s.SetPort(8199)
  13. s.Run()
  14. }

运行并访问后,终端输出的错误日志信息如下:

  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"
  2. Stack:
  3. 1. OMG
  4. 1). main.main.func1
  5. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/net/ghttp/server/log/log_error.go:10

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

我们可以通过SetLogPath方法来设置日志目录,这样我们的日志信息将会保存到文件中,示例如下:

运行并访问后,日志将会被保存到/tmp/gf.log目录中。手动在终端查看目录结构如下:

  1. /tmp/gf.log
  2. ├── 2019-12-20.log
  3. └── access-20191220.log

需要注意的是,其中的2019-12-20.log是应用的默认日志文件,往往是通过使用glog/g.Log()方式输出的业务或者模块日志。而access-*.log/error*.log日志文件记录的是WebServer的访问日志及错误日志。

自定义日志处理

gf支持自定义的日志处理特性,便于开发者灵活控制日志输出,使用SetLogHandler来实现日志回调方法注册。

以下是自定义日志处理的简单示例:

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/gogf/gf/frame/g"
  6. "github.com/gogf/gf/net/ghttp"
  7. )
  8. func main() {
  9. s := g.Server()
  10. s.BindHandler("/log/handler", func(r *ghttp.Request){
  11. r.Response.WriteStatus(http.StatusNotFound, "文件找不到了")
  12. })
  13. s.SetAccessLogEnabled(true)
  14. s.SetErrorLogEnabled(true)
  15. s.SetLogHandler(func(r *ghttp.Request, error ...interface{}) {
  16. if len(error) > 0 {
  17. // 如果是错误日志
  18. fmt.Println("错误产生了:", error[0])
  19. }
  20. // 这里是请求日志
  21. fmt.Println("请求处理完成,请求地址:", r.URL.String(), "请求结果:", r.Response.Status)
  22. })
  23. s.SetPort(8199)
  24. s.Run()