- 1.将各服务的日志分类,并计算各服务的日志大小。
- 2.只分类出自己所需的服务日志。
- 3.只统计各服务的日志大小。
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"sort"
"strconv"
"strings"
"time"
)
var strArr []string
var path1 = "./logclass"
var path2 = "./logsize"
var path3 = "./logservice"
var filech chan string
var ch chan string
func main() {
for {
fmt.Println("**********************************************************")
fmt.Println("********1.分类各服务。---logclass**************************")
fmt.Println("********2.计算每个服务日志大小。---logsize******************")
fmt.Println("********3.获取某一服务日志。---logservice*******************")
fmt.Println("**********************************************************")
fmt.Println("请输入1、2、3选择需要执行的功能(任意输入退出):")
ch = make(chan string, 1000000)
filech = make(chan string, 100)
strArr = []string{
}
var choice int
fmt.Scanln(&choice)
if choice == 1 {
choice1()
} else if choice == 2 {
choice2()
} else if choice == 3 {
choice3()
} else {
fmt.Println("退出。。")
return
}
}
}
func choice3() {
var choiceService string
fmt.Println("--------请输入需要统计服务的名称:")
fmt.Scanln(&choiceService)
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
fmt.Println("统计的日志为:")
GetFiles("./")
go wirteChal(ch, filech)
if !IsExist(path3) {
err := os.Mkdir(path3, 0777)
if err != nil {
log.Fatal(err)
}
} else {
os.RemoveAll(path3)
fmt.Println("删除原文件夹。。")
time.Sleep(time.Second * 1)
err := os.Mkdir(path3, 0777)
if err != nil {
}
}
fmt.Println("读取中。。。。。。。。。")
var tempname string
var temp int
var flag bool
for temp = 0; temp < len(strArr); temp++ {
if strings.Contains(strArr[temp], choiceService) {
break
}
}
fileservice := path3 + "/" + choiceService + ".log"
file, err := os.Create(fileservice)
file, _ = os.OpenFile(fileservice, os.O_RDWR|os.O_APPEND, 0766)
if err != nil {
fmt.Println(err.Error())
}
for {
flag = false
line, ok := <-ch
for i := 0; i < len(strArr); i++ {
if strings.Contains(line, strArr[i]) {
flag = true
tempname = strArr[i]
if strings.Contains(line, strArr[temp]) {
write := bufio.NewWriter(file)
write.WriteString(line)
write.Flush()
break
}
}
}
if tempname == strArr[temp] && flag == false {
write := bufio.NewWriter(file)
write.WriteString(line)
write.Flush()
}
if !ok {
defer file.Close()
fmt.Println("读完了。。")
fmt.Println(time.Now().Format("2006-01-02 15:04:05\n"))
break
}
}
}
func choice2() {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
fmt.Println("统计的日志为:")
GetFiles("./")
go wirteChal(ch, filech)
if !IsExist(path2) {
err := os.Mkdir(path2, 0777)
if err != nil {
log.Fatal(err)
}
} else {
os.RemoveAll(path2)
fmt.Println("删除原文件夹。。")
time.Sleep(time.Second * 1)
err := os.Mkdir(path2, 0777)
if err != nil {
log.Fatal(err)
}
}
var flag bool
var strArrNumber = make([]int, len(strArr))
var strArrcount []int
var strArrNew []string
var tempi int
fmt.Println("计算大小中。。。。。。。。。")
filesize := path2 + "/" + "logSize" + ".log"
file, err := os.Create(filesize)
if err != nil {
fmt.Println(err.Error())
}
file, _ = os.OpenFile(filesize, os.O_RDWR|os.O_APPEND, 0766)
for {
line, ok := <-ch
flag = false
for i := 0; i < len(strArr); i++ {
if strings.Contains(line, strArr[i]) {
flag = true
strArrNumber[i] = strArrNumber[i] + len(line)
tempi = i
break
}
}
if flag == false {
strArrNumber[tempi] = strArrNumber[tempi] + len(line)
}
if !ok {
fmt.Println("读完了。。")
for j := 0; j < len(strArrNumber); j++ {
if strArrNumber[j] != 0 {
strArrcount = append(strArrcount, strArrNumber[j])
strArr[j] = strings.ReplaceAll(strArr[j], "[", "")
strArr[j] = strings.ReplaceAll(strArr[j], "_", "")
strArrNew = append(strArrNew, strArr[j])
}
}
var strArrcountM []float64
var countAllBite int
var countAllM float64
var tempStr []string
var lengthArr []int
for i := 0; i < len(strArrcount); i++ {
var lengkong1, lengkong2 string
var lengstrcount, length int
strArrcountM = append(strArrcountM, (float64(strArrcount[i])/1024)/1024)
length = len(strArrNew[i])
lengthArr = append(lengthArr, strArrcount[i])
sort.Ints(lengthArr)
lengstrcount = len(strconv.Itoa(strArrcount[i]))
countAllBite = countAllBite + strArrcount[i]
countAllM = countAllM + strArrcountM[i]
for j := 0; j < 15-length; j++ {
lengkong1 = lengkong1 + " "
}
for k := 0; k < 15-lengstrcount; k++ {
lengkong2 = lengkong2 + " "
}
tempStr = append(tempStr, strArrNew[i]+lengkong1+strconv.Itoa(strArrcount[i])+lengkong2+strconv.FormatFloat(float64(strArrcountM[i]), 'f', 4, 64)+"M"+"\n")
write := bufio.NewWriter(file)
write.WriteString(tempStr[i])
write.Flush()
}
strcountAll := "总大小:" + "\t\t" + strconv.Itoa(countAllBite) + "\t\t" + strconv.FormatFloat(float64(countAllM), 'f', 4, 64) + "M"
write := bufio.NewWriter(file)
write.WriteString(strcountAll)
write.Flush()
fmt.Println(lengthArr)
fmt.Println(strcountAll)
defer file.Close()
fmt.Println("读完了。。")
fmt.Println(time.Now().Format("2006-01-02 15:04:05\n"))
break
}
defer file.Close()
}
}
func choice1() {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
fmt.Println("统计的日志为:")
GetFiles("./")
go wirteChal(ch, filech)
var temp int
var filetype []*os.File
var filenameall []string
var fileName string
var replaceName string
var tempName string
var flag bool
var newFile1 *os.File
if !IsExist(path1) {
err := os.Mkdir(path1, 0777)
if err != nil {
log.Fatal(err)
}
} else {
os.RemoveAll(path1 + "/")
fmt.Println("删除原文件夹。。")
time.Sleep(time.Second * 1)
err := os.Mkdir(path1, 0777)
if err != nil {
log.Fatal(err)
}
}
strArrNew := strArr
fmt.Println("读取中。。。。。。。。。")
for {
line, ok := <-ch
flag = false
for i := 0; i < len(strArr); i++ {
if strings.Contains(line, strArr[i]) {
flag = true
fileName = path1 + "/" + strArrNew[i] + ".log"
replaceName = strings.ReplaceAll(fileName, "[", "")
replaceName = strings.ReplaceAll(replaceName, "_", "")
tempName = replaceName
_, err := os.Lstat(replaceName)
if os.IsNotExist(err) {
_, err = os.Create(replaceName)
if err != nil {
fmt.Println(err.Error())
}
tempName = replaceName
newFile1, _ = os.OpenFile(replaceName, os.O_RDWR|os.O_APPEND, 0766)
filetype = append(filetype, newFile1)
filenameall = append(filenameall, replaceName)
temp++
for i := 0; i < len(filenameall); i++ {
if filenameall[i] == tempName {
wirteFile(filetype[i], line, tempName)
}
}
continue
if err != nil {
fmt.Println(err.Error())
}
} else {
tempName = replaceName
for i := 0; i < len(filenameall); i++ {
if filenameall[i] == tempName {
wirteFile(filetype[i], line, tempName)
}
}
}
}
}
if flag == false {
tempName = replaceName
for i := 0; i < len(filenameall); i++ {
if filenameall[i] == tempName {
wirteFile(filetype[i], line, tempName)
}
}
}
if !ok {
fmt.Println("读完了。。")
fmt.Println(time.Now().Format("2006-01-02 15:04:05\n"))
break
}
}
}
func wirteFile(fileName *os.File, line, tempName string) {
var trueName string
if trueName != tempName {
trueName = tempName
write := bufio.NewWriter(fileName)
write.WriteString(line)
write.Flush()
} else {
write := bufio.NewWriter(fileName)
write.WriteString(line)
write.Flush()
}
}
func wirteChal(ch chan string, filech chan string) {
var filenumber int
var pathname = "./"
filenumber = GetFilesNumber(pathname)
for i := 0; i < filenumber; i++ {
file := <-filech
f, err := os.Open(pathname + "/" + file + "")
if err != nil {
panic(err)
}
defer f.Close()
rd := bufio.NewReader(f)
for {
line, err := rd.ReadString('\n')
ch <- line
if err != nil || io.EOF == err {
break
}
}
}
close(ch)
}
func GetFiles(folder string) {
files, _ := ioutil.ReadDir(folder)
for _, file := range files {
if file.IsDir() {
GetFiles(folder + "/" + file.Name())
} else {
if strings.Contains(file.Name(), "business") && strings.Contains(file.Name(), ".log") && !strings.Contains(file.Name(), ".gz") {
filech <- file.Name()
fmt.Println(file.Name())
}
}
}
return
}
func GetFilesNumber(folder string) (number int) {
files, _ := ioutil.ReadDir(folder)
var t int
for _, file := range files {
if file.IsDir() {
GetFilesNumber(folder + "/" + file.Name())
} else {
if strings.Contains(file.Name(), "business") && strings.Contains(file.Name(), ".log") && !strings.Contains(file.Name(), ".gz") {
t++
}
}
}
return t
}
func IsExist(path string) bool {
_, err := os.Stat(path)
return err == nil || os.IsExist(err)
}