




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025黑龙江省一恒建设有限公司招聘13人笔试模拟试题及答案解析
- 2025湖北武汉东湖新技术开发区名师名校长专项招聘考核考试模拟试题及答案解析
- 2025贵州威宁自治县第二中学教师“跨校竞聘”工作考试备考题库及答案解析
- (2025年标准)合伙持股协议书
- 2025黑龙江牡丹江市林口县招聘公益性岗位人员补充15人考试模拟试题及答案解析
- 2025广西百色平果市马头镇卫生院公开招聘7人考试参考题库附答案解析
- 2025年北京交通职业技术学院招聘2人考试备考题库及答案解析
- 2025上海复旦大学公共卫生学院招聘科研助理岗位2名考试备考题库及答案解析
- 2025贵州威宁自治县第六中学教师“跨校竞聘”工作笔试备考试题及答案解析
- 2025湖北黄石市西塞山区招聘社区专职人员10人笔试备考试题及答案解析
- 沁水湾策划及发展建议报告
- 行政执法三项制度行政执法三项制度意义
- 粮食仓储(粮库)安全生产标准化管理体系全套资料汇编(2019-2020新标准实施模板)
- 喜茶运营管理手册和员工操作管理手册
- 比亚迪汉DM-i说明书
- 心肾综合征及其临床处理
- 普通高中课程方案
- 2022年山东高考生物试卷真题及答案详解(精校版)
- GB/T 38936-2020高温渗碳轴承钢
- 高考地理一轮复习课件 【知识精讲+高效课堂】 农业区位因素及其变化
- 互通立交设计课件
评论
0/150
提交评论