最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go log庫的使用示例詳解

 更新時(shí)間:2024年09月23日 15:01:59   作者:knoci  
Go語言內(nèi)置的log庫提供了基本的日志記錄功能,支持日志的格式化輸出、設(shè)置日志前綴、配置輸出位置等,可以通過標(biāo)準(zhǔn)logger或創(chuàng)建新的Logger對象來使用,log庫簡單易用,但功能有限,可能需要配合第三方日志庫如logrus、zap等來滿足復(fù)雜需求

log庫簡介

        Go語言內(nèi)置的log包實(shí)現(xiàn)了簡單的日志服務(wù)。本文介紹了標(biāo)準(zhǔn)庫log的基本使用。

使用Logger

        log包定義了Logger類型,該類型提供了一些格式化輸出的方法。本包也提供了一個(gè)預(yù)定義的“標(biāo)準(zhǔn)”logger,可以通過調(diào)用函數(shù)Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)來使用,比自行創(chuàng)建一個(gè)logger對象更容易使用。

        例如,我們可以像下面的代碼一樣直接通過log包來調(diào)用上面提到的方法,默認(rèn)它們會將日志信息打印到終端界面:

package main
import (
	"log"
)
func main() {
	log.Println("這是一條很普通的日志。")
	v := "很普通的"
	log.Printf("這是一條%s日志。\n", v)
	log.Fatalln("這是一條會觸發(fā)fatal的日志。")
	log.Panicln("這是一條會觸發(fā)panic的日志。")
}

        編譯并執(zhí)行上面的代碼會得到如下輸出:

2017/06/19 14:04:17 這是一條很普通的日志。
2017/06/19 14:04:17 這是一條很普通的日志。
2017/06/19 14:04:17 這是一條會觸發(fā)fatal的日志。

        logger會打印每條日志信息的日期、時(shí)間,默認(rèn)輸出到系統(tǒng)的標(biāo)準(zhǔn)錯(cuò)誤。Fatal系列函數(shù)會在寫入日志信息后調(diào)用os.Exit(1)。Panic系列函數(shù)會在寫入日志信息后panic。

配置logger

標(biāo)準(zhǔn)logger的配置

        默認(rèn)情況下的logger只會提供日志的時(shí)間信息,但是很多情況下我們希望得到更多信息,比如記錄該日志的文件名和行號等。log標(biāo)準(zhǔn)庫中為我們提供了定制這些設(shè)置的方法。

   log標(biāo)準(zhǔn)庫中的Flags函數(shù)會返回標(biāo)準(zhǔn)logger的輸出配置,而SetFlags函數(shù)用來設(shè)置標(biāo)準(zhǔn)logger的輸出配置。

func Flags() int
func SetFlags(flag int)

flag選項(xiàng)

    log標(biāo)準(zhǔn)庫提供了如下的flag選項(xiàng),它們是一系列定義好的常量。

const (
    // 控制輸出日志信息的細(xì)節(jié),不能控制輸出的順序和格式。
    // 輸出的日志在每一項(xiàng)后會有一個(gè)冒號分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
    Ldate         = 1 << iota     // 日期:2009/01/23
    Ltime                         // 時(shí)間:01:23:23
    Lmicroseconds                 // 微秒級別的時(shí)間:01:23:23.123123(用于增強(qiáng)Ltime位)
    Llongfile                     // 文件全路徑名+行號: /a/b/c/d.go:23
    Lshortfile                    // 文件名+行號:d.go:23(會覆蓋掉Llongfile)
    LUTC                          // 使用UTC時(shí)間
    LstdFlags     = Ldate | Ltime // 標(biāo)準(zhǔn)logger的初始值
)

        下面我們在記錄日志之前先設(shè)置一下標(biāo)準(zhǔn)logger的輸出選項(xiàng)如下:

func main() {
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.Println("這是一條很普通的日志。")
}

        編譯執(zhí)行后得到的輸出結(jié)果如下:

2017/06/19 14:05:17.494943 .../log_demo/main.go:11: 這是一條很普通的日志。

配置日志前綴

    log標(biāo)準(zhǔn)庫中還提供了關(guān)于日志信息前綴的兩個(gè)方法:

func Prefix() string
func SetPrefix(prefix string)

        其中Prefix函數(shù)用來查看標(biāo)準(zhǔn)logger的輸出前綴,SetPrefix函數(shù)用來設(shè)置輸出前綴。

func main() {
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.Println("這是一條很普通的日志。")
	log.SetPrefix("[knoci]")
	log.Println("這是一條很普通的日志。")
}

        上面的代碼輸出如下:

[knoci]2017/06/19 14:05:57.940542 .../log_demo/main.go:13: 這是一條很普通的日志。

        這樣我們就能夠在代碼中為我們的日志信息添加指定的前綴,方便之后對日志信息進(jìn)行檢索和處理。

配置日志輸出位置

func SetOutput(w io.Writer)

    SetOutput函數(shù)用來設(shè)置標(biāo)準(zhǔn)logger的輸出目的地,默認(rèn)是標(biāo)準(zhǔn)錯(cuò)誤輸出。

        例如,下面的代碼會把日志輸出到同目錄下的xx.log文件中。

func main() {
	logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("open log file failed, err:", err)
		return
	}
	log.SetOutput(logFile)
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.Println("這是一條很普通的日志。")
	log.SetPrefix("[knoci]")
	log.Println("這是一條很普通的日志。")
}

        如果你要使用標(biāo)準(zhǔn)的logger,我們通常會把上面的配置操作寫到init函數(shù)中。

