基於PHP、Python 開發Alfred workflow 工具

1、實現的功能

  • 1、快速生成 某文件中某接口的鏈路日誌 查詢語句
    • 效果 :效果
  • 2、時間戳轉換
    • 效果 :
      在這裏插入圖片描述

2、原理

  • 根據輸入的條件,生成符合條件的列表
輸出的格式:
{
    "items": [
        {
            "title": "trace go_mutual_apply ",
            "subtitle": "grep `tail -1000 *go_mutual_apply*.log_json.20200512 |grep * | tail -1 |jq \".spanid\" ` *20200512",
            "arg": "grep `tail -1000 *go_mutual_apply*.log_json.20200512 |grep * | tail -1 |jq \".spanid\" ` *20200512",
            "icon": "icon.png"
        }
    ]
}

3、腳本:快速生成 某文件中某接口的鏈路日誌 查詢語句

  • 創建腳本
    創建腳本

  • 輸入內容
    在這裏插入圖片描述

  • 腳本內容

<?php

namespace AlfredCli;
/**
 * Created by PhpStorm.
 * User: vary
 * Date: 2020/5/11
 * Time: 13:02
 */

class WorkFlowsRet
{
    private $defaultResult;
    private $query;
    private $queryReg;

    public function __construct($query, $defaultResult = [])
    {
        $this->setQuery($query);
        if (!empty($defaultResult)) {
            foreach ($defaultResult as $item) {
                if (empty($item['title'])) {
                    continue;
                }
                $this->defaultResult[] = [
                    'title'    => $item['title'],
                    'subtitle' => $item['subtitle']??'Copy to clipboard',
                    'arg'      => $item['subtitle']??$item['title'],
                    'icon'     => $item['icon']??'icon.png',
                ];
            }
        }
        return $this;
    }

    public function createItem($title, $subTitle = '', $nextQuery = '', $icon = 'icon.png')
    {
        $item                  = [
            'title'    => $title,
            'subtitle' => $subTitle ? : 'Copy to clipboard',
            'arg'      => $nextQuery ? : $subTitle,
            'icon'     => $icon,
        ];
        $this->defaultResult[] = $item;
    }

    public function result()
    {
        $newResult = [];
        if (!empty($this->query)) {
            foreach ($this->defaultResult as $key => $value) {
                $contains  = strpos($value['title'], $this->query);
                $preExists = preg_match($this->queryReg, $value['title'], $match);
                if ($contains !== false || $preExists) {
                    $newResult[] = $value;
                }
            }
            $this->defaultResult = $newResult;
        }
        return json_encode(['items' => $this->defaultResult], 320);
    }

    public function case($key)
    {
        return strpos($this->query, $key) !== false;
    }

    public function setQuery($query)
    {
        //
        $this->query    = $query;
        $query          = str_replace(" ", ".*", $query);
        $reg            = "/$query.*/";
        $this->queryReg = $reg;
    }
}


$args = $argv[1]??'';

$defaultLogName = 'go_apply,go_tets';


$defaultResult = [
    ["title" => 'path', "subtitle" => 'cd /home/log; ls -rtl|tail -20'],
    ["title" => 'gateway', "subtitle" => 'tail -1000 gateway.log_json.20200511 |grep '],
    ["title" => 'trace', "subtitle" => $defaultLogName],
];


$today  = date('Ymd');
$result = new WorkFlowsRet($args, $defaultResult);
if ($result->case("path")) {
    $result->createItem("cd /home/golanger/log; ls -rtl|tail -20");
}
if ($result->case("spanid")) {
    $result->createItem("spanid", '| tail -1 |jq ".spanid"', '| tail -1 |jq ".spanid');
}


if ($result->case('trace')) {
    //args='trace log url'
    $argsArr = explode(" ", $args);
    $file    = ($argsArr[1]??'');
    $url     = $argsArr[2]??'*';

    $result->setQuery("trace $file");

    //初始化默認值
    $logName = explode(',', $defaultLogName);
    foreach ($logName as $file) {
        $file = trim($file);
        $result->createItem("trace $file ", 'grep `tail -1000 *' . $file . '*.log_json.' . $today . ' |grep ' . $url . ' | tail -1 |jq ".spanid" ` *' . $today . '');
    }
}


echo $result->result();








  • 生成的列表 選中後複製到剪切板
    在這裏插入圖片描述
    在這裏插入圖片描述

4、Py腳本:時間戳轉換

# encoding: utf-8
import sys
import time
import json


def parse(strs):
    res = {"title": strs, "subtitle": "Copy to clipboard", "arg": strs, "icon": "icon.png"}
    return {"items": [res]}


def timestamp(param):
    strs = str(param).strip()
    if (strs == None or strs == ""):
        return int(time.time())
    elif strs.isdigit():  # 判斷是數字就轉成時間
        # 轉換成localtime
        time_local = time.localtime(float(strs))
        # 轉換成新的時間格式(2017-09-16 11:28:54)
        dtime = time.strftime("%Y-%m-%d %H:%M:%S", time_local)
        return dtime
    else:  # 判斷是字符串就轉成時間戳
        # 轉換成時間數組
        try:
            timeArray = time.strptime(strs, "%Y-%m-%d %H:%M:%S")
        except ValueError:
            timeArray = time.strptime(strs, "%Y-%m-%d")

        # 轉換成時間戳
        timestamp = int(time.mktime(timeArray))
        return timestamp


if __name__ == '__main__':
    if len(sys.argv) > 1:
        query = sys.argv[1]
        if len(sys.argv) > 2:
            query = query + " " + sys.argv[2]
    else:
        query = ''
    # query='{query}'
    strs = timestamp(query)
    #
    print(json.dumps(parse(strs)))

參考資料:https://www.jianshu.com/p/d1ba8d64cbcb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章