go语言日志实现详解(打印日志、日志写入文件和日志切割)_第1页
go语言日志实现详解(打印日志、日志写入文件和日志切割)_第2页
go语言日志实现详解(打印日志、日志写入文件和日志切割)_第3页
go语言日志实现详解(打印日志、日志写入文件和日志切割)_第4页
go语言日志实现详解(打印日志、日志写入文件和日志切割)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第go语言日志实现详解(打印日志、日志写入文件和日志切割)目录Go语言内置的log包实现了简单的日志服务Logger标准logger的配置配置日志前缀(SetPrefix)配置日志输出位置创建新logger对象日志库级别runtime.Caller可变参数的日志实现往文件里面写日志日志切割(按文件大小切割、按日期切割)总结

Go语言内置的log包实现了简单的日志服务

log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的标准logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用。

Logger

packagemain

import(

"log"

funcmain(){

log.Println("这是一条测试的日志。")

v:="很普通的"

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

log.Fatalln("这是一条会触发fatal的日志。")

log.Panicln("这是一条会触发panic的日志。")

}

标准logger的配置

SetFlags函数用来设置标准logger的输出配置。

const(

//控制输出日志信息的细节,不能控制输出的顺序和格式。

//输出的日志在每一项后会有一个冒号分隔:例如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函数用来设置标准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)

创建新logger对象

log标准库中还提供了一个创建新logger对象的构造函数New,支持我们创建自己的logger示例。New函数的签名如下:

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

New创建一个Logger对象。其中,参数out设置日志信息写入的目的地。参数prefix会添加到生成的每一条日志前面。参数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内置的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

//定义日志级别机构提

typeLoggerstruct{

LevelLogLevel

//构造器

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日志")

打印结果:[2025-08-0410:41:56][Debug]这是debug日志[2025-08-0410:41:56][Info]这是info日志

runtime.Caller

能够拿到文件名函数名和行号

可变参数的日志

//......interface{}表示可变的任意参数,可不传也可传任意长度

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);

实现往文件里面写日志

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"

//定义日志的结构体

typeFileLoggerstruct{

LevelLogLevel

filePathstring

fileNamestring

//要打开和写入的文件,一个日志文件一个错误日志文件

fileObj*os.File

errfileObj*os.File

maxFileSizeint64

//构造函数

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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论