成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 日志庫 Zap 如何自定義輸出目標?

開發 前端
Zap是一個功能非常豐富、易于使用的 Golang日志庫。記錄日志時,一般會選擇輸出到控制臺(Stdout和Stderr)或者輸出到文件或者同時輸出到兩者。zap 庫也提供了對應的選項。

Zap(https://github.com/uber-go/zap)是一個功能非常豐富、易于使用的 Golang日志庫。記錄日志時,一般會選擇輸出到控制臺(stdout和stderr)或者輸出到文件或者同時輸出到兩者。zap 庫也提供了對應的選項。

指定日志輸出目標

zap 配置項中(zap.Config), 使用 OutputPaths 和 ErrorOutputPaths 可以指定日志輸出目標,首先看下這個配置項的定義和說明:

// OutputPaths is a list of URLs or file paths to write logging output to.
	// See Open for details.
	OutputPaths []string `json:"outputPaths" yaml:"outputPaths"`
	// ErrorOutputPaths is a list of URLs to write internal logger errors to.
	// The default is standard error.
	//
	// Note that this setting only affects internal errors; for sample code that
	// sends error-level logs to a different location from info- and debug-level
	// logs, see the package-level AdvancedConfiguration example.
	ErrorOutputPaths []string `json:"errorOutputPaths" yaml:"errorOutputPaths"`

OutputPaths:是一個字符串類型的切片,可以指定URL、文件路徑或者 stdout,默認是stdout。

ErrorOutputPaths:也是一個字符串類型的切片,和 OutputPaths 類似,默認是stderr。

看個例子

package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func main() {
	cfg := zap.NewProductionConfig()
	cfg.OutputPaths = []string{"stdout"}
	cfg.ErrorOutputPaths = []string{"stderr"}
	cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	logger, err := cfg.Build()
	if err != nil {
		panic("init logger error")
	}
	sugar := Logger.Sugar()

	sugar.Info("這是一條測試日志")
}

這個例子是將日志輸出到控制臺,如果想也把日志輸出到文件一份,修改下第 10 和 11 行,代碼如下:

cfg.OutputPaths = []string{"stdout", "./test.log"}
cfg.ErrorOutputPaths = []string{"stderr", "./test.log"}

如果只想輸出到文件,代碼如下:

cfg.OutputPaths = []string{"./test.log"}
cfg.ErrorOutputPaths = []string{"./test.log"}

自定義日志輸出方式

可以使用 zap.RegisterSink 函數來注冊自定義的的輸出方式,該函數第二個參數為一個自定義的工廠函數, 接收一個 *url.URL 類型的指針, 返回一個 Sink 類型和一個 error,所以需要實現 Sink 接口。看一個具體的示例,自定義了一個通過 http 協議輸出到指定接口的輸出方式:

package main

import (
	"bytes"
	"errors"
	"fmt"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"net/http"
	"net/url"
)

type Http struct {
	Remote *url.URL
}

func (h Http) Sync() error {
	return nil
}

func (h Http) Close() error {
	return nil
}

func (h Http) Write(p []byte) (n int, err error) {
	req, err := http.NewRequest("POST", h.Remote.String(), bytes.NewBuffer(p))
	if err != nil {
		return 0, nil
	}
	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return 0, nil
	}
	defer resp.Body.Close()
	if resp.StatusCode != 200 {
		return -1, errors.New("request failed")
	}
	return len(p), nil
}

// 實現工廠函數
func httpSink(url *url.URL) (sink zap.Sink, err error) {
	h := Http{Remote: url}
	return h, nil
}

func main() {
	// 注冊自定義方法
	if err := zap.RegisterSink("Http", httpSink); err != nil {
		fmt.Println(err)
		return
	}

	cfg := zap.NewProductionConfig()
	cfg.OutputPaths = []string{"stdout", "http://127.0.0.1/log"}
	cfg.ErrorOutputPaths = []string{"stderr", "http://127.0.0.1/log"}
	cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder

	logger, err := cfg.Build()
	if err != nil {
		panic(err)
	}

	logger.Sugar().Info("這是一條測試日志")
}

然后啟動一個服務端,代碼如下:

package main

import (
	"bytes"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/log", func(w http.ResponseWriter, r *http.Request) {
		body, _ := ioutil.ReadAll(r.Body)
		log.Println("日志內容內容: ", bytes.NewBuffer(body).String())
	})

	log.Fatal(http.ListenAndServe(":80", nil))
}

然后運行打印日志的代碼,可以看到服務端接收到了日志。

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-11-25 09:10:39

Golang GinW

2021-05-28 08:58:41

Golang網卡metrics

2009-07-07 14:32:47

JDK日志Formatter

2025-01-22 11:10:34

2023-10-31 09:10:39

2023-02-13 00:24:37

Go語言日志庫

2013-06-27 11:10:01

iOS開發自定義UISlider

2009-07-07 14:00:25

JDK日志Handler

2010-02-07 14:02:16

Android 界面

2024-10-07 11:12:55

2009-09-07 22:00:15

LINQ自定義

2009-08-05 18:01:20

C#自定義異常處理

2015-02-12 15:33:43

微信SDK

2020-11-19 10:50:43

ImportPython代碼

2015-02-12 15:38:26

微信SDK

2016-11-16 21:55:55

源碼分析自定義view androi

2009-09-03 13:34:03

.NET自定義控件

2023-01-03 07:40:27

自定義滑塊組件

2021-12-31 08:43:45

插件KubeScheduler

2022-04-20 18:22:18

CSS拖拽預覽圖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线观看一区 | 亚洲国产午夜 | 国产精成人| 天天爽夜夜爽精品视频婷婷 | 国产激情偷乱视频一区二区三区 | 午夜欧美a级理论片915影院 | 久久精品无码一区二区三区 | 国产精品毛片无码 | 在线日韩视频 | av在线三级| 99精品欧美| 国产三级电影网站 | 国产一区二区三区视频 | 日韩久久精品 | 在线免费黄色小视频 | av国产在线观看 | 欧美日本一区 | 亚洲一区久久 | av在线一区二区三区 | 久热精品在线 | 免费日韩av网站 | 亚洲欧美中文日韩在线v日本 | 亚洲成人免费av | 午夜视频在线免费观看 | 国产小视频在线 | 亚洲精品自拍视频 | 一区二区三区四区在线视频 | 久久久免费在线观看 | 中文字幕在线观看第一页 | 中文字幕视频一区二区 | 亚洲激情在线观看 | 亚洲国产免费 | 久久久久国产精品 | 国产色视频网站 | 国产午夜精品一区二区三区嫩草 | 欧美国产视频 | 日日碰狠狠躁久久躁96avv | av av在线| 日日骚网| 成人国产精品 | 久草在线高清 |