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,我们可以在终端中输 ...
随机推荐
- 【MongoDB】2014-07-25T11:00:48.634+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:10061 由于目标计算机积极拒绝,无法连接。
1:启动MongoDB 2014-07-25T11:00:48.634+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errn ...
- css设置移动端checkbox和radio样式
复选框Checkbox是Web应用常用控件,随处可见,原生的复选框控件一般就像下面这样: 这取决于操作系统和浏览器,有些时候,这种样子并不能满足设计要求,这时需要更为精致的复选框样式.以往只有少数浏览 ...
- SQL中的with as
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让 ...
- thinkphp条件查询和模糊查询的一些方法
#文章管理 public function adminArticle(){ $adminArticle=M("article"); $arr_seach=$this->sea ...
- Daily Scrum 10.31
今天是万圣节,也是编译课程设计第一次作业截至的日子,但由于大家对时间的合理安排,我们还是完成了一定的任务量. 下面是今天的Task统计: 不仅燃尽图和燃速图出不来,连那个所有迭代状态的图也出不来了.. ...
- SQL sp_executesql【转】
execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如: ...
- SPFA导读及介绍(转载)
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- sqlserver集合操作
SQLServer2005通过intersect,union,except和三个关键字对应交.并.差三种集合运算 详细如下 use tempdb go if (object_id ('t1' ) is ...
- 论url
http://www.cnblogs.com/yexiaochai/p/3650379.css文件中 background: (../images/logo.png); http://www.cnbl ...
- PLSQL Developer的使用
登陆服务器 除了 sys 用户登陆之外,其他都都选Normal 新建sql 窗口 编写执行sql语句 设置字体.颜色 工具——首选项——用户界面——字体——选择 工具——首选项——用户界面——编辑器— ...