go 开发属于自己的日志库-文件日志库原型实现

栏目: Go · 发布时间: 7年前

内容简介:上一篇中已经讲述了日志库的需求,这一篇中我们来实现日志库的原型。新建一个项目,这里我用的因为我们是要打印到文件里面去,所以我还需要新建一个

上一篇中已经讲述了日志库的需求,这一篇中我们来实现日志库的原型。

新建一个项目,这里我用的 hm_log ,在项目下新建一个 log_interface.go 日志规范,定义日志级别的方法:

package hm_log

type Log interface {
	Debug(format string, args ...interface{}) // ...表示接收可变参数
	Trace(format string, args ...interface{})
	Info(format string, args ...interface{})
	Warn(format string, args ...interface{})
	Error(format string, args ...interface{})
	Fatal(format string, args ...interface{})
	Close() // 文件需要进行关闭操作
}
复制代码

因为我们是要打印到文件里面去,所以我还需要新建一个 file.go :

package hm_log

type FileLog struct {
    logPath string
    logName string
}

func NewFileLog(logPath, logName string) Log { 
// 为什么返回的Log,上一篇中已经说明
    return &FileLog{
        logPath: logPath,
        logName: logName,
    }
}

func (f *FileLog) Debug(format string, args ...interface{}) {

}

func (f *FileLog) Trace(format string, args ...interface{}) {

}

func (f *FileLog) Info(format string, args ...interface{}) {

}

func (f *FileLog) Warn(format string, args ...interface{}) {

}

func (f *FileLog) Error(format string, args ...interface{}) {

}

func (f *FileLog) Fatal(format string, args ...interface{}) {

}

func (f *FileLog) Close() {

}

复制代码

现在我们基本实现了file的初始代码了,然后现在来实现file的功能。实现功能之前,新建一个 log_const.go ,我们需要一些常量。

package hm_log

const (
	DebugLevel = iota
	TraceLevel
	InfoLevel
	WarnLevel
	ErrorLevel
	FatalLevel
)
复制代码

因为我们是写入文件中的,所以需要进行打开文件操作。为了在后续的日志查看方便,我们需要将普通日志和错误日志分开存储。

type FileLog struct {
    logPath  string
    logName  string
    file     *os.File
    warnFile *os.File
}

func NewFileLog(logPath, logName string) Log { 
// 为什么返回的Log,上一篇中已经说明
    log := &FileLog{
        logPath: logPath,
        logName: logName,
    }
    
    log.init()
    
    return log
}

func (f *FileLog) init() {
    // 一般日志
    filename := fmt.Sprintf("%s/%s.log", f.logPath, f.logName)
    file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755) // os.O_CREATE 创建文件 os.O_APPEND 追加写入 os.O_WRONLY 只写操作
    if err != nil {
        panic(fmt.Sprintf("open faile %s failed, err: %v", filename, err)
    }
    
    f.file = file
    
    // 错误日志
    warnfilename := fmt.Sprintf("%s/%s.log.wf", f.logPath, f.logName)
    warnfile, err := os.OpenFile(warnfilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755) // os.O_CREATE 创建文件 os.O_APPEND 追加写入 os.O_WRONLY 只写操作
    if err != nil {
        panic(fmt.Sprintf("open faile %s failed, err: %v", warnfilename, err)
    }
    
    f.warnFile = warnfile   
}

复制代码

然后就可以实现之前的日志方法了。

func (f *FileLog) Debug(format string, args ...interface{}) {
    fmt.Fprintf(f.file, format, args...)
    fmt.Fprintln(f.file)
}

func (f *FileLog) Trace(format string, args ...interface{}) {
    fmt.Fprintf(f.file, format, args...)
    fmt.Fprintln(f.file)
}

func (f *FileLog) Info(format string, args ...interface{}) {
    fmt.Fprintf(f.file, format, args...)
    fmt.Fprintln(f.file)
}

func (f *FileLog) Warn(format string, args ...interface{}) {
    fmt.Fprintf(f.warnFile, format, args...)
    fmt.Fprintln(f.warnFile)
}

func (f *FileLog) Error(format string, args ...interface{}) {
    fmt.Fprintf(f.warnFile, format, args...)
    fmt.Fprintln(f.warnFile)
}

func (f *FileLog) Fatal(format string, args ...interface{}) {
    fmt.Fprintf(f.warnFile, format, args...)
    fmt.Fprintln(f.warnFile)
}

func (f *FileLog) Close() {
    f.file.Close()
    f.warnFile.Close()
}
复制代码

到这里文件日志库基本完成了,当写完一个功能时,我们需要进行单元测试,所以我们新建一个 log_test.go 来测试我们写的文件日志库。

package log

import (
    "testing"
)

func TestFileLog(t *testing.T) {
    log := NewFileLog(".", "test")
    log.Debug("this is file debub test")
    log.Warn("this is file warn test")
    log.Close()
}
复制代码

使用go test进行单元测试。然后可以看到我们的项目下多了一个test.log和test.log.wf文件。打开文件,可以看到我们的日志已经成功写入了日志文件里面。下一篇我们完善这个文件日志库原型。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms in Python

Data Structures and Algorithms in Python

Michael T. Goodrich、Roberto Tamassia、Michael H. Goldwasser / John Wiley & Sons / 2013-7-5 / GBP 121.23

Based on the authors' market leading data structures books in Java and C++, this book offers a comprehensive, definitive introduction to data structures in Python by authoritative authors. Data Struct......一起来看看 《Data Structures and Algorithms in Python》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具