Simple Log Service arama sonuçlarının SQL ile analiz edilmesini destekler.
Temel sözdizimi
SLS Sorgu Becerisi: Günlükleri akıllıca sorgulama ve analiz etme: SLS, yerel bir AI aracısında doğal dil kullanarak günlük verilerini sorgulamanıza ve analiz etmenize olanak tanıyan bir Agent Skill sağlar.
Bir sorgu, dikey çubuk karakteriyle (|) ayrılan bir arama deyimi ve bir analiz deyiminden oluşur. Biçim aşağıdaki gibidir:
Search statement|Analytic statement
Bir arama deyimi bağımsız olarak çalıştırılır. Bir analiz deyimi mutlaka bir arama deyimini takip etmelidir. Günlük analizi, arama sonuçlarını veya bir Logstore'daki tüm verileri işler.
Her arama deyimi için en fazla 30 arama koşulu belirtmenizi öneririz.
FROM veya WHERE yan tümcesi olmadığında, bir analiz deyimi varsayılan olarak mevcut Logstore'daki tüm verileri analiz eder. Analiz deyimleri büyük/küçük harfe duyarlı değildir, offset sözdizimini desteklemez ve sonunda noktalı virgül (;) gerektirmez.
|
Deyim |
Açıklama |
|
Arama deyimi |
Bir arama deyimi bir veya daha fazla koşul belirtir: bir anahtar sözcük, sayısal değer, sayısal aralık, boşluk veya yıldız işareti (*). Boşluk veya yıldız işareti (*) koşulsuz olarak tüm günlüklerle eşleşir. |
|
Analiz deyimi |
Bir analiz deyimi, arama sonuçlarını veya bir Logstore'daki tüm verileri toplar ya da analiz eder. SLS aşağıdaki işlevleri ve sözdizimini destekler: |
Örnek:
* | SELECT status, count(*) AS PV GROUP BY status
SQL işlevleri ve SQL yan tümceleri
SQL işlevleri verileri hesaplar, dönüştürür ve biçimlendirir; örneğin toplam hesaplama, dize manipülasyonu ve tarih işleme gibi. SQL işlevleri genellikle SQL yan tümcelerine gömülüdür.
SQL yan tümceleri tam sorgu ve işleme deyimlerini oluşturur; veri kaynaklarını, koşulları, gruplamayı ve sıralamayı belirtir.
Örnek 1. Önceki günün günlüklerini sorgulama
Bugünün tarihini almak için current_date ve bir zaman aralığını çıkarmak için date_add kullanır. Sonuçlar bir tabloda görüntülenir. (Demo)
-
Sorgu deyimi
* | SELECT * FROM log WHERE __time__ < to_unixtime(current_date) AND __time__ > to_unixtime(date_add('day', -1, current_date)) Sonuçlar

Örnek 2. Günlükler için kaynak IP adreslerinin dağılımını sorgulama
IP adreslerinden il bilgilerini çözümlemek için ip_to_province işlevini kullanır, group by ile adrese göre gruplandırır ve count işlevi ile oluşumları sayar. Sonuçlar bir pasta grafiğinde görüntülenir. (Demo'yu Deneyin)
-
Sorgu deyimi
* | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100
Örnek 3. NGINX gelen ve giden trafiğini sorgulama
__time__ değerini saate hizalamak için date_trunc kullanır. __time__ günlük alım zamanı (Unix zaman damgası) için bir sistem alanıdır. Sorgu, zaman damgalarını biçimlendirmek için date_format, zamana göre gruplandırmak için group by ve saatlik trafiği toplamak için sum kullanır. Sonuçlar, X ekseninde time ve sol Y ekseninde net_out/net_in ile bir çizgi grafiği olarak görüntülenir. (Demo'yu Deneyin)
-
Sorgu deyimi
* | select sum(body_bytes_sent) as net_out, sum(request_length) as net_in, date_format(date_trunc('hour', __time__), '%m-%d %H:%i') as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 10000 -
Sonuçlar

Örnek 4. NGINX'te en çok erişilen ilk 10 URL'yi sorgulama
request_uri değerini ? karakterine göre bölmek için split_part işlevini kullanır. İlk array elemanı istek yoludur. GROUP BY ile yola göre gruplandırır, count işlevi ile ziyaretleri sayar ve ORDER BY DESC ile sıralar. Sonuçlar bir sütun grafiğinde görüntülenir. (Demo'yu Deneyin)
-
Sorgu deyimi
* | select count(1) as pv, split_part(request_uri, '?', 1) as path group by path order by pv desc limit 10 -
Sonuçlar

Örnek 5. İstek yöntemi kategorilerini ve PV trendlerini sorgulama
Zaman damgalarını dakikaya hizalamak için date_trunc kullanır, PV'yi hesaplamak üzere zamana ve request_method değerine göre gruplandırır, ardından zamana göre sıralar. Sonuçlar, X ekseninde zaman, Y ekseninde PV ve seri olarak request_method ile yığılmış bir alan grafiği olarak görüntülenir. (Demo'yu Deneyin)
-
Sorgu deyimi
* | select date_format(date_trunc('minute', __time__), '%m-%d %H:%i') as t, request_method, count(*) as pv group by t, request_method order by t asc limit 10000 -
Sonuçlar

Örnek 6. Bugünün PV'sini dünle karşılaştırma
Bugünün PV'leri için count işlevini ve gün bazında karşılaştırma yapmak için compare işlevini kullanır. (Demo)
-
Sorgu deyimi
* | select diff [1] as today, round((diff [3] -1.0) * 100, 2) as growth FROM ( SELECT compare(pv, 86400) as diff FROM ( SELECT COUNT(1) as pv FROM log ) ) Sonuçlar

Örnek 7. NGINX erişim günlüklerine göre PV sayısını tahmin etme
time - time % 60 ifadesi, zaman damgalarını stamp olarak dakikaya hizalar. Sorgu, stamp değerine göre group by ile gruplandırır ve count işlevini kullanarak dakika başına olayları sayar. Bu alt sorgu, altı veri noktasını tahmin etmek için ts_predicate_simple işlevine beslenir. Sonuçlar bir zaman serisi grafiği olarak görüntülenir. (Demo'yu Deneyin)
-
Sorgu deyimi
* | select ts_predicate_simple(stamp, value, 6) from ( select __time__ - __time__ % 60 as stamp, COUNT(1) as value from log GROUP BY stamp order by stamp ) LIMIT 1000 -
Sonuçlar

Örnek 8. İstekleri kullanıcı aracısına göre toplama ve sıralama
İstekleri saymak ve yanıt trafiğini toplamak için http_user_agent değerine göre gruplandırır. byte değerlerini MB birimine dönüştürmek için round işlevini kullanır. Bir case when ifadesi status kodlarını 2xx, 3xx, 4xx ve 5xx olarak sınıflandırır ve her birinin yüzdesini hesaplar. Sonuçlar bir tabloda görüntülenir. (Demo'yu Deneyin)
-
Sorgu deyimi
* | select http_user_agent as "User agent", count(*) as pv, round(sum(request_length) / 1024.0 / 1024, 2) as "Request traffic (MB)", round(sum(body_bytes_sent) / 1024.0 / 1024, 2) as "Response traffic (MB)", round( sum( case when status >= 200 and status < 300 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 2xx (%)", round( sum( case when status >= 300 and status < 400 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 3xx (%)", round( sum( case when status >= 400 and status < 500 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 4xx (%)", round( sum( case when status >= 500 and status < 600 then 1 else 0 end ) * 100.0 / count(1), 6 ) as "Percentage of status code 5xx (%)" group by "User agent" order by pv desc limit 100
Örnek 9. NGINX günlüklerinde hata isteği oranını hesaplama
400 ve üzeri durum kodlarına sahip istekleri sayar, hata oranını elde etmek için toplam isteklere böler. Sonuçlar istatistiksel bir grafikte görüntülenir. (Demo)
-
Sorgu deyimi
* | select round((errorCount * 100.0 / totalCount), 2) as errorRatio from ( select sum( case when status >= 400 then 1 else 0 end ) as errorCount, count(1) as totalCount from log ) Sonuçlar
