go语言试用标准c 库,go语言标准库 - log

一、目录

二、log

1. 简介

该包定义了一个结构体Logger,这个结构体上挂载了以下函数:

1.1 初始化(New)

1.2 设置log风格(SetFlags)

1.3 设置log记录的载体(SetOutput)

1.4 设置log前缀(SetPrefix)

1.5 普通记录log(Print[f|ln])

1.6 以致命错误退出程序并记录log(Fatal[f|ln])

1.7 以panic形式退出程序并记录log(Panic[f|ln])

1.8 打印对应函数调用栈帧的log(Output)。

为了使用方便,标准库中还预实现了一个标准Logger,方便我们直接函数调用。

2. 直接使用标准Logger

package main

import (

"log"

"os"

)

func main(){

// 可通过SetOutput设置记录载体(载体只需实现io.Writer接口)。我们这里选择标准输出。

log.SetOutput(os.Stdout)

// 设置打印前缀

log.SetPrefix("My 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

LUTC // if Ldate or Ltime is set, use UTC rather than the local time zone

LstdFlags = Ldate | Ltime // initial values for the standard logger

)

*/

log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile)

// 往载体中输入日志

log.Println("begin log")

// 打印风格、前缀

log.Print(log.Flags())

log.Printf("%s\n", log.Prefix())

// 打印当前记录日志的地方,和调用main函数的地方

log.Output(0, "I'm caller.")

log.Output(1, "I'm caller's caller")

log.Output(2, "I'm caller's caller's caller")

// 以致命错误退出,并记录信息

log.Fatalln("I'm exit by Fatal.")

}

复制代码

3. 使用自定义Logger

package main

import (

"bytes"

"fmt"

"log"

)

func main() {

var (

// 定义一个载体

buf bytes.Buffer

// logger初始化,参数分别是载体、前缀 和 风格

logger = log.New(&buf, "INFO: ", log.Lshortfile)

// 定义Output闭包函数

infof = func(info string) {

logger.Output(2, info)

}

)

infof("Hello world")

// 打印载体、前缀、风格

logger.Print(logger.Flags())

logger.Printf("%s\n", logger.Prefix())

// 打印载体内容

fmt.Print(&buf) // 也可以写成 fmt.Print(logger.Writer())

// 以panic形式退出

logger.Panic("I'm exit by Panic")

}

复制代码

4. 将log写入指定文件中

package main

import (

"log"

"os"

)

func main() {

f, err := os.OpenFile("test.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)

if nil != err {

log.Fatal(err)

}

defer f.Close()

log.SetOutput(f)

log.Println("works")

}

复制代码

三、log/syslog

1. 简介

可通过unix套接字、UDP、TCP去发送日志信息。

2. TCP监听端口,等待log写入

package main

import (

"fmt"

"io/ioutil"

"net"

)

func main() {

localAddress, _ := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080")

var tcpListener, err = net.ListenTCP("tcp", localAddress)

if nil != err {

fmt.Println("监听出错:", err)

return

}

defer func() {

tcpListener.Close()

}()

fmt.Println("正在等待连接...")

var conn, err2 = tcpListener.AcceptTCP()

if nil != err2 {

fmt.Println("接受连接失败:", err2)

return

}

var remoteAddr = conn.RemoteAddr()

fmt.Println("接收到一个链接:", remoteAddr)

fmt.Println("正在读取消息...")

var bys, _ = ioutil.ReadAll(conn)

fmt.Println("接受到客户端的消息:", string(bys))

// conn.Write([]byte("hello, Nice to meet you, my name is Dawn"))

conn.Close()

}

复制代码

3. 通过Dial函数,生成Writer实例,向TCP服务写入log

package main

import (

"log"

"log/syslog"

)

func main() {

sysLog, err := syslog.Dial("tcp", "localhost:8080", syslog.LOG_WARNING|syslog.LOG_DAEMON, "demotag")

if nil != err {

log.Fatal(err)

}

defer sysLog.Close()

sysLog.Write([]byte("a log message.\n"))

sysLog.Info("an info message.\n")

sysLog.Notice("a notice message.\n")

sysLog.Emerg("an emergency message.\n")

sysLog.Warning("a warning message.\n")

sysLog.Err("a err message.\n")

sysLog.Debug("a debug message.\n")

sysLog.Crit("a crit message.\n")

sysLog.Alert("a alert message.\n")

}

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值