目录
1、基础篇
go语言的日志记录实现---基础篇_log_level_butt-CSDN博客
2、提高篇---增加日志文件名设置
var logFilePath = ""
var logFileName = "./serverlog.log"
var logFile = ""
//设置日志文件信息 默认是./serverlog.log
func LogSetLogFile(file string) {
logFile = file
}
//设置日志文件路径
func LogSetLogFilePath(filepath string) {
logFilePath = filepath
}
//设置日志文件名称
func LogSetLogFileName(filename string){
logFileName = filename
}
func getLogFile() string{
if "" !=logFile {
return logFile
}
return logFilePath+logFileName
}
增加上面的代码,然后将原来的写日志地方改成
WriteWithGolog(getLogFile(),strLog)
调用的时候通过如下 方式设置日志文件
Debug.LogSetLogFile("./log/log.log")
如果日志文件比较多的话,可以通过 如下设置路径
Debug.LogSetLogFilePath("/var/log/")
然后各个其他地方写日志或者 初始化到时候,调用
Debug.LogSetLogFileName("testlog.log")
设置日志文件名称。因为是全局的,所以LogSetLogFilePath调用一次就可以。
3、提高篇---增加 文件 打开参数以及perm设置
var osFlag = 0
var osPerm os.FileMode = 0
//设置文件打开参数,默认是os.O_RDWR|os.O_CREATE|os.O_APPEND,读写,创建,增量写
func LogSetOsFlag(flag int) {
osFlag = flag
}
func getOsFlag() int {
if 0 != osFlag {
return osFlag
}
return os.O_RDWR|os.O_CREATE|os.O_APPEND
}
//设置 FileMode,默认是0644
func LogSetOsPerm(perm os.FileMode) {
osPerm = perm
}
func getOsPerm() os.FileMode {
if 0 != osPerm {
return osPerm
}
return 0644
}
如图,定义两个全局的参数,通过接口调用去设置值。
默认文件的参数是,允许读写,没有文件的时候创建,以及 增量写文件。
增加之后,需要修改写文件的函数:
//写日志文件
func WriteWithGolog(filename,content string) {
f, err := os.OpenFile(filename, getOsFlag(), getOsPerm())
if err != nil {
return
}
data :=[]byte(content)
n, err := f.Write(data)
if err == nil && n < len(data) {
err = io.ErrShortWrite
}
if err1 := f.Close(); err == nil {
err = err1
}
return
}
4、提高篇----支持日志记录模式设置
var logRecordMode = L_BUTT
const (
L_NONE = 0x00000 //不加参数
L_DATE = 0x00001 //日期
L_LEVEL = 0x00002 //日志级别
L_FILE = 0x00004 //文件名
L_PATH = 0x00008 //文件路径
L_LINE = 0x00010 //文件行数
L_FUNC = 0x00020 //函数名
L_ALL = 0x00040 //全部
L_BUTT = 0xfffff //非法
)
func logModeDate() string {
logmode := getLogMode()
if logmode&L_DATE != 0 {
return CurrentTime()
}
return ""
}
func logModeLevel(level int) string {
logmode := getLogMode()
if logmode&L_LEVEL != 0 {
return "\t[" + LOG_LEVEL[level] + "] "
}
return ""
}
func logModeFile(file string) string {
logmode := getLogMode()
if logmode&L_FILE != 0{
return fmt.Sprintf("file:%s ",getFileName(file))
}
return ""
}
func logModePath(path string) string {
logmode := getLogMode()
if logmode&L_PATH != 0{
return fmt.Sprintf("path:%s ",getFilePath(path))
}
return ""
}
func logModeLine(line int) string {
logmode := getLogMode()
if logmode&L_LINE != 0{
return fmt.Sprintf("line:%d ",line)
}
return ""
}
func logModeFunc(pc uintptr) string {
logmode := getLogMode()
if logmode&L_FUNC != 0{
return fmt.Sprintf("func:%s ",getFuncName(pc))
}
return ""
}
//设置日志打印模式
//提供的有date,level,funcname,filename,filepath,line,默认 date+level+file+line+func
func LogSetLogMode(flag int) {
logRecordMode = flag
}
func getLogMode() int{
if L_BUTT != logRecordMode {
return logRecordMode
}
return logModeNormal
}
注意下,这里我定义的函数都是小写开头的。
在go里面,大写开头的函数,是可以被外部包调用的。
定义参数,就是类似于bit位的方法。
通过LogSetLogMode函数设置日志记录模式。
修改日志函数。
func LOG(level int, format string, a ...interface{}){
var strLog,fmtInfo string
//日志级别
if logRecordLevel > level {
return
}
fmtInfo = fmt.Sprintf(format,a...)
//函数信息
pc,filepath,line,ok := runtime.Caller(1)
if !ok {
strLog = logModeDate() + logModeLevel(level) + fmtInfo + "\n"
WriteWithGolog(getLogFile(),strLog)
return
}
//日志信息
strLog = logModeDate() + logModeLevel(level) + logModePath(filepath) + logModeFile(filepath) + logModeLine(line) + logModeFunc(pc) + fmtInfo + "\n"
WriteWithGolog(getLogFile(),strLog)
}
默认是全部支持的。当然你也可以自己设置成全部不支持,这样就只打印你 输入的信息。
5、提高篇---支持修改日志打印级别
var logRecordLevel = LOG_LEVEL_BUTT
//设置日志打印级别,默认ERR
func LogSetLogLevel(level int) {
logRecordLevel = level
}
func getLogLevel() int{
if LOG_LEVEL_BUTT != logRecordLevel {
return logRecordLevel
}
return LOG_LEVEL_ERROR
}
默认是记录ERROR级别的日志。
6、函数调用
func test(){
Debug.LogSetLogFile("./testlog.log")
Debug.LogSetOsFlag(os.O_RDWR|os.O_CREATE|os.O_APPEND)
Debug.LogSetLogMode(Debug.L_DATE|Debug.L_LEVEL|Debug.L_FILE|Debug.L_LINE|Debug.L_FUNC)
Debug.LogSetLogLevel(LOG_INFO)
Debug.LOG(LOG_DEBUG,"Test for file 1 debug")
Debug.LOG(LOG_INFO,"Test for file 2 information")
Debug.LOG(LOG_ERROR,"Test for file 3 error")
Debug.LOG(LOG_WARNING,"Test for file 4 warning")
}
func main(){
//Debug.LogSetLogFilePath("/var/log/")
//Debug.LogSetLogFileName("testlog.log")
fmt.Println("This is a Web Server test")
//Debug.LOG_RECODE(LOG_DEBUG,"Test for file 1")
test()
}
结果:
2019-01-13 18:46:16.178292600 [INFORMATION] file:WebServer.go line:41 func:test Test for file 2 information
2019-01-13 18:46:16.256056500 [ERROR] file:WebServer.go line:42 func:test Test for file 3 error
2019-01-13 18:46:16.257053900 [WARNING] file:WebServer.go line:43 func:test Test for file 4 warning