ืื ื• ืžืคืชื—ื™ื ืืช ื”ืžืžืฉืง ื”ื ื•ื— ื‘ื™ื•ืชืจ ื‘ืขื•ืœื* ืœืฆืคื™ื™ื” ื‘ื™ื•ืžื ื™ื

ืื ื• ืžืคืชื—ื™ื ืืช ื”ืžืžืฉืง ื”ื ื•ื— ื‘ื™ื•ืชืจ ื‘ืขื•ืœื* ืœืฆืคื™ื™ื” ื‘ื™ื•ืžื ื™ื ืื ืื™ ืคืขื ื”ืฉืชืžืฉืช ื‘ืžืžืฉืงื™ ืื™ื ื˜ืจื ื˜ ืœืฆืคื™ื™ื” ื‘ื™ื•ืžื ื™ื, ืื– ื‘ื•ื•ื“ืื™ ืฉืžืช ืœื‘ ื›ื™ืฆื“, ื›ื›ืœืœ, ื”ืžืžืฉืงื™ื ื”ืœืœื• ืžืกื•ืจื‘ืœื™ื ื•(ืœืขื™ืชื™ื ืงืจื•ื‘ื•ืช) ืœื ืžืื•ื“ ื ื•ื—ื™ื ื•ืžื’ื™ื‘ื™ื. ืœื—ืœืงื ืืคืฉืจ ืœื”ืชืจื’ืœ, ืœื—ืœืงื ื ื•ืจืื™ื™ื ืœื—ืœื•ื˜ื™ืŸ, ืื‘ืœ ื ืจืื” ืœื™ ืฉื”ืกื™ื‘ื” ืœื›ืœ ื”ื‘ืขื™ื•ืช ื”ื™ื ืฉืื ื—ื ื• ื ื™ื’ืฉื™ื ืœืžืฉื™ืžื” ืฉืœ ืฆืคื™ื™ื” ื‘ื™ื•ืžื ื™ื ื‘ืฆื•ืจื” ืœื ื ื›ื•ื ื”: ืื ื—ื ื• ืžื ืกื™ื ืœื™ืฆื•ืจ ืžืžืฉืง ืื™ื ื˜ืจื ื˜ ืฉื‘ื• ื”-CLI (ืžืžืฉืง ืฉื•ืจืช ื”ืคืงื•ื“ื”) ืขื•ื‘ื“ ื˜ื•ื‘ ื™ื•ืชืจ. ืื ื™ ืื™ืฉื™ืช ืžืื•ื“ ื ื•ื— ืœืขื‘ื•ื“ ืขื tail, grep, awk ื•ืื—ืจื™ื, ื•ืœื›ืŸ ืขื‘ื•ืจื™ ื”ืžืžืฉืง ื”ืื™ื“ื™ืืœื™ ืœืขื‘ื•ื“ื” ืขื ืœื•ื’ื™ื ื™ื”ื™ื” ืžืฉื”ื• ื“ื•ืžื” ืœ-tail ื•-grep, ืืš ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื’ื ืœืงืจื™ืืช ืœื•ื’ื™ื ืฉื”ื’ื™ืขื• ืžืฉืจืชื™ื ืจื‘ื™ื. ื›ืœื•ืžืจ, ื›ืžื•ื‘ืŸ, ืงืจื ืื•ืชื ืž- ClickHouse!

*ืœืคื™ ื“ืขืชื• ื”ืื™ืฉื™ืช ืฉืœ ืžืฉืชืžืฉ ื”ื—ื‘ืจื” ืืชื” ืชื•ืชื—

ื”ื›ื™ืจื• ืืช logscli

ืœื ื”ืžืฆืืชื™ ืฉื ืœืžืžืฉืง ืฉืœื™, ื•ืœืžืขืŸ ื”ืืžืช, ื”ื•ื ืงื™ื™ื ื‘ืฆื•ืจื” ืฉืœ ืื‘ ื˜ื™ืคื•ืก, ืื‘ืœ ืื ืืชื” ืจื•ืฆื” ืœืจืื•ืช ืžื™ื“ ืืช ืงื•ื“ ื”ืžืงื•ืจ, ืืชื” ืžื•ื–ืžืŸ: https://github.com/YuriyNasretdinov/logscli (350 ืฉื•ืจื•ืช ืฉืœ ืงื•ื“ Go ื ื‘ื—ืจ).

ื™ื›ื•ืœื•ืช

ื”ืžื˜ืจื” ืฉืœื™ ื”ื™ื™ืชื” ืœื™ืฆื•ืจ ืžืžืฉืง ืฉื™ื™ืจืื” ืžื•ื›ืจ ืœืžื™ ืฉืจื’ื™ืœ ืœ-tail/grep, ื›ืœื•ืžืจ ืœืชืžื•ืš ื‘ื“ื‘ืจื™ื ื”ื‘ืื™ื:

  1. ื”ืฆื’ ืืช ื›ืœ ื”ื™ื•ืžื ื™ื, ืœืœื ืกื™ื ื•ืŸ.
  2. ื”ืฉืืจ ืฉื•ืจื•ืช ื”ืžื›ื™ืœื•ืช ืžื—ืจื•ื–ืช ืžืฉื ื” ืงื‘ื•ืขื” (ื“ื’ืœ -F ัƒ grep).
  3. ื”ืฉืืจ ืฉื•ืจื•ืช ื”ืชื•ืืžื•ืช ืœื‘ื™ื˜ื•ื™ ื”ืจื’ื•ืœืจื™ (ื“ื’ืœ -E ัƒ grep).
  4. ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื”ืฆืคื™ื™ื” ื”ื™ื ื‘ืกื“ืจ ื›ืจื•ื ื•ืœื•ื’ื™ ื”ืคื•ืš, ืฉื›ืŸ ื”ื™ื•ืžื ื™ื ื”ืขื“ื›ื ื™ื™ื ื‘ื™ื•ืชืจ ืžืขื ื™ื™ื ื™ื ื‘ื“ืจืš ื›ืœืœ ืชื—ื™ืœื”.
  5. ื”ืฆื’ ื”ืงืฉืจ ืœื™ื“ ื›ืœ ืฉื•ืจื” (ืืคืฉืจื•ื™ื•ืช -A, -B ะธ -C ัƒ grep, ื”ื“ืคืกืช N ืฉื•ืจื•ืช ืœืคื ื™, ืื—ืจื™ ื•ืžืกื‘ื™ื‘ ืœื›ืœ ืฉื•ืจื” ืชื•ืืžืช, ื‘ื”ืชืืžื”).
  6. ื”ืฆื’ ื™ื•ืžื ื™ื ื ื›ื ืกื™ื ื‘ื–ืžืŸ ืืžืช, ืขื ืื• ื‘ืœื™ ืกื™ื ื•ืŸ (ื‘ืขื™ืงืจื•ืŸ tail -f | grep).
  7. ื”ืžืžืฉืง ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืชื•ืื ืœ less, head, tail ื•ืื—ืจื™ื - ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื™ืฉ ืœื”ื—ื–ื™ืจ ืชื•ืฆืื•ืช ืœืœื ื”ื’ื‘ืœื•ืช ืขืœ ืžืกืคืจืŸ; ืฉื•ืจื•ืช ืžื•ื“ืคืกื•ืช ื›ื–ืจื ื›ืœ ืขื•ื“ ื”ืžืฉืชืžืฉ ืžืขื•ื ื™ื™ืŸ ืœืงื‘ืœ ืื•ืชืŸ; ืื•ึนืช SIGPIPE ืฆืจื™ื›ื™ื ืœื”ืคืจื™ืข ื‘ืฉืงื˜ ืืช ื”ื–ืจืžืช ื™ื•ืžืŸ, ื‘ื“ื™ื•ืง ื›ืžื• ืฉื”ื ืขื•ืฉื™ื tail, grep ื•ื›ืœื™ ืขื–ืจ ืื—ืจื™ื ืฉืœ UNIX.

ะ ะตะฐะปะธะทะฐั†ะธั

ืื ื™ื— ืฉืืชื” ื›ื‘ืจ ืื™ื›ืฉื”ื• ื™ื•ื“ืข ืื™ืš ืœื”ืขื‘ื™ืจ ืœื•ื’ื™ื ืœ- ClickHouse. ืื ืœื, ืื ื™ ืžืžืœื™ืฅ ืœื ืกื•ืช ืืช ื–ื” ืกื ืงืฉื” ะธ ื‘ื™ืช ื—ืชื•ืœื™ืื• - ืžืืžืจ ื–ื” ืขืœ ืžืฉืœื•ื— ื™ื•ืžื ื™ื.

ืจืืฉื™ืช ืขืœื™ืš ืœื”ื—ืœื™ื˜ ืขืœ ืขืจื›ืช ื”ื‘ืกื™ืก. ืžื›ื™ื•ื•ืŸ ืฉื‘ื“ืจืš ื›ืœืœ ืืชื” ืจื•ืฆื” ืœืงื‘ืœ ื™ื•ืžื ื™ื ืžืžื•ื™ื ื™ื ืœืคื™ ื–ืžืŸ, ื ืจืื” ื”ื’ื™ื•ื ื™ ืœืื—ืกืŸ ืื•ืชื ื›ืš. ืื ื™ืฉ ื”ืจื‘ื” ืงื˜ื’ื•ืจื™ื•ืช ื™ื•ืžืŸ ื•ื›ื•ืœืŸ ืžืื•ืชื• ืกื•ื’, ืื– ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืงื˜ื’ื•ืจื™ื™ืช ื™ื•ืžืŸ ื‘ืชื•ืจ ื”ืขืžื•ื“ื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ืžืคืชื— ื”ืจืืฉื™ - ื–ื” ื™ืืคืฉืจ ืœืš ืœืงื‘ืœ ื˜ื‘ืœื” ืื—ืช ื‘ืžืงื•ื ื›ืžื”, ืžื” ืฉื™ื”ื•ื•ื” ื™ืชืจื•ืŸ ื’ื“ื•ืœ ื›ืืฉืจ ื”ื›ื ืกื” ืœ-ClickHouse (ื‘ืฉืจืชื™ื ืขื ื›ื•ื ื ื™ื ืงืฉื™ื—ื™ื, ืžื•ืžืœืฅ ืœื”ื›ื ื™ืก ื ืชื•ื ื™ื ืœื ื™ื•ืชืจ ืž-1 ืคืขืžื™ื ื‘ืฉื ื™ื™ื” ืขื‘ื•ืจ ื›ืœ ื”ืฉืจืช).

ื›ืœื•ืžืจ, ืื ื—ื ื• ืฆืจื™ื›ื™ื ื‘ืขืจืš ืืช ืขืจื›ืช ื”ื˜ื‘ืœื” ื”ื‘ืื”:

CREATE TABLE logs(
    category LowCardinality(String), -- ะบะฐั‚ะตะณะพั€ะธั ะปะพะณะพะฒ (ะพะฟั†ะธะพะฝะฐะปัŒะฝะพ)
    time DateTime, -- ะฒั€ะตะผั ัะพะฑั‹ั‚ะธั
    millis UInt16, -- ะผะธะปะปะธัะตะบัƒะฝะดั‹ (ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะธ ะผะธะบั€ะพัะตะบัƒะฝะดั‹, ะธ ั‚.ะด.): ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ั…ั€ะฐะฝะธั‚ัŒ, ะตัะปะธ ัะพะฑั‹ั‚ะธะน ะผะฝะพะณะพ, ั‡ั‚ะพะฑั‹ ะฑั‹ะปะพ ะปะตะณั‡ะต ั€ะฐะทะปะธั‡ะฐั‚ัŒ ัะพะฑั‹ั‚ะธั ะผะตะถะดัƒ ัะพะฑะพะน
    ..., -- ะฒะฐัˆะธ ัะพะฑัั‚ะฒะตะฝะฝั‹ะต ะฟะพะปั, ะฝะฐะฟั€ะธะผะตั€ ะธะผั ัะตั€ะฒะตั€ะฐ, ัƒั€ะพะฒะตะฝัŒ ะปะพะณะธั€ะพะฒะฐะฝะธั, ะธ ั‚ะฐะบ ะดะฐะปะตะต
    message String -- ั‚ะตะบัั‚ ัะพะพะฑั‰ะตะฝะธั
) ENGINE=MergeTree()
ORDER BY (category, time, millis)

ืœืฆืขืจื™, ืœื ื”ืฆืœื—ืชื™ ืœืžืฆื•ื ืžื™ื“ ืžืงื•ืจื•ืช ืคืชื•ื—ื™ื ืขื ื™ื•ืžื ื™ื ืžืฆื™ืื•ืชื™ื™ื ืฉืื•ื›ืœ ืœืชืคื•ืก ื•ืœื”ื•ืจื™ื“, ืื– ืœืงื—ืชื™ ืืช ื–ื” ื‘ืžืงื•ื ื–ืืช ื›ื“ื•ื’ืžื” ื‘ื™ืงื•ืจื•ืช ืขืœ ืžื•ืฆืจื™ื ืžืืžื–ื•ืŸ ืœืคื ื™ 2015. ื›ืžื•ื‘ืŸ ืฉื”ืžื‘ื ื” ืฉืœื”ื ืœื ื‘ื“ื™ื•ืง ื–ื”ื” ืœื–ื” ืฉืœ ื™ื•ืžื ื™ ื˜ืงืกื˜, ืื‘ืœ ืœืฆืจื›ื™ ื”ืžื—ืฉื” ื–ื” ืœื ื—ืฉื•ื‘.

ื”ื•ืจืื•ืช ืœื”ืขืœืืช ื‘ื™ืงื•ืจื•ืช ืฉืœ ืืžื–ื•ืŸ ืœ-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 GB ืฉืœ ื–ื™ื›ืจื•ืŸ RAM. ื›ื“ื™ ืœื”ืขืœื•ืช ืงื‘ืฆื™ 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

ื‘ื“ื™ืกืง ืงื‘ื•ืข ืจื’ื™ืœ (ืฉื–ื” HDD) ื‘-Google Cloud ื‘ื’ื•ื“ืœ ืฉืœ 1000 GB (ืœืงื—ืชื™ ืืช ื”ื’ื•ื“ืœ ื”ื–ื” ื‘ืขื™ืงืจ ื›ื“ื™ ืฉื”ืžื”ื™ืจื•ืช ื”ื™ื™ืชื” ืงืฆืช ื™ื•ืชืจ ื’ื‘ื•ื”ื”, ืื ื›ื™ ืื•ืœื™ SSD ื‘ื’ื•ื“ืœ ื”ื ื“ืจืฉ ื”ื™ื” ื–ื•ืœ ื™ื•ืชืจ) ื”ื”ืขืœืื” ื”ืžื”ื™ืจื•ืช ื”ื™ื™ืชื” ื‘ืขืจืš ~ 75 MB/sek ืขืœ 4 ืœื™ื‘ื•ืช.

  • ืื ื™ ื—ื™ื™ื‘ ืœื”ื–ืžื™ืŸ ืžืงื•ื ืฉืื ื™ ืขื•ื‘ื“ ื‘ื’ื•ื’ืœ, ืื‘ืœ ื”ืฉืชืžืฉืชื™ ื‘ื—ืฉื‘ื•ืŸ ืื™ืฉื™ ื•ื”ืžืืžืจ ื”ื–ื” ืœื ืงืฉื•ืจ ืœืขื‘ื•ื“ื” ืฉืœื™ ื‘ื—ื‘ืจื”

ืื ื™ ืืคื™ืง ืืช ื›ืœ ื”ืื™ื•ืจื™ื ืขื ืžืขืจืš ื”ื ืชื•ื ื™ื ื”ืžืกื•ื™ื ื”ื–ื”, ืžื›ื™ื•ื•ืŸ ืฉื–ื” ื›ืœ ืžื” ืฉื”ื™ื” ืœื™ ื‘ื”ื™ืฉื’ ื™ื“.

ื”ืฆื’ ืืช ื”ืชืงื“ืžื•ืช ืกืจื™ืงืช ื”ื ืชื•ื ื™ื

ืžื›ื™ื•ื•ืŸ ืฉื‘-ClickHouse ื ืฉืชืžืฉ ื‘ืกืจื™ืงื” ืžืœืื” ืขืœ ื˜ื‘ืœื” ืขื ื™ื•ืžื ื™ื, ื•ืคืขื•ืœื” ื–ื• ืขืฉื•ื™ื” ืœื”ื™ืžืฉืš ื–ืžืŸ ืจื‘ ื•ื™ื™ืชื›ืŸ ืฉืœื ืชื ื™ื‘ ืชื•ืฆืื•ืช ื‘ืžืฉืš ื–ืžืŸ ืจื‘ ืื ื™ื™ืžืฆืื• ืžืขื˜ ื”ืชืืžื•ืช, ืจืฆื•ื™ ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœื”ืฆื™ื’ ืืช ื”ืชืงื“ืžื•ืช ื”ืฉืื™ืœืชื” ืขื“ ืœืงื‘ืœืช ื”ืฉื•ืจื•ืช ื”ืจืืฉื•ื ื•ืช ืขื ื”ืชื•ืฆืื”. ืœืฉื ื›ืš, ื™ืฉ ืคืจืžื˜ืจ ื‘ืžืžืฉืง HTTP ื”ืžืืคืฉืจ ืœืฉืœื•ื— ื”ืชืงื“ืžื•ืช ื‘ื›ื•ืชืจื•ืช HTTP: send_progress_in_http_headers=1. ืœืจื•ืข ื”ืžื–ืœ, ืกืคืจื™ื™ืช ื”-Go ื”ืจื’ื™ืœื” ืœื ื™ื›ื•ืœื” ืœืงืจื•ื ื›ื•ืชืจื•ืช ืขื ืงื‘ืœืชืŸ, ืืš ืžืžืฉืง HTTP 1.0 (ืœื ืœื”ืชื‘ืœื‘ืœ ืขื 1.1!) ื ืชืžืš ืขืœ ื™ื“ื™ ClickHouse, ื›ืš ืฉืชื•ื›ืœ ืœืคืชื•ื— ื—ื™ื‘ื•ืจ TCP ื’ื•ืœืžื™ ืœ-ClickHouse ื•ืœืฉืœื•ื— ืื•ืชื• ืœืฉื GET /?query=... HTTP/1.0nn ื•ืœืงื‘ืœ ืืช ื›ื•ืชืจื•ืช ื”ืชื’ื•ื‘ื” ื•ื”ื’ื•ืฃ ืœืœื ื›ืœ ื‘ืจื™ื—ื” ืื• ื”ืฆืคื ื”, ื›ืš ืฉื‘ืžืงืจื” ื”ื–ื” ืื ื—ื ื• ืืคื™ืœื• ืœื ืฆืจื™ื›ื™ื ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช.

ื”ื–ืจืžืช ื™ื•ืžื ื™ื ืž-ClickHouse

ืœ-ClickHouse ื™ืฉ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืœืฉืื™ืœืชื•ืช ืขื ORDER BY ื›ื‘ืจ ื–ืžืŸ ืจื‘ ื™ื—ืกื™ืช (ืžืื– 2019?), ืื– ืฉืื™ืœืชื” ื›ืžื•

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

ื”ื•ื ื™ืชื—ื™ืœ ืžื™ื“ ืœื”ื—ื–ื™ืจ ืฉื•ืจื•ืช ืฉื‘ื”ืŸ ืชืช-ืžื—ืจื•ื–ืช "ืžืฉื”ื•" ื‘ื”ื•ื“ืขื” ืฉืœื”ืŸ, ืžื‘ืœื™ ืœื—ื›ื•ืช ืœืกื™ื•ื ื”ืกืจื™ืงื”.

ื›ืžื• ื›ืŸ, ื™ื”ื™ื” ื ื•ื— ืžืื•ื“ ืื ClickHouse ื‘ืขืฆืžื” ืชื‘ื˜ืœ ืืช ื”ื‘ืงืฉื” ื›ืฉื”ื—ื™ื‘ื•ืจ ืืœื™ื” ื ืกื’ืจ, ืืš ื–ื• ืื™ื ื” ื”ืชื ื”ื’ื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ. ื ื™ืชืŸ ืœื”ืคืขื™ืœ ื‘ื™ื˜ื•ืœ ื‘ืงืฉื” ืื•ื˜ื•ืžื˜ื™ ื‘ืืžืฆืขื•ืช ื”ืืคืฉืจื•ืช cancel_http_readonly_queries_on_client_close=1.

ื˜ื™ืคื•ืœ ื ื›ื•ืŸ ื‘-SIGPIPE ื‘-Go

ื›ืฉืืชื” ืžื‘ืฆืข, ื ื’ื™ื“, ืืช ื”ืคืงื•ื“ื” some_cmd | head -n 10, ื‘ื“ื™ื•ืง ืื™ืš ื”ืคืงื•ื“ื” some_cmd ืžืคืกื™ืง ืืช ื”ื‘ื™ืฆื•ืข ื›ืืฉืจ head ื”ื•ืจื™ื“ื• 10 ืฉื•ืจื•ืช? ื”ืชืฉื•ื‘ื” ืคืฉื•ื˜ื”: ืžืชื™ head ืžืกืชื™ื™ื, ื”ืฆื™ื ื•ืจ ื ืกื’ืจ, ื•ื”-stdout ืฉืœ ื”ืคืงื•ื“ื” some_cmd ืžืชื—ื™ืœ ืœื”ืฆื‘ื™ืข, ื‘ืื•ืคืŸ ืžื•ืชื ื”, "ืœืฉื•ื ืžืงื•ื". ืžืชื™ some_cmd ืžื ืกื” ืœื›ืชื•ื‘ ืœืฆื™ื ื•ืจ ืกื’ื•ืจ, ื”ื•ื ืžืงื‘ืœ ืื•ืช SIGPIPE, ืฉืžืกื™ื™ื ื‘ืฉืงื˜ ืืช ื”ืชื•ื›ื ื™ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ.

ื‘-Go ื–ื” ืงื•ืจื” ื’ื ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืื‘ืœ ืžื˜ืคืœ ื”ืื•ืชื•ืช SIGPIPE ืžื“ืคื™ืก ื‘ืกื•ืฃ ื’ื "ืื•ืช: 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 ืžื—ื–ื™ืจื” ืืช ื”ืฉื•ืจื” ื”ืžืชืื™ืžื”, ื”ื™ื ืžืกืชื™ื™ืžืช ื‘-cache ื•ื‘ืื•ืคืŸ ื›ืœืœื™ ื”ื‘ืงืฉื” ืžื‘ื•ืฆืขืช ื“ื™ ืžื”ืจ ื•ืฆื•ืจื›ืช ืžืขื˜ CPU (ื‘ื“ืจืš ื›ืœืœ ื”ื‘ืงืฉื” ืื•ืจื›ืช ื‘ืขืจืš ~6 ms ื‘ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช ืฉืœื™).

ื”ืฆื’ ื”ื•ื“ืขื•ืช ื—ื“ืฉื•ืช ื‘ื–ืžืŸ ืืžืช

ืขืœ ืžื ืช ืœื”ืฆื™ื’ ื”ื•ื“ืขื•ืช ื ื›ื ืกื•ืช ื‘ื–ืžืŸ ืืžืช (ื›ืžืขื˜), ืื ื• ืคืฉื•ื˜ ืžื‘ืฆืขื™ื ืืช ื”ื‘ืงืฉื” ืื—ืช ืœื›ืžื” ืฉื ื™ื•ืช, ื•ื ื–ื›ืจื™ื ื‘ื—ื•ืชืžืช ื”ื–ืžืŸ ื”ืื—ืจื•ื ื” ืฉื ืชืงืœื ื• ื‘ื” ื‘ืขื‘ืจ.

ื“ื•ื’ืžืื•ืช ืœืคืงื•ื“ื•ืช

ืื™ืš ื ืจืื•ืช ืคืงื•ื“ื•ืช logscli ื˜ื™ืคื•ืกื™ื•ืช ื‘ืคื•ืขืœ?

ืื ื”ื•ืจื“ืชื ืืช ืžืขืจืš ื”ื ืชื•ื ื™ื ืฉืœ ืืžื–ื•ืŸ ืฉื”ื–ื›ืจืชื™ ื‘ืชื—ื™ืœืช ื”ืžืืžืจ, ืชื•ื›ืœื• ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช:

# ะŸะพะบะฐะทะฐั‚ัŒ ัั‚ั€ะพะบะธ, ะณะดะต ะฒัั‚ั€ะตั‡ะฐะตั‚ัั ัะปะพะฒะพ 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.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”