go log repl
package main import (
"fmt"
"os/exec"
"regexp"
"strconv"
"strings"
"time"
) func main() {
info() for {
var line string
fmt.Scanf("%s\n", &line)
isFinish, message := preprocess(line)
if isFinish {
msg(message)
continue
}
echo, url, err := newLogHelper(line).process()
if err != nil {
msg(err.Error())
continue
}
msg(echo)
args := []string{"cmd", "/c", "start", "chrome"}
cmd := exec.Command(args[0], append(args[1:], url)...)
cmd.Start()
}
} func msg(str string) {
fmt.Println(str)
} func info() {
titleList = []string{"可定检查", "中间产品层", "创建订单"}
keyList = []string{"member_hotel_check_avail", "get_corp_hotel_data", "member_hotel_reservation", "contract_hotel_check_avail", "get_corp_hotel_data", "soa2__create_order_log"}
app150120 = []string{""}
helpText = "k+数字(默认是k1):\n\r "
for i := 0; i < len(titleList); i++ {
helpText += fmt.Sprintf("%d", i+1) + "." + titleList[i] + "\n\r "
}
helpText += "默认会员,协议在数字前加0\n\rd/h+数字(默认是d7):\n\r 1.一天(h是小时)内日志\n\r 2.两天(h是小时)内日志\n\r 以此类推...\n\ro+数字:\n\r 打开ordeidr=数字的日志\n\rr+数字:\n\r 打开roomId=数字的日志\n\ru+卡号:\n\r 开的uid=卡号的日志\n\rc+数字:\n\r 打开cityID=数字的日志\n\rhelp:查看命令\n\ree切换生产/测试环境"
msg(helpText)
} func preprocess(str string) (isFinish bool, msg string) {
switch {
case str == "help":
return true, helpText
case str == "ee":
isPro = !isPro
if isPro {
return true, "切换为生产环境日志查询..."
} else {
return true, "切换为测试环境日志查询..."
} default:
return false, "" }
} var titleList []string
var keyList []string
var helpText string
var isPro bool
var app150120 []string const support = 3 type LogHelper struct {
cmd, o, r, u, c string //o==orderid ,r == roomid,u=uid,c=cityid
k, d, h int
} func newLogHelper(line string) *LogHelper {
return &LogHelper{cmd: strings.ToLower(line)}
} func (h *LogHelper) process() (string, string, error) {
if strings.Contains(h.cmd, "ee") {
isPro = !isPro
}
h.k = h.getNumber("k")
h.d = h.getNumber("d")
h.h = h.getNumber("h") h.o = h.getStr("o")
h.r = h.getStr("r")
h.u = h.getStr("u")
h.c = h.getStr("c")
var dateStr, title, key string
var beginTime time.Time
endTime := time.Now()
echo := "正在打开" switch {
case h.d > 0:
beginTime = endTime.AddDate(0, 0, -h.d)
echo += to_s(h.d) + "天内的"
case h.h > 0:
beginTime = endTime.Add(time.Hour * time.Duration(-h.h))
echo += to_s(h.h) + "小时内的"
default:
beginTime = endTime.AddDate(0, 0, -7)
echo += "7天内的"
}
dateStr = h.getDateStr(beginTime, endTime)
tags := "~tags="
switch {
case h.k > 0 && h.k < support:
key = "key=" + keyList[h.k-1]
title = "会员" + titleList[h.k-1]
case h.k >= support:
key = "key=" + keyList[h.k-1]
title = "协议" + keyList[h.k-support]
default:
// if !strings.Contains(h.cmd, "o") {
// key = "key=" + keyList[0]
// title = "会员" + titleList[0]
// }
}
if len(key) > 4 {
tags += key + ";"
}
echo += title
if h.o != "" {
ss := "orderId=" + h.o
echo += "&" + ss
tags += ss + ";"
} if h.r != "" {
ss := "roomId=" + h.r
echo += "&" + ss
tags += ss + ";"
} if h.u != "" {
ss := "uid=" + h.u
echo += "&" + ss
tags += ss + ";"
} if h.c != "" {
ss := "cityId=" + h.c
echo += "&" + ss
tags += ss + ";"
}
if isPro {
echo += "(生产环境)"
} else {
echo += "(测试环境)"
} echo += "日志..."
var appid string
if contains(app150120, strings.Replace(key, "key=", "", 1)) {
appid = "~app=150120"
}
url := "http://logging.fws.qa.nt.ctripcorp.com/#?" if isPro {
url = "http://logging.ctripcorp.com/#?"
} url += dateStr + appid + tags
return echo, url, nil
} func (helper *LogHelper) getStr(prefix string) string {
reg := regexp.MustCompile(prefix + `(\d+)`)
slice := reg.FindStringSubmatch(helper.cmd)
if len(slice) > 1 {
return slice[1]
}
return ""
} func (h *LogHelper) getNumber(prefix string) int {
str := h.getStr(prefix)
if str != "" && str[0] == '0' {
return to_i(str) + support - 1
}
return to_i(str)
}
func (h *LogHelper) getDateStr(beginTime time.Time, endTime time.Time) string {
return fmt.Sprintf("fromDate=%s~toDate=%s", beginTime.Format("2006-01-02_15:04:05"), endTime.Format("2006-01-02_15:04:05"))
} func to_s(num int) string {
return strconv.Itoa(num)
} func to_i(str string) int {
num, err := strconv.Atoi(str)
if err != nil {
return 0
}
return num
} func contains(slice []string, item string) bool {
set := make(map[string]struct{}, len(slice))
for _, s := range slice {
set[s] = struct{}{}
} _, ok := set[item]
return ok
}
go log repl的更多相关文章
- JS字符串和数组常用方法
1.indexOf() – 返回字符串中一个字符第一处出现的索引,接收2个参数:要查找的字符,从哪个位置开始查找:.lastIndexOf()--返回字符串中某一个字符最后一次出现的索引值. 如果没有 ...
- MongoDB同步机制
复制 在此页 冗余和数据可用性 在MongoDB中复制 异步复制 自动故障转移 读取操作 交易次数 更改流 附加的功能 甲副本集 MongoDB中是一组mongod其保持相同的数据集的过程.副本集提供 ...
- REPL LOG
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressi ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- Node.js之路【第二篇】Nodejs中的pip(NPM)&REPL
什么是NPM 在学Python的时候我们肯定会使用第三方模块或者编写模块供别人使用,我们有一个非常好用的pip来帮我们管理我们的模块包!那么Nodejs重的模块包呢? 对没错就是NPM,他是随同Nod ...
- REPL环境
一.Node的REPL基本操作 REPL(Read-eval-print-loop):交互式解析器 在REPL环境下,可以定义和运行变量.函数.对象. REPL的常用命令: 进入node,即进入了RE ...
- ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
salve复制线程停止,尝试start slave 时报ERROR 1872错误mysql> system perror 1872 MySQL error code 1872 (ER_SLAVE ...
- Node.js系列基础学习----安装,实现Hello World, REPL
Node.js基础学习 简介 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一 ...
- node js学习(二)——REPL(交互式解释器)
1.简介 Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输 ...
随机推荐
- HTML 父元素与子元素之间的margin-top问题
问题: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. 代码如下: <div ...
- c# 集合及特殊集合
1.ArrayList集合 习题:输入人数,输入分数,存到集合里面,之后再读取出来,求平均分,排序打印. 2.Stack 集合 3.Queue 队列集合 每日一语:脚跟立定以后,你必须拿你的力量 ...
- JS验证只允许输入数字
1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafter ...
- 【转】Linux安装方法一(U盘引导)
Ubuntu 13.04正式版已经在4月25日发布了,相信很多人和我一样很想安装体验一下,但是现在的Ubuntu 13.04文件已经是794M,但是很难刻录到一张CD中,所以采用U盘启动安装Ubunt ...
- IOS第17天(1,Quartz2D图片水印)
****图片 水印 #import "HMViewController.h" @interface HMViewController () @property (weak, non ...
- js == 判断
根据阮一峰介绍的算法文章分12部分可判断: 如果x不是正常值(比如抛出一个错误),中断执行. 如果y不是正常值,中断执行. 如果Type(x)与Type(y)相同,执行严格相等运算x === y. 如 ...
- copy module
需求,当有一个实例a,我们需要一个新的实例b,b同a拥有相同的属性. 当我们使用a=b的模式的时候是一个赋值的过程.a和b指向同一个实例.b的任何操作都同a一样. 在这个使用需要使用copy模块.根据 ...
- ThinkPHP 3.2.3 Widget 扩展的使用
ThinkPHP3.2.3 手册中 Widget 扩展的地址是: http://www.kancloud.cn/manual/thinkphp/1862 Widget 扩展一般用于页面组件的扩展,和自 ...
- RadioButton Control
Horizontal Radiobuttons Column2 is DataGridViewTextBoxCell Horizontal Custom Radiobuttons => usin ...
- DevExpress GridView加入DevExpress中的右键菜单PopuMenu
1. 添加一个Barmanager控件 2. 加入popumenu控件,点击该控件右上角的黑色三角号,编辑选项,点击编辑的选项,选择事件,编辑事件. 3. 在使用该右键菜单的控件添加MouseUp事件 ...