看日志是开发者平常排查BUG所需要的学会的技能,但日志是怎么样来的呢?通过平常开发者自己打日志,经过日志包进行处置,打印日志到控制台还是记录日志到文件中!
下面咱就来学一下日志是怎么样记录下来的

以下日志器概念了各类日志器的行为,通过RegisterWriter注册达成了日志器的子类日志器,然后通过Log办法来进行循环调用注册进去的日志采集器的write写日志办法。
//声明日志写入器接口typeLogWriterinterface{Write(datainterface{})error}//日志器typeLoggerstruct{//这个日志器用到的日志写入器writerList[]LogWriter}//注册一个日志写入器func(l*Logger)RegisterWriter(writerLogWriter){l.writerList=append(l.writerList,writer)}//将一个data种类的数据写入日志func(l*Logger)Log(datainterface{}){//遍历所有注册的写入器for_,writer:=rangel.writerList{//将日志输出到每个写入器中writer.Write(data)}}//创建日志器的实例funcNewLogger()*Logger{returnLogger{}}2. 命令写入日志器
这个日志器达成了日志器的接口行为write,可以进行日志的写入,其写入手法是通过Os包来写入到命令行(控制台)中!
//命令行写入器typeconsoleWriterstruct{}//达成LogWriter的Write()办法func(f*consoleWriter)Write(datainterface{})error{//将数据序列化为字符串str:=fmt.Sprintf(%v/n,data)//将数据以字节数组写入命令行中_,err:=os.Stdout.Write([]byte(str))returnerr}//创建命令行写入器实例funcNewConsoleWriter()*consoleWriter{returnconsoleWriter{}}3. 文件写入日志器
这也是达成了日志器的一个达成类,文件日志器,一种容易见到的将日志写入文件记录的日志采集器。用前需要先SetFile设置好日志文件名,最后将日志作为字节写入到文件中。
//声明文件写入器typefileWriterstruct{file*os.File}//设置文件写入器写入的文件名func(f*fileWriter)SetFile(filenamestring)(errerror){//假如文件已经打开,关闭前一个文件iff.file!=nil{f.file.Close()}//创建一个文件并保存文件句柄f.file,err=os.Create(filename)//假如创建的过程出现错误,则返回错误returnerr}//达成LogWriter的Write()办法func(f*fileWriter)Write(datainterface{})error{//日志文件可能没创建成功iff.file==nil{//日志文件没筹备好returnerrors.New(filenotcreated)}//将数据序列化为字符串str:=fmt.Sprintf(%v/n,data)//将数据以字节数组写入文件中_,err:=f.file.Write([]byte(str))returnerr}//创建文件写入器实例funcNewFileWriter()*fileWriter{returnfileWriter{}}4. Demo演示
通过New的方法创建日志器,进行注册到日志器集合中,下面演示了两种日志器怎么用!!!
//创建日志器funccreateLogger()*Logger{//创建日志器l:=NewLogger()//创建命令行写入器cw:=cmdwriter.NewConsoleWriter()//注册命令行写入器到日志器中,cw达成了LogWriter接口,故可作为RegisterWriter函数的参数,种类为Logwriterl.RegisterWriter(cw)//创建文件写入器fw:=filerwriter.NewFileWriter()//设置文件名iferr:=fw.SetFile(log.log);err!=nil{fmt.Println(err)}//注册文件写入器到日志器中,fw达成了LogWriter接口l.RegisterWriter(fw)returnl}funcmain(){//筹备日志器l:=createLogger()//写一个日志l.Log(hello)}

一个好的日志器功能是可扩展的,上述例子仅只不过可以扩展不同类型的日志采集器。
在官方的logger中是可以进行选择写入级别的,可以概念一个枚举,在对应的枚举写入级别下,进行对应的权限写入,可以改造write办法,而不仅仅是简单的写入就完事了。





