到现在为止,我们已经完成了在线论坛项目基本功能的开发,相信你已经对Go语言Web编程中如何实现MVC架构模式以及CRUD(数据库增删改查)基本操作有了初步的认识。
不过到目前为止,所有的日志和错误处理都是杂糅在业务代码中,能不能统一进行处理,使得业务代码和日志及错误处理逻辑分离呢,就像Laravel框架中所做的那样?
当然可以,在这个简单的项目中,我们通过辅助函数来处理日志和错误。
1、日志处理初始化日志处理器首先来看日志处理,在handlers/helper.php中,新增如下日志处理器初始化代码:
import("log""os")varlogger*log.Loggerfuncinit(){file,err:=os.OpenFile("logs/chitchat.log",os.O_CREATE
os.O_WRONLY
os.O_APPEND,)iferr!=nil{log.Fatalln("Failedtoopenlogfile",err)}logger=log.New(file,"INFO",log.Ldate
log.Ltime
log.Lshortfile)}
这里我们借助Go官方提供的log包进行日志处理,首先声明一个*log.Logger类型的logger变量作为日志处理器,以便可以全局使用。默认的日志文件位于logs/chitchat.log,我们通过os.OpenFile打开这个日志文件句柄,如果文件不存在,则自动创建。然后我们通过log.New初始化日志处理器并赋值给logger,该方法需要传入日志文件、默认日志级别、以及日志格式,关于该方法的细节,我们后面在日志章节会详细介绍。
定义日志函数然后我们就可以通过logger这个日志处理器来记录日志了,在helper.go中新增如下几个日志函数:
funcinfo(args...interface{}){logger.SetPrefix("INFO")logger.Println(args...)}//为什么不命名为error?避免和error类型重名funcdanger(args...interface{}){logger.SetPrefix("ERROR")logger.Println(args...)}funcwarning(args...interface{}){logger.SetPrefix("WARNING")logger.Println(args...)}
非常简单,我们定义了三个日志函数来记录三个日志级别,分别是INFO(普通)、ERROR(错误)、WARNING(警告),然后通过调用logger.Println传入参数记录日志信息到日志文件即可,这里的参数类型是...interface{},表示可以传入参数支持任意类型、任意个数。
重构业务代码接下来,我们到业务处理器中,将原来的日志打印代码都重构为调用对应的日志函数,以handlers/auth.go为例,修改日志处理代码如下:
//src/github.