go 写 TCP 服务端/客户端 基础 :goland 学习小进阶:增加日志(2)
关于:go 语言 :Socket TCP
上一篇文章:go 写 TCP 服务 基础 :goland 学习记录(1)
这次,多加一个日志,有日志的话,很多错误或者一些包,就可以放到日志里面,遇到需要的时候,这个就很给力
不想代码:直接看源码文件(私信)
使用 loghelp 参考 go 输出日志文件:goland 输出日志文件 进阶版
服务端代码
目录:
main.go 代码
/*
* Copyright(C),2019-2020, email: 952651117@qq.com
* Author: dao
* Version: 1.0.0
* Date: 2021/6/11 18:11
* Description:日志文件
*
*/
package help
import (
"fmt"
"io"
"log"
"os"
"strings"
"time"
)
var logFile io.Writer
/**
* @Description:判断所给路径是否为文件
* @param path
* @return os.FileInfo
* @return bool
*/
func IsFile(path string) (os.FileInfo, bool) {
f, flag := IsExists(path)
return f, flag && !f.IsDir()
}
/**
* @Description:判断路径是否存在
* @param path
* @return os.FileInfo
* @return bool
*/
func IsExists(path string) (os.FileInfo, bool) {
f, err := os.Stat(path)
return f, err == nil || os.IsExist(err)
}
/**
* @Description: 写日志
* @param msg
* @param title
*/
func Logwrite(msg string, title string) {
//设置全局时间变量
now := time.Now()
//前提:创建一个 log 文件夹到根目录(这样最好了)。如果文件目录不存在,也可以使用下面代码去创建文件目录
folderName := "log/" + now.Format("20060102")
folderTemp := ""
for _, v := range strings.Split(folderName, "/") {
//判断文件,如果不存在,那么就创建
folderTemp += v
_, IsExistsPath := IsExists(folderTemp)
if !IsExistsPath {
//创建文件夹代码
os.Mkdir(folderTemp, os.ModePerm)
}
folderTemp += "/"
}
//设置日志文件,做好日志文件管理:这里是用时间做文件,每个小时生成不同文件
filefullname := "./" + folderName + "/" + now.Format("20060102") + now.Format("_15") + ".txt"
//判断文件是否存在
_, b := IsFile(filefullname)
if b {
//打开文件,
logFile, _ = os.OpenFile(filefullname, os.O_APPEND, 0666)
} else {
//新建文件
logFile, _ = os.Create(filefullname)
}
loger := log.New(logFile, "log_", log.Ldate|log.Ltime|log.Lshortfile)
//SetFlags设置输出选项
loger.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
//设置输出前缀,如果不传输前缀,那么就不输出
if title == "" {
loger.SetPrefix("log_")
} else {
loger.SetPrefix(title + "_")
}
//设置头信息
rs := []rune(msg)
msghead := ""
//为了美观:如果超过20个字符就换行
if len(rs) >= 20 {
msghead = string(rs[0:20])
//输出一条日志:头信息,10位,可以通过上面的参数来调整:rs[0:10]
loger.Output(2, msghead+"[省略...]\n"+msg+"\n")
} else {
loger.Output(2, msg+"\n")
}
//打印在控制台
fmt.Println(msg)
}
loghelp.go 代码
/*
* Copyright(C),2019-2020, email: 952651117@qq.com
* Author: dao
* Version: 1.0.0
* Date: 2021/6/11 18:11
* Description:日志文件
*
*/
package help
import (
"fmt"
"io"
"log"
"os"
"strings"
"time"
)
var logFile io.Writer
/**
* @Description:判断所给路径是否为文件
* @param path
* @return os.FileInfo
* @return bool
*/
func IsFile(path string) (os.FileInfo, bool) {
f, flag := IsExists(path)
return f, flag && !f.IsDir()
}
/**
* @Description:判断路径是否存在
* @param path
* @return os.FileInfo
* @return bool
*/
func IsExists(path string) (os.FileInfo, bool) {
f, err := os.Stat(path)
return f, err == nil || os.IsExist(err)
}
/**
* @Description: 写日志
* @param msg
* @param title
*/
func Logwrite(msg string, title string) {
//设置全局时间变量
now := time.Now()
//前提:创建一个 log 文件夹到根目录(这样最好了)。如果文件目录不存在,也可以使用下面代码去创建文件目录
folderName := "log/" + now.Format("20060102")
folderTemp := ""
for _, v := range strings.Split(folderName, "/") {
//判断文件,如果不存在,那么就创建
folderTemp += v
_, IsExistsPath := IsExists(folderTemp)
if !IsExistsPath {
//创建文件夹代码
os.Mkdir(folderTemp, os.ModePerm)
}
folderTemp += "/"
}
//设置日志文件,做好日志文件管理:这里是用时间做文件,每个小时生成不同文件
filefullname := "./" + folderName + "/" + now.Format("20060102") + now.Format("_15") + ".txt"
//判断文件是否存在
_, b := IsFile(filefullname)
if b {
//打开文件,
logFile, _ = os.OpenFile(filefullname, os.O_APPEND, 0666)
} else {
//新建文件
logFile, _ = os.Create(filefullname)
}
loger := log.New(logFile, "log_", log.Ldate|log.Ltime|log.Lshortfile)
//SetFlags设置输出选项
loger.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
//设置输出前缀,如果不传输前缀,那么就不输出
if title == "" {
loger.SetPrefix("log_")
} else {
loger.SetPrefix(title + "_")
}
//设置头信息
rs := []rune(msg)
msghead := ""
//为了美观:如果超过20个字符就换行
if len(rs) >= 20 {
msghead = string(rs[0:20])
//输出一条日志:头信息,10位,可以通过上面的参数来调整:rs[0:10]
loger.Output(2, msghead+"[省略...]\n"+msg+"\n")
} else {
loger.Output(2, msg+"\n")
}
//打印在控制台
fmt.Println(msg)
}
客户端代码
/*
* Copyright(C),2019-2020, email: 952651117@qq.com
* Author: dao
* Version: 1.0.0
* Date: 2021/6/11 16:43
* Description:
*
*/
package main
import (
"fmt"
"io"
"log"
"net"
)
func main() {
//使用协议是tcp,拨号。
conn, err := net.Dial("tcp", ":10001")
if err != nil {
fmt.Println("错误:"+err.Error(), "server")
log.Fatal(err)
return
}
fmt.Println("访问IP地址是:", conn.RemoteAddr().String())
fmt.Printf("客户端链接的地址及端口是:%v\n", conn.LocalAddr())
//向服务端发送数据
n, err := conn.Write([]byte("你好,我叫 daolizhe "))
if err != nil {
fmt.Println("错误:"+err.Error(), "server")
log.Fatal(err)
return
}
fmt.Println("向服务端发送的数据大小是:", n)
//定义一个切片
buf := make([]byte, 1024, 1024)
//接收到的内容大小。
n, err = conn.Read(buf)
if err != nil && err != io.EOF {
//对方断开连接
fmt.Println("错误:"+err.Error(), "server")
log.Fatal(err)
return
}
//将回包的内容打印出来。
fmt.Println(string(buf[:n]))
//断开TCP链接。
conn.Close()
}
效果
服务端效果如下:
日志效果:
客户端效果如下:
源码
不想代码:直接看源码文件(可以私信)