完整的方法列表可参考接口文档:https://pkg.go.dev/github.com/gogf/gf/v2/os/glog

glog模块支持非常简便的链式操作方式,主要的链式操作方法如下:

// 重定向日志输出接口
func To(writer io.Writer) *Logger
// 日志内容输出到目录
func Path(path string) *Logger
// 设置日志文件分类
func Cat(category string) *Logger
// 设置日志文件格式
func File(file string) *Logger
// 设置日志打印级别
func Level(level int) *Logger
// 设置日志打印级别(字符串)
func LevelStr(levelStr string) *Logger
// 设置文件回溯值
func Skip(skip int) *Logger
// 是否开启trace打印
func Stack(enabled bool) *Logger
// 开启trace打印并设定过滤trace的字符串
func StackWithFilter(filter string) *Logger
// 是否开启终端输出
func Stdout(enabled...bool) *Logger
// 是否输出日志头信息
func Header(enabled...bool) *Logger
// 输出日志调用行号信息
func Line(long...bool) *Logger
// 异步输出日志
func Async(enabled...bool) *Logger

示例1, 基本使用

package main

import (
	"context"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gfile"
)

func main() {
	ctx := context.TODO()
	path := "/tmp/glog-cat"
	g.Log().SetPath(path)
	g.Log().Stdout(false).Cat("cat1").Cat("cat2").Print(ctx, "test")
	list, err := gfile.ScanDir(path, "*", true)
	g.Dump(err)
	g.Dump(list)
}

执行后,输出结果为:

null
[
	"/tmp/glog-cat/cat1",
	"/tmp/glog-cat/cat1/cat2",
	"/tmp/glog-cat/cat1/cat2/2018-10-10.log",
]

示例2, 打印调用行号

package main

import (
	"context"

	"github.com/gogf/gf/v2/frame/g"
)

func main() {
	ctx := context.TODO()
	g.Log().Line().Print(ctx, "this is the short file name with its line number")
	g.Log().Line(true).Print(ctx, "lone file name with line number")
}

执行后,终端输出结果为:

2019-05-23 09:22:58.141 glog_line.go:8: this is the short file name with its line number
2019-05-23 09:22:58.142 /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/os/glog/glog_line.go:9: lone file name with line number

示例3, 文件回溯Skip

有时我们通过一些模块封装了glog模块来打印日志,例如封装了一个logger包通过logger.Print来打印日志,这个时候打印出来的调用文件行号总是同一个位置,因为对于glog来讲,它的调用方即总是logger.Print方法。这个时候,我们可以通过设置回溯值来跳过回溯的文件数,使用SetStackSkip或者链式方法Skip实现。

文件回溯值的设置同样也会影响Stack调用回溯打印结果。

package main

import (
	"context"

	"github.com/gogf/gf/v2/frame/g"
)

func PrintLog(ctx context.Context, content string) {
	g.Log().Skip(1).Line().Print(ctx, "line number with skip:", content)
	g.Log().Line().Print(ctx, "line number without skip:", content)
}

func main() {
	ctx := context.TODO()
	PrintLog(ctx, "just test")
}

执行后,终端输出结果为:

2019-05-23 19:30:10.984 glog_line2.go:13: line number with skip: just test
2019-05-23 19:30:10.984 glog_line2.go:9: line number without skip: just test





Content Menu

  • No labels

8 Comments

  1. 在配置文件里配置好了,没有生效?

    logger:
    path: "temp/log" # 日志文件路径。默认为空,表示关闭,仅输出到终端
    file: "{Y-m-d}.log" # 日志文件格式。默认为"{Y-m-d}.log"
    prefix: "" # 日志内容输出前缀。默认为空
    level: "all" # 日志输出级别
    1. debug了一下,确实没有取到值 

      LogPath=“”

      1. 不是在logger里面设置。在server里面。。。。

  2. // 日志内容输出到目录
    func Path(path string) *Logger

    这个链式函数看的有点懵逼,  glog.File()  和   glog.SetPath()   

    这两个感觉实际上都是在设置包的"defaultLogger"对象?  

    1. 调试了demo, 好像有点半懂了. 

       glog.SetPath() 设置的是包的"defaultLogger"对象

      glog.File()会返回一个全新克隆对象,  设置的任何配置, 都是只在当前这个克隆对象内生效. 不影响全局的"defaultLogger"对象. 

      应该是这样吧. 感觉...... 

  3. 太灵活了也是很要命...  得花时间去了解各个api的差异

  4. 求问: g.Log()和glog拥有相同的操作和方法,有什么特别的区别处,推荐使用哪一个, 谢谢

    1. 两者的区别在这里 日志组件。推荐是使用g.Log()