go中l(wèi)og包的實(shí)現(xiàn)示例
log 包是 Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的日志庫(kù),用于記錄程序的運(yùn)行信息。它提供了簡(jiǎn)單的日志記錄功能,適合開發(fā)階段的調(diào)試和生產(chǎn)環(huán)境的基本日志輸出需求。
log 包的核心功能
- 輸出日志信息到標(biāo)準(zhǔn)輸出或文件。
- 提供多種日志級(jí)別(通過(guò)擴(kuò)展,如 log.Logger)。
- 支持自定義日志前綴和時(shí)間戳格式。
- 易于集成到更復(fù)雜的日志系統(tǒng)中。
log 包的常用函數(shù)
- log.Print:輸出日志信息(類似 fmt.Print)。
- log.Println:輸出日志信息并在末尾添加換行符(類似 fmt.Println)。
- log.Printf:按指定格式輸出日志信息(類似 fmt.Printf)。
- log.Fatal:輸出日志信息后調(diào)用 os.Exit(1) 終止程序。
- log.Panic:輸出日志信息后引發(fā) panic。
示例代碼:
package main
import "log"
func main() {
log.Print("這是一條普通日志")
log.Println("這是一條帶換行的日志")
log.Printf("這是一條格式化日志:變量值為 %d", 42)
// Fatal 和 Panic 示例(請(qǐng)注釋其中之一以避免程序中斷)
// log.Fatal("這是一條致命日志,程序?qū)⒃谌罩竞笸顺?)
// log.Panic("這是一條會(huì)引發(fā) panic 的日志")
}
輸出示例:
2024/12/09 12:00:00 這是一條普通日志
2024/12/09 12:00:00 這是一條帶換行的日志
2024/12/09 12:00:00 這是一條格式化日志:變量值為 42
自定義日志功能
log 包允許創(chuàng)建自定義的 Logger 實(shí)例,可以指定輸出目標(biāo)、前綴和日志標(biāo)志。
- log.New:創(chuàng)建新的 Logger 實(shí)例。
- log.Flags:設(shè)置日志格式標(biāo)志(如日期、時(shí)間、微秒、文件行號(hào))。
- log.SetOutput:更改日志輸出位置(如文件)。
示例代碼:自定義日志前綴和輸出文件
package main
import (
"log"
"os"
)
func main() {
// 打開日志文件
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("無(wú)法打開日志文件: %v", err)
}
defer file.Close()
// 創(chuàng)建自定義 Logger
logger := log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
// 記錄日志
logger.Println("應(yīng)用程序啟動(dòng)")
logger.Printf("當(dāng)前狀態(tài):%s", "運(yùn)行中")
// 錯(cuò)誤日志示例
logger.SetPrefix("ERROR: ")
logger.Println("發(fā)生錯(cuò)誤,無(wú)法連接數(shù)據(jù)庫(kù)")
}
輸出日志文件內(nèi)容:
INFO: 2024/12/09 12:00:00 main.go:20: 應(yīng)用程序啟動(dòng) INFO: 2024/12/09 12:00:00 main.go:21: 當(dāng)前狀態(tài):運(yùn)行中 ERROR: 2024/12/09 12:00:00 main.go:24: 發(fā)生錯(cuò)誤,無(wú)法連接數(shù)據(jù)庫(kù)
企業(yè)級(jí)使用案例
在企業(yè)應(yīng)用中,log 包通常與其他工具(如多模塊日志記錄、遠(yuǎn)程日志收集等)結(jié)合使用。以下示例展示了一個(gè)基于 log 包的多級(jí)日志記錄器:
示例代碼:多級(jí)日志記錄
package main
import (
"log"
"os"
)
// Logger 定義多級(jí)日志記錄器
type Logger struct {
Info *log.Logger
Error *log.Logger
}
func NewLogger(infoFile, errorFile string) (*Logger, error) {
// 打開日志文件
infoLog, err := os.OpenFile(infoFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
return nil, err
}
errorLog, err := os.OpenFile(errorFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
infoLog.Close()
return nil, err
}
return &Logger{
Info: log.New(infoLog, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile),
Error: log.New(errorLog, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile),
}, nil
}
func main() {
logger, err := NewLogger("info.log", "error.log")
if err != nil {
log.Fatalf("無(wú)法創(chuàng)建日志記錄器: %v", err)
}
logger.Info.Println("服務(wù)啟動(dòng)成功")
logger.Error.Println("數(shù)據(jù)庫(kù)連接失?。撼瑫r(shí)")
}
輸出示例:
info.log文件:
INFO: 2024/12/09 12:00:00 main.go:30: 服務(wù)啟動(dòng)成功
error.log文件:
ERROR: 2024/12/09 12:00:00 main.go:31: 數(shù)據(jù)庫(kù)連接失?。撼瑫r(shí)
總結(jié)
- log 包提供了基礎(chǔ)的日志記錄功能,適合簡(jiǎn)單的日志需求。
- 通過(guò) log.New 和 log.SetOutput,可以實(shí)現(xiàn)更靈活的日志記錄方式。
- 在企業(yè)中,通常需要將 log 包與日志管理系統(tǒng)(如 ELK、Fluentd)結(jié)合使用,實(shí)現(xiàn)更高級(jí)的日志處理。
代碼案例
package _case
import (
"log"
"os"
)
func init() {
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
log.SetOutput(os.Stderr)
}
func LogCase() {
//log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("帶有日期、時(shí)間和文件信息的日志:")
a, b := -1, -11
_, err := sum(a, b)
if err != nil {
log.Println(err)
log.Fatal(err) // fatal 打印日志后會(huì)導(dǎo)致程序的退出
}
}
到此這篇關(guān)于go中l(wèi)og包的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)go log包 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言中讀取命令參數(shù)的幾種方法總結(jié)
部署golang項(xiàng)目時(shí)難免要通過(guò)命令行來(lái)設(shè)置一些參數(shù),那么在golang中如何操作命令行參數(shù)呢?那么下面這篇文章就來(lái)給大家介紹了關(guān)于Go語(yǔ)言中讀取命令參數(shù)的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起看看吧。2017-11-11
Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露問(wèn)題解析
這篇文章主要介紹了Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程
這篇文章主要為大家介紹了go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
golang定時(shí)器Timer的用法和實(shí)現(xiàn)原理解析
這篇文章主要介紹了golang定時(shí)器Ticker,本文主要來(lái)看一下Timer的用法和實(shí)現(xiàn)原理,需要的朋友可以參考以下內(nèi)容2023-04-04