func init() {
	logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("open log file failed, err:", err)
		return
	}
	log.SetOutput(logFile)
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
}

創(chuàng)建logger

    log標(biāo)準(zhǔn)庫中還提供了一個(gè)創(chuàng)建新logger對象的構(gòu)造函數(shù)–New,支持我們創(chuàng)建自己的logger示例。New函數(shù)的簽名如下:

func New(out io.Writer, prefix string, flag int) *Logger

        New創(chuàng)建一個(gè)Logger對象。其中,參數(shù)out設(shè)置日志信息寫入的目的地。參數(shù)prefix會添加到生成的每一條日志前面。參數(shù)flag定義日志的屬性(時(shí)間、文件等等)。

舉個(gè)例子:

func main() {
	logger := log.New(os.Stdout, "<New>", log.Lshortfile|log.Ldate|log.Ltime)
	logger.Println("這是自定義的logger記錄的日志。")
}

        將上面的代碼編譯執(zhí)行之后,得到結(jié)果如下:

<New>2017/06/19 14:06:51 main.go:34: 這是自定義的logger記錄的日志。

總結(jié)

        Go內(nèi)置的log庫功能有限,例如無法滿足記錄不同級別日志的情況,我們在實(shí)際的項(xiàng)目中根據(jù)自己的需要選擇使用第三方的日志庫,如logrus、zap等。

到此這篇關(guān)于Go log庫的使用的文章就介紹到這了,更多相關(guān)Go log庫使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Go語言中接口應(yīng)用模式或慣例介紹

    詳解Go語言中接口應(yīng)用模式或慣例介紹

    這篇文章主要為大家詳細(xì)介紹了Go語言中接口應(yīng)用模式或慣例介紹的相關(guān)知識,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀

    這篇文章主要介紹了Go語言之重要數(shù)組類型切片(slice)make,append函數(shù)用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 深入學(xué)習(xí)Golang的流程控制

    深入學(xué)習(xí)Golang的流程控制

    Go 語言是一門現(xiàn)代化的編程語言,以其簡潔高效、并發(fā)安全等特點(diǎn)被越來越多的開發(fā)者所使用。本文將深入探討 Go 語言中的流程控制,包括條件語句、循環(huán)語句以及控制語句等方面
    2023-05-05
  • go通過benchmark對代碼進(jìn)行性能測試詳解

    go通過benchmark對代碼進(jìn)行性能測試詳解

    在開發(fā)中我們要想編寫高性能的代碼,或者優(yōu)化代碼的性能時(shí),你首先得知道當(dāng)前代碼的性能,在go中可以使用testing包的benchmark來做基準(zhǔn)測試 ,文中有詳細(xì)的代碼示例,感興趣的小伙伴可以參考一下
    2023-04-04
  • 從前端轉(zhuǎn)go的一些感悟?qū)Ρ?附詳細(xì)代碼)

    從前端轉(zhuǎn)go的一些感悟?qū)Ρ?附詳細(xì)代碼)

    從前端開發(fā)轉(zhuǎn)向 Go(Golang)后端開發(fā),是一個(gè)非??尚幸埠軐?shí)用的方向,特別是在做高性能微服務(wù)、分布式系統(tǒng)、云原生(如Kubernetes)等方面,這篇文章主要介紹了從前端轉(zhuǎn)go的一些感悟?qū)Ρ?需要的朋友可以參考下
    2026-04-04
  • 一文詳解GO如何實(shí)現(xiàn)Redis的AOF持久化

    一文詳解GO如何實(shí)現(xiàn)Redis的AOF持久化

    這篇文章主要為大家詳細(xì)介紹了GO如何實(shí)現(xiàn)Redis的AOF持久化的,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • golang實(shí)現(xiàn)redis的延時(shí)消息隊(duì)列功能示例

    golang實(shí)現(xiàn)redis的延時(shí)消息隊(duì)列功能示例

    這篇文章主要介紹了golang實(shí)現(xiàn)redis的延時(shí)消息隊(duì)列功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn)詳解

    golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn)詳解

    這篇文章主要為大家詳細(xì)介紹了golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 深入詳解如何使用Go實(shí)現(xiàn)端口掃描器

    深入詳解如何使用Go實(shí)現(xiàn)端口掃描器

    這篇文章主要為大家詳細(xì)介紹了深如何使用Go語言實(shí)現(xiàn)一個(gè)簡單的端口掃描器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-11-11
  • Go 內(nèi)存分配管理

    Go 內(nèi)存分配管理

    這篇文章主要介紹了Go 內(nèi)存分配管理,go 語言實(shí)際內(nèi)存、虛擬內(nèi)存怎么分配,延遲歸還是什么機(jī)制?本文結(jié)合監(jiān)控對內(nèi)存管理進(jìn)行了觀測,深入學(xué)習(xí)golang對于內(nèi)存的管理機(jī)制,需要的朋友可以參考一下
    2022-02-02

最新評論

阳春市| 金塔县| 义乌市| 灵台县| 九寨沟县| 米易县| 山阳县| 布尔津县| 三都| 商水县| 景泰县| 马尔康县| 保靖县| 景德镇市| 平凉市| 墨竹工卡县| 建宁县| 临颍县| 灵石县| 隆德县| 信宜市| 南宫市| 化州市| 磐石市| 云阳县| 鸡泽县| 渑池县| 和静县| 桐乡市| 咸丰县| 蒙阴县| 兴义市| 乐都县| 成安县| 青冈县| 浦城县| 巴东县| 仲巴县| 晋城| 汉川市| 海丰县|