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的更多相关文章

  1. JS字符串和数组常用方法

    1.indexOf() – 返回字符串中一个字符第一处出现的索引,接收2个参数:要查找的字符,从哪个位置开始查找:.lastIndexOf()--返回字符串中某一个字符最后一次出现的索引值. 如果没有 ...

  2. MongoDB同步机制

    复制 在此页 冗余和数据可用性 在MongoDB中复制 异步复制 自动故障转移 读取操作 交易次数 更改流 附加的功能 甲副本集 MongoDB中是一组mongod其保持相同的数据集的过程.副本集提供 ...

  3. REPL LOG

    using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressi ...

  4. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  5. Node.js之路【第二篇】Nodejs中的pip(NPM)&REPL

    什么是NPM 在学Python的时候我们肯定会使用第三方模块或者编写模块供别人使用,我们有一个非常好用的pip来帮我们管理我们的模块包!那么Nodejs重的模块包呢? 对没错就是NPM,他是随同Nod ...

  6. REPL环境

    一.Node的REPL基本操作 REPL(Read-eval-print-loop):交互式解析器 在REPL环境下,可以定义和运行变量.函数.对象. REPL的常用命令: 进入node,即进入了RE ...

  7. 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 ...

  8. Node.js系列基础学习----安装,实现Hello World, REPL

    Node.js基础学习 简介 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一 ...

  9. node js学习(二)——REPL(交互式解释器)

    1.简介 Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输 ...

随机推荐

  1. 关于IE9中webdiriver使用autoit上传文件报错

    在ie9中, type="file"的元素是通过js打开的 webdirver结合autoit上传文件时,会报拒绝访问的错 sciTE编辑器中是这样写的: #include < ...

  2. 360safe安全卫士防网站攻击源码

    近段时间,公司网站老被攻击,于是研究起防止攻击方法,当然无外乎就是SQL注入之类的问题,无意间发现了一个360安全卫士提供的源码,觉得挺好的,咋们暂且不说防攻击效果,至少思路是很好的,奉献给大家,大家 ...

  3. 关于web前端(知乎上收集)

    1988年的图灵奖得主Ivan Sutherland就是搞人机交互的,事情跟现在的前端是一个路子. 微博上@_Franky: 这和司机一个道理. 开车也是易学难精的.基本个把月就能上路. 而需要赛车手 ...

  4. text-indent:-9999px 字体隐藏问题

    为什么要字体隐藏? 通常为了传达更好的视觉效果,我们常用图片替代掉字体.但是为了html语义化,常常要给内容模块加上一些标题来让页面更有意义,在抛开css裸奔的情况下也能很顺利的汲取到页面信息.为此我 ...

  5. LruCache

    参考文章: LruCache源码解析

  6. [LintCode] Identical Binary Tree 相同二叉树

    Check if two binary trees are identical. Identical means the two binary trees have the same structur ...

  7. [转载]触发ASSERT(afxCurrentResourceHandle != NULL)错误的原因

    触发ASSERT(afxCurrentResourceHandle != NULL)错误的原因 Debug Assert error afxwin1.inl line:22 翻译参考 http://w ...

  8. php修改指定文件的指定内容

    <?php $origin_str = file_get_contents('路径/文件.txt'); $update_str = str_replace('qwe=0', 'qwe=1', $ ...

  9. 关于网上常见的几种MD5加密的区别

    (1) using System.Security.Cryptography; byte[] result = Encoding.Default.GetBytes(yps); //tbPass为输入密 ...

  10. 有效的PhoneGap CSS: WebKit Tap Highlight Color

    原文链接:文章1:http://phonegap-tips.com/articles/essential-phonegap-css-webkit-tap-highlight-color.html(此文 ...