go 写 TCP 服务端/客户端 基础 :goland 学习小进阶:增加日志(2)

242 阅读4分钟

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()
}

效果

服务端效果如下:

服务端效果

日志效果:

在这里插入图片描述

客户端效果如下:

客户端效果

源码

不想代码:直接看源码文件(可以私信)