# log 日志打印
const ( | |
Ldate = 1 << iota // the date in the local time zone: 2009/01/23 | |
Ltime // the time in the local time zone: 01:23:23 | |
Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime. | |
Llongfile // full file name and line number: /a/b/c/d.go:23 | |
Lshortfile // final file name element and line number: d.go:23. overrides Llongfile | |
LUTC // if Ldate or Ltime is set, use UTC rather than the local time zone | |
Lmsgprefix // move the "prefix" from the beginning of the line to before the message | |
LstdFlags = Ldate | Ltime // initial values for the standard logger | |
) |
这是 log 的 flag 设置,flag 就是前缀的那些信息。
package main | |
import ( | |
"fmt" | |
"log" | |
"os" | |
) | |
func main() { | |
fmt.Printf("log.Flags(): %v\n", log.Flags()) | |
log.SetPrefix("Mylog ") | |
log.Output(1, "hello python") | |
log.SetFlags(log.Ldate|log.Ltime | log.LUTC|log.Llongfile) | |
log.Output(2, "hello python") | |
fmt.Printf("log.Flags(): %v\n", log.Flags()) | |
log.Print("hello go") | |
// log.Panic("not hello") | |
f, err := os.OpenFile("log", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0777) | |
if err!=nil{ | |
fmt.Println("err") | |
} | |
l := log.New(f, "MyLog ", log.Ldate|log.Ltime|log.Llongfile) | |
l.Print("hello go") | |
defer f.Close() | |
} |
结果:
log.SetFlags(log.Ldate|log.Ltime | log.LUTC|log.Llongfile)
log.SetPrefix("Mylog ")
就是设置前缀。
这个 flag
就是对应着二进制位数,用 |
或方法来相加。
log 分为三种方法:print、panic、Fatal
print
: 打印到日志输入。
panic
: 触发 panic
fatal
:打印完毕后立即退出。
output
:
func Output(calldepth int, s string) error |
其中 calldepth
就是显示那一层调用了这个 output 方法,如果为 1 就是显示当前的文件 log.go
,我这里设置了 calldepth
为 2
。所以它会再往下一层,显示的文件为 proc.go
。我觉得这个用处不是很大。
# logger
func New(out io.Writer, prefix string, flag int) *Logger |
这个会生成一个 logger 结构体,后面直接用这个 logger 来操作就行了。
例如:
设置 stderr 为输入 log 的地方:
l2 := log.New(os.Stderr, "", 43) |
直接打印到输出。
l := log.New(f, "MyLog ", log.Ldate|log.Ltime|log.Llongfile) |
后续所有输出 print 都会被定向到 f 文件。