go語言日志實現(xiàn)詳解(打印日志、日志寫入文件和日志切割)_第1頁
go語言日志實現(xiàn)詳解(打印日志、日志寫入文件和日志切割)_第2頁
go語言日志實現(xiàn)詳解(打印日志、日志寫入文件和日志切割)_第3頁
go語言日志實現(xiàn)詳解(打印日志、日志寫入文件和日志切割)_第4頁
go語言日志實現(xiàn)詳解(打印日志、日志寫入文件和日志切割)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第go語言日志實現(xiàn)詳解(打印日志、日志寫入文件和日志切割)目錄Go語言內(nèi)置的log包實現(xiàn)了簡單的日志服務Logger標準logger的配置配置日志前綴(SetPrefix)配置日志輸出位置創(chuàng)建新logger對象日志庫級別runtime.Caller可變參數(shù)的日志實現(xiàn)往文件里面寫日志日志切割(按文件大小切割、按日期切割)總結(jié)

Go語言內(nèi)置的log包實現(xiàn)了簡單的日志服務

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

Logger

packagemain

import(

"log"

funcmain(){

log.Println("這是一條測試的日志。")

v:="很普通的"

log.Printf("這是一條%s日志。\n",v)

log.Fatalln("這是一條會觸發(fā)fatal的日志。")

log.Panicln("這是一條會觸發(fā)panic的日志。")

}

標準logger的配置

SetFlags函數(shù)用來設置標準logger的輸出配置。

const(

//控制輸出日志信息的細節(jié),不能控制輸出的順序和格式。

//輸出的日志在每一項后會有一個冒號分隔:例如2009/01/2301:23:23.123123/a/b/c/d.go:23:message

Ldate=1iota//日期:2009/01/23

Ltime//時間:01:23:23

Lmicroseconds//微秒級別的時間:01:23:23.123123(用于增強Ltime位)

Llongfile//文件全路徑名+行號:/a/b/c/d.go:23

Lshortfile//文件名+行號:d.go:23(會覆蓋掉Llongfile)

LUTC//使用UTC時間

LstdFlags=Ldate|Ltime//標準logger的初始值

funcmain(){

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

log.Println("這是一條很普通的日志。")

配置日志前綴(SetPrefix)

funcmain(){

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

log.Println("這是一條很普通的日志。")

log.SetPrefix("[哈哈哈]")

log.Println("這是一條很普通的日志。")

配置日志輸出位置

SetOutput函數(shù)用來設置標準logger的輸出目的地,默認是標準錯誤輸出。

funcinit(){

logFile,err:=os.OpenFile("./xx.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)

iferr!=nil{

fmt.Println("openlogfilefailed,err:",err)

return

log.SetOutput(logFile)

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

創(chuàng)建新logger對象

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

funcNew(outio.Writer,prefixstring,flagint)*Logger

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

舉個例子:

funcmain(){

logger:=log.New(os.Stdout,"New",log.Lshortfile|log.Ldate|log.Ltime)

logger.Println("這是自定義的logger記錄的日志。")

//New2017/06/1914:06:51main.go:34:這是自定義的logger記錄的日志。

補充:Go內(nèi)置的log庫功能有限,例如無法滿足記錄不同級別日志的情況,需要選擇使用第三方的日志庫,如logrus、zap等。

日志庫級別

packagelog

import(

"errors"

"fmt"

"strings"

"time"

typeLogLeveluint16

//日志常量

const(

UNKNOWLogLevel=iota

DEBUG

TRACE

INFO

WARNIG

ERROR

FATAL

//解析日志級別

funcparaLogLevel(sstring)(LogLevel,error){

s=strings.ToLower(s)

switchs{

case"debug":

returnDEBUG,nil

case"tarce":

returnTRACE,nil

case"info":

returnINFO,nil

case"warnig":

returnWARNIG,nil

case"error":

returnERROR,nil

case"fatal":

returnFATAL,nil

default:

err:=errors.New("無效的日志級別")

returnUNKNOW,err

//定義日志級別機構(gòu)提

typeLoggerstruct{

LevelLogLevel

//構(gòu)造器

funcNewLog(levelLogstring)Logger{

level,err:=paraLogLevel(levelLog)

iferr!=nil{

panic(err)

returnLogger{

Level:level,

//是否能夠打印某個級別的日志

func(lLogger)enable(logLevelLogLevel)bool{

returnl.LevellogLevel

func(lLogger)Debug(msgstring){

ifl.enable(DEBUG){

now:=time.Now()

fmt.Printf("[%s][Debug]%s",now.Format("2006-01-0215:04:05"),msg);

func(lLogger)Info(msgstring){

ifl.enable(INFO){

now:=time.Now()

fmt.Printf("[%s][Info]%s",now.Format("2006-01-0215:04:05"),msg);

func(lLogger)Warning(msgstring){

ifl.enable(WARNIG){

now:=time.Now()

fmt.Printf("[%s][Warning]%s",now.Format("2006-01-0215:04:05"),msg);

func(lLogger)Error(msgstring){

ifl.enable(ERROR){

now:=time.Now()

fmt.Printf("[%s][Error]%s",now.Format("2006-01-0215:04:05"),msg);

func(lLogger)Fatal(msgstring){

ifl.enable(FATAL){

now:=time.Now()

fmt.Printf("[%s][Fatal]%s",now.Format("2006-01-0215:04:05"),msg);

import"gostudy/log"

funcmain(){

newLog:=log.NewLog("warnig")

newLog.Debug("這是debug日志")

newLog.Info("這是info日志")

newLog.Warning("這是Warning日志")

newLog.Error("這是ERROR日志")

newLog.Fatal("這是FATAL日志")

打印結(jié)果:[2025-08-0410:41:56][Debug]這是debug日志[2025-08-0410:41:56][Info]這是info日志

runtime.Caller

能夠拿到文件名函數(shù)名和行號

可變參數(shù)的日志

//......interface{}表示可變的任意參數(shù),可不傳也可傳任意長度

func(lLogger)Debug(msgstring,a...interface{}){

msg=fmt.Sprint(msg,a)

ifl.enable(DEBUG){

now:=time.Now()

fmt.Printf("[%s][Debug]%s",now.Format("2006-01-0215:04:05"),msg);

實現(xiàn)往文件里面寫日志

1.新建fileloger.go文件,用來提供寫入日志的功能

packagelog

import(

"errors"

"fmt"

"os"

"path"

"strings"

"time"

typeLogLeveluint16

//日志級別

const(

UNKNOWLogLevel=iota

DEBUG

TRACE

INFO

WARNIG

ERROR

FATAL

//解析日志

funcparaLogLevel(sstring)(LogLevel,error){

s=strings.ToLower(s)

switchs{

case"debug":

returnDEBUG,nil

case"tarce":

returnTRACE,nil

case"info":

returnINFO,nil

case"warnig":

returnWARNIG,nil

case"error":

returnERROR,nil

case"fatal":

returnFATAL,nil

default:

err:=errors.New("無效的日志級別")

returnUNKNOW,err

//獲取日志的字符串格式

funcgetLogStr(levelLogLevel)string{

switchlevel{

caseDEBUG:

return"debug"

caseTRACE:

return"tarce"

caseINFO:

return"info"

caseWARNIG:

return"warnig"

caseERROR:

return"error"

caseFATAL:

return"fatal"

default:

return"unknow"

//定義日志的結(jié)構(gòu)體

typeFileLoggerstruct{

LevelLogLevel

filePathstring

fileNamestring

//要打開和寫入的文件,一個日志文件一個錯誤日志文件

fileObj*os.File

errfileObj*os.File

maxFileSizeint64

//構(gòu)造函數(shù)

funcNewFlieLogger(LeveStr,fp,fnstring,sizeint64)*FileLogger{

level,err:=paraLogLevel(LeveStr)

iferr!=nil{

panic(err)

f1:=FileLogger{

Level:level,

filePath:fp,

fileName:fn,

maxFileSize:size,

err=f1.initFile()

iferr!=nil{

panic(err)

returnf1

//初始化要打開和寫入的日志文件的操作

func(f*FileLogger)initFile()(error){

join:=path.Join(f.filePath,f.fileName)

fileObj,err:=os.OpenFile(join,os.O_APPEND|os.O_CREATE|os.O_WRONLY,0644)

iferr!=nil{

fmt.Printf("openlogfail,err:%v\n",err)

returnerr

errFileObj,err:=os.OpenFile(join+".err",os.O_APPEND|os.O_CREATE|os.O_WRONLY,0644)

iferr!=nil{

fmt.Printf("openlogfail,err:%v\n",err)

returnerr

//日志文件都打開

f.fileObj=fileObj;

f.errfi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論