美文网首页
log过滤器

log过滤器

作者: 极速魔法 | 来源:发表于2020-03-24 09:25 被阅读0次

log中提取关键词,关键词所在行的时间写入 csv文件。

准备工作

Win+R,输入cmd,回车进入cmd命令行。
进入filter.exe所在的目录。
filter.exe放在 log文件所在的目录。

命令行用法

// 显示帮助信息,$不要拷贝
$ filter.exe -help

// 相当于执行 filter.exe -all=true -key="ov9281",将对当前目录下的所有*.log文件
//(不包含子文件夹下的log文件),
// 查找默认关键词“ov9281”,并逐个写入log对应的csv文件,
// 一个log文件对应一个csv文件
$ filter.exe

//对单个文件执行搜索关键词并将结果写入 csv文件。
// all 要指定为 false,默认为true,-file,-key,-all顺序不限。
// "test.log"为相对路径
// -file="D:\\script\\go\\Filter\\2020_03_23_Serial-COM3.log",指定为绝对路径。
$ filter.exe -key="ov9281" -file="test.log" -all=false

// 搜索关键词 ov9281,并将搜索所有的*.log文件,搜索结果 
// 写入log文件对应的csv文件
// 推荐使用这种
$ fitler.exe -key="0v9281"

filter.go

package main

import (
    "encoding/csv"
    "flag"
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
    "regexp"
    "strings"
    "time"
)

func main() {

    keyword := flag.String("key", "ov9281", "search keyword by input")
    all := flag.Bool("all", true, "search every *.log files in current folder")
    filename := flag.String("file", "test.log", "log file name path")

    flag.Parse()

    if !(*all) {
        WriteToCsv(*filename, *keyword)
    } else {
        fmt.Println("Paths: ", FindAllLogs())
        for _, path := range FindAllLogs() {
            WriteToCsv(path, *keyword)
        }
    }

}

func WriteToCsv(filename, keyword string) {
    content, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Printf("read file %s,err: %v\n", filename, err)
        return
    }
    lines := strings.Split(string(content), "\n")

    // match datetime
    re := regexp.MustCompile("[\\d:_]{17}")

    // record matched
    var ret []string
    for _, line := range lines {
        // contain keyword
        if strings.Contains(line, keyword) {
            ret = append(ret, re.FindString(line))
        }
    }

    // write to csv
    prefix := strings.Split(filename, ".")[0]
    //prefix file name
    csvFile := prefix + ".csv"
    f, err := os.OpenFile(csvFile, os.O_RDWR|os.O_CREATE, 0644)

    if err != nil {
        fmt.Printf("create or open file: %s error:%v\n", csvFile, err)
    }

    defer f.Close()

    if err != nil {
        fmt.Printf("create csv file: %s err: %v\n", csvFile, err)
    }

    w := csv.NewWriter(f)

    res := ParseRecords(ret)

    w.WriteAll(res)
    if err := w.Error(); err != nil {
        fmt.Println("error writing csv:", err)
    }
    fmt.Printf("write to csv:%s success!\n", prefix+".csv")
    return
}

func FindAllLogs() []string {
    var paths []string
    filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            fmt.Printf("accessing a path %q: %v\n", path, err)
            return err
        }
        if !info.IsDir() && strings.Contains(info.Name(), ".log") {
            paths = append(paths, path)
        }

        return nil
    })

    return paths
}

//  sub
func ParseRecords(records []string) [][]string {
    var ret [][]string
    var timeSlice []time.Time
    for _, item := range records {
        t, err := ParseTimeStr(item)
        if err != nil {
            fmt.Println("parse err: %v\n", err)
        }
        timeSlice = append(timeSlice, t)
    }

    // caculate delta time
    ret = append(ret, []string{records[0], "0s"})
    for index := 1; index < len(timeSlice); index++ {
        delta := timeSlice[index].Sub(timeSlice[index-1])
        ret = append(ret, []string{records[index], delta.String()})
    }

    return ret
}

func ParseTimeStr(timeStr string) (time.Time, error) {
    timeFormat := "20060102_15:04:05"
    t, err := time.Parse(timeFormat, timeStr)
    if err != nil {

        return time.Time{}, err
    }

    return t, nil
}

相关文章

  • log过滤器

    log中提取关键词,关键词所在行的时间写入 csv文件。 准备工作 Win+R,输入cmd,回车进入cmd命令行。...

  • 用正则表达式过滤logcat中的多个tag的日志

    在Android Studio中, 在过滤器的by Log Tag选项中配置.我配置了2个tag filter方便...

  • log4j2过滤器篇

    简单来说,log4j2中的过滤器主要是对日志的输出进行过滤,符合条件的日志可以被当前过滤器通过,进入到后续的处理;...

  • Android WiFi调试常用标签(Tag)

    WiFi的标签 都知道的,要看Android log如果不加过滤器,那么对应的信息量极其的庞大,要在这些大信息量找...

  • 工具类之LogUtils

    安卓开发离不开记录log日志,封装了一份简单的日志工具类,具有设置日志总开关,是否写入文件,日志过滤器和自定义标签...

  • VUE过滤器和计算属性

    过滤器主要分为全局过滤器和局部过滤器。 全局过滤器如下: 局部过滤器如下: 计算属性如下: 过滤器中获取日期: 计...

  • 自定义过滤器的封装

    封装自定义过滤器 引入过滤器 添加+注册过滤器 使用过滤器

  • vue的过滤器及计算属性

    1,过滤器:让要显示在页面上的内容进行重新筛选2,过滤器分为全局过滤器和局部过滤器全局过滤器: 局部过滤器: 3,...

  • 2018-09-18 vue初学六(过滤器:filter(fil

    1.1过滤器 过滤器分为两种:1、全局过滤器:filter2、局部过滤器:filters 1.2过滤器 (当前时间...

  • 过滤器

    ...过滤器分为全局过滤器和局部过滤器全局过滤器的格式:html:{{数据,全局过滤器的名字}}//解析数据js:...

网友评论

      本文标题:log过滤器

      本文链接:https://www.haomeiwen.com/subject/mkwgyhtx.html