ログを表示するための世界で最も便利な*インターフェイスを開発します

Webインターフェイスを使用してログを表示したことがある場合は、原則として、これらのインターフェイスが非常に便利で応答性が低いことに気付いたと思います。慣れることができるものもあれば、まったくひどいものもありますが、すべての問題の理由は、ログを誤って表示するタスクに取り組んでいるためだと思います。CLI(コマンドラインインターフェイス)がより適切に機能するWebインターフェイスを作成しようとしています。私は個人的にtail、grep、awkなどを操作するのに非常に快適です。したがって、ログを操作するための理想的なインターフェイスは、tailやgrepに似ていますが、同時に多くのサーバーからのログを読み取るために使用できます。 ..。つまり、もちろん、ClickHouseからそれらを読んでください!



* habrapuserの個人的な意見によると youROCK



logscliに会う



インターフェイスの名前は思いつきませんでした。正直なところ、プロトタイプとして存在しますが、ソースをすぐに確認したい場合は、https//github.com/YuriyNasretdinov/logscli(350行の選択したGoコード)を歓迎します ..。



機能



私の目標は、tail / grepに慣れている人に馴染みのあるインターフェイスを作成すること、つまり、次のことをサポートすることでした。



  1. フィルタリングせずにすべてのログを表示します。
  2. 固定サブストリング(-Fyフラグgrepを含むストリングを残します
  3. 通常の式(フラグ-Ey grep)に一致する行を残します。
  4. 通常、最新のログが最初に対象となるため、デフォルトでは、スキャンは時系列の逆順です。
  5. ( -A, -B -C grep, N , , ).
  6. , ( tail -f | grep).
  7. less, head, tail — ; , ; SIGPIPE , , tail, grep UNIX-.




, - ClickHouse. , lsd kittenhouse, .



. , . , — , ClickHouse ( ~1 ).



, :



CREATE TABLE logs(
    category LowCardinality(String), --   ()
    time DateTime, --  
    millis UInt16, --  (   ,  ..):  ,   ,       
    ..., --   ,   ,  ,   
    message String --  
) ENGINE=MergeTree()
ORDER BY (category, time, millis)


, - , , Amazon 2015 . , , , .



Amazon ClickHouse

:



CREATE TABLE amazon(
   review_date Date,
   time DateTime DEFAULT toDateTime(toUInt32(review_date) * 86400 + rand() % 86400),
   millis UInt16 DEFAULT rand() % 1000,
   marketplace LowCardinality(String),
   customer_id Int64,
   review_id String,
   product_id LowCardinality(String),
   product_parent Int64,
   product_title String,
   product_category LowCardinality(String),
   star_rating UInt8,
   helpful_votes UInt32,
   total_votes UInt32,
   vine FixedString(1),
   verified_purchase FixedString(1),
   review_headline String,
   review_body String
)
ENGINE=MergeTree()
ORDER BY (time, millis)
SETTINGS index_granularity=8192


, , .



tsv- ~10-20, , 16 . TSV- :



for i in *.tsv; do
    echo $i;
    tail -n +2 $i | pv |
    clickhouse-client --input_format_allow_errors_ratio 0.5 --query='INSERT INTO amazon(marketplace,customer_id,review_id,product_id,product_parent,product_title,product_category,star_rating,helpful_votes,total_votes,vine,verified_purchase,review_headline,review_body,review_date) FORMAT TabSeparated'
done


Persistent Disk ( HDD) Google Cloud 1000 ( , , , SSD ) ~75 / 4 .



  • , Google,


, , .





ClickHouse full scan , , , . HTTP- , HTTP: send_progress_in_http_headers=1. , Go , HTTP 1.0 ( 1.1!) ClickHouse, TCP- ClickHouse, GET /?query=... HTTP/1.0\n\n - , .



ClickHouse



ClickHouse ( 2019 ?) ORDER BY,



SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC


, message "something", .



, , ClickHouse , , . cancel_http_readonly_queries_on_client_close=1.



SIGPIPE Go



, , some_cmd | head -n 10, some_cmd , head 10 ? : head , pipe , stdout some_cmd , , «». some_cmd pipe, SIGPIPE, .



Go , SIGPIPE "signal: SIGPIPE" , , SIGPIPE , , :



ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
    <-ch
    os.Exit(0)
}()




, - (, , ), grep -A, -B -C, , , .



, ClickHouse, , , ( , ):



SELECT time,millis,review_body FROM amazon
WHERE (time = '_' AND millis < _) OR (time < '_')
ORDER BY time DESC, millis DESC
LIMIT __
SETTINGS max_threads=1


, ClickHouse , CPU ( ~6 ).





, () , , timestamp, .





logscli ?



Amazon, , :



#  ,    walmart
$ logscli -F 'walmart' | less

#    10 ,   "terrible"
$ logscli -F terrible -limit 10

#     -limit:
$ logscli -F terrible | head -n 10

#   ,   /times [0-9]/,   vine     
$ logscli -E 'times [0-9]' -where="vine='Y' AND star_rating>4" | less

#      "panic"  3   
$ logscli -F 'panic' -C 3 | less

#       "5-star"
$ logscli -F '5-star' -tailf




( ) github https://github.com/YuriyNasretdinov/logscli. ClickHouse.




All Articles