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. Oracle 建立索引及SQL优化

    数据库索引: 索引有单列索引,复合索引之说,如果某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经 ...

  2. sencha 安装、学习

     sencha touch 是Extjs 的手机版,Extjs是创建富客户端的AJAX应用中的重量级框架,sencha touch当然就是面向触摸设备的重量级js框架,在做基于桌面的网页时经常用的js ...

  3. web app 自适应方案总结 弹性布局之rem

    关于rem,主要参考文档 1.腾讯ISUX (http://isux.tencent.com/web-app-rem.html) 2.http://www.w3cplus.com/css3/defin ...

  4. js鼠标滑轮滚动事件绑定(兼容主流浏览器)

    /** Event handler for mouse wheel event. *鼠标滚动事件 */ var wheel = function(event) { var delta = 0; if ...

  5. MyBatis增删改查

    MyBatis的简介: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

  6. 单例 (JAVA)

    java中单例模式是一种常见的设计模式,以下是它的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例 第一种(懒汉,线程不安全):  1 publ ...

  7. [CareerCup] 15.5 Denormalization 逆规范化

    15.5 What is denormalization? Explain the pros and cons. 逆规范化Denormalization是一种通过添加冗余数据的数据库优化技术,可以帮助 ...

  8. 1021上课演练----SQL注入与避免(银行系统)

    package com.bank; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Dat ...

  9. insertAfter的兼容性

    function insertAfter(newElement,targetElement){    var parent=targetElement.parentNode;    if(parent ...

  10. hao123列表的实现

    <!DOCTYPE html><html><head>        <meta http-equiv="Content-Type" co ...