Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa
Poimi käyttölogeista tilakoodit, viiveet ja asiakaskentät grepillä, cutilla ja awkilla.
Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa on ilmainen Linux-komentorivin ja Bash-komentosarjojen hallinta-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Linux-komentorivin ja Bash-komentosarjojen hallinta-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Linux-komentorivin ja Bash-komentosarjojen hallinta-kurssilla on yhteensä 4 oppituntia.
Mikä on verkkopalvelimen käyttölogi?
Jokainen HTTP-palvelin — Apache, Nginx ja Caddy — kirjoittaa käyttölogiin yhden rivin jokaista pyyntöä kohden. Näiden rivien rakenteen ymmärtäminen on kaiken lokianalyysin perusta.
Tyypillinen Combined Log Format (CLF) -rivi näyttää tältä:
- Asiakkaan IP-osoite — kuka pyynnön teki
- Aikaleima — milloin se tapahtui
- Pyynnön rivi — metodi, polku ja protokolla
- Tilakoodi — HTTP-vastaus (200, 404, 500…)
- Lähetetyt tavut — vastausrungon koko
- Referer — alkuperäinen sivu
- User-Agent — selaimen tai botin merkkijono
Esimerkkirivi tiedostosta /var/log/nginx/access.log:
192.168.1.10 - alice [11/Jun/2026:14:32:01 +0000] "GET /api/orders HTTP/1.1" 200 1482 "-" "curl/7.88.1"
Suurella kuormalla näihin tiedostoihin kertyy miljoonia rivejä päivässä. Tämän oppitunnin tavoitteena on poimia, suodattaa ja koostaa niiden kenttiä tehokkaasti BASHin vakiotyökaluilla.
Reaaliaikaisen lokin tarkastelu komennoilla tail ja grep
Tarkastele lokia ennen putken kirjoittamista, jotta ymmärrät sen rakenteen. tail auttaa seuraamaan reaaliaikaista virtaa, ja grep rajaa sen heti olennaisiin riveihin.
Yleisiä käyttötapoja:
tail -n 1000 access.log— viimeiset 1000 riviätail -f access.log— seuraa reaaliajassatail -f access.log | grep '" 5'— vain saapuvat 5xx-virheet
Keskeinen havainto on, että grep tekee haun koko riviltä, joten kuvion ankkurointi on tärkeää. Kuvion ' 500 ' (välilyönnit mukaan lukien) hakeminen estää osumat URL-polkuun, joka sisältää merkkijonon 500.
#!/usr/bin/env bash
# Watch only HTTP 5xx errors arriving in real time
tail -f /var/log/nginx/access.log \
| grep --line-buffered '" 5[0-9][0-9] 'Tilakoodin poimiminen cut-komennolla
cut jakaa kunkin rivin erotinmerkin perusteella ja tulostaa valitut kentät. Combined Log Format -muodossa tilakoodi on kenttä 9, kun jako tehdään välilyönneillä — mutta pyyntörivin ympärillä olevien lainausmerkkien vuoksi on turvallisempaa laskea kentät tunnetusta ankkurista.
Luotettava keino on hyödyntää sitä, että pyyntörivi on aina lainausmerkeissä: tilakoodi on aina pyyntökentän sulkevien lainausmerkkien jälkeinen ensimmäinen tunnus. Komento cut -d'"' -f3 eristää kaiken pyyntökentän lainausmerkkien jälkeen, minkä jälkeen toinen cut -d' ' -f2 poimii tilakoodin.
Tämä kaksivaiheinen cut-menetelmä on CLF-lokien klassinen toimintatapa — nopea eikä vaadi ulkoisia riippuvuuksia.
#!/usr/bin/env bash
# Print only the HTTP status code from each log line
# Input format: ... "GET /path HTTP/1.1" 200 1482 ...
cut -d'"' -f3 /var/log/nginx/access.log \
| cut -d' ' -f2 \
| sort \
| uniq -c \
| sort -rnTilakoodien laskeminen awk-komennolla
awk on tehokkaampi kuin cut, koska se voi säilyttää tilaa rivien välillä. Esiintymien laskemiseen käytetään tyypillisesti assosiatiivista taulukkoa, jonka avaimena on haluttu arvo.
CLF-muodossa kenttä $9 (indeksointi alkaa yhdestä, erotin on välilyönti) sisältää tilakoodin. awk käsittelee jokaisen rivin, kasvattaa laskuria ja tulostaa lajitellun yhteenvedon END-lohkossa.
Miksi käyttää mieluummin awk-komentoa kuin komentoputkea cut | sort | uniq -c? Koska awk tekee työn yhdellä läpikäynnillä ilman koko tiedoston esilajittelua — tämä on ratkaisevaa, kun loki on kooltaan satoja gigatavuja.
#!/usr/bin/env bash
# Count HTTP status codes in a single awk pass
awk '{ count[$9]++ }
END {
for (status in count)
printf "%6d %s\n", count[status], status
}' /var/log/nginx/access.log \
| sort -rnVirheiden suodattaminen ja asiakkaiden IP-osoitteiden poimiminen
Yksi yleisimmistä ylläpitotehtävistä on selvittää, mitkä asiakkaiden IP-osoitteet tuottavat eniten virheitä. Tässä yhdistyvät suodatus (vain virherivit) ja kenttien poiminta (kentän 1 IP-osoite).
Putken toimintaperiaate:
- Suodata
awk-komennolla tilakoodin alueen perusteella ja poimi IP-osoite samalla kertaa — vältä erillistägrep-vaihetta - Ohjaa tulos komentoputkeen
sort | uniq -c | sort -rn | headsaadaksesi nopeasti yleisimpien tulosten listan
Tämä menetelmä on riittävän nopea ajettavaksi yhden palvelimen 10 gigatavun lokitiedostoa vastaan ilman, että koko tiedosto ladataan muistiin.
#!/usr/bin/env bash
# Top 10 IPs generating HTTP 4xx or 5xx errors
awk '$9 ~ /^[45][0-9][0-9]$/ { print $1 }' \
/var/log/nginx/access.log \
| sort \
| uniq -c \
| sort -rn \
| head -10Vastausviiveen jäsentäminen sovelluslokeista
Sovelluspalvelimet (Rails, Gunicorn, Express ja morgan sekä muut vastaavat) kirjaavat usein pyynnön keston. Nginxin voi määrittää tulostamaan $request_time-arvon ylimääräisenä kenttänä jokaisen rivin loppuun.
Esimerkki mukautetusta Nginx-lokimuodosta tiedostossa nginx.conf:
log_format timed '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" rt=$request_time';
Kun viive on lokissa, voit laskea awk-komennolla miljoonien pyyntöjen keskiarvon, maksimiarvon ja persentiiliarvioita lataamatta tietoja tietokantaan.
#!/usr/bin/env bash
# Compute average and max request_time from Nginx timed log
# Assumes last field is rt=<seconds> e.g. rt=0.042
awk '{
# Extract numeric value after rt=
n = split($NF, a, "=")
if (n == 2 && a[1] == "rt") {
t = a[2] + 0
sum += t
count++
if (t > max) max = t
}
}
END {
if (count > 0)
printf "Requests: %d Avg: %.4fs Max: %.4fs\n", count, sum/count, max
}' /var/log/nginx/timed_access.logViivehistogrammin muodostaminen awk-komennolla
Yksittäinen keskiarvo peittää alleen viiveen pitkän hännän. Histogrammi paljastaa jakauman — ovatko useimmat pyynnöt nopeita ja muutamat erittäin hitaita (pitkä häntä) vai onko jakauma tasainen.
Temppu on jakaa jokainen arvo pyöristettyyn väliin käyttämällä kokonaislukulaskentaa awk-komennon sisällä. Kun sekunnit muunnetaan millisekunneiksi kertomalla arvot tuhannella ja käytetään kokonaislukujakoa, saadaan selkeät välirajat.
Tuloksena on tekstimuotoinen histogrammi, jota voi lukea suoraan päätteessä. Tämä on usein nopeampaa kuin tietojen lähettäminen Grafanaan nopeaa selvitystä varten.
#!/usr/bin/env bash
# Latency histogram (50ms buckets) from Nginx timed log
awk '{
n = split($NF, a, "=")
if (n == 2 && a[1] == "rt") {
ms = int(a[2] * 1000) # convert to ms
bucket = int(ms / 50) * 50 # round down to 50ms boundary
hist[bucket]++
}
}
END {
for (b in hist)
printf "%6dms %d\n", b, hist[b]
}' /var/log/nginx/timed_access.log \
| sort -nUser-Agentin poimiminen ja bottien tunnistaminen
User-Agent-kenttä (kenttä 6, kun jako tehdään merkillä ") tunnistaa asiakkaat. Indeksoijat, kaapijat ja haitalliset botit vääristävät usein mittareita ja kasvattavat virhemääriä. Niiden suodattaminen pois antaa todellisesta käyttäjäliikenteestä selkeämmän kuvan.
Yleisiä bottien tunnisteita ovat: bot, crawler, spider, curl, python-requests, Googlebot ja Bingbot.
Käytä komentoa grep -iv (kirjainkoosta riippumaton käänteinen haku) tunnettujen bottien poissulkemiseen tai jaa rivi awk-komennolla merkin " perusteella ja kohdista haku suoraan UA-kenttään.
#!/usr/bin/env bash
# Count top 15 User-Agent strings, excluding known bots
awk -F'"' '{ print $6 }' /var/log/nginx/access.log \
| grep -iv -e 'bot' -e 'crawler' -e 'spider' -e 'curl' \
-e 'python' -e 'wget' -e 'Go-http-client' \
| sort \
| uniq -c \
| sort -rn \
| head -15Liikenteen koostaminen päätepisteittäin
Kun tiedät, mitkä päätepisteet vastaanottavat eniten liikennettä ja tuottavat eniten virheitä, voit priorisoida optimointia ja kapasiteetin suunnittelua. Pyyntöpolku sijaitsee lainausmerkeissä olevassa pyyntökentässä.
Jaa rivi merkin " perusteella, ota kenttä 2 (pyyntörivi) ja poimi siitä metodin ja protokollan jälkeen jäljelle jäävä polku. Jos rajapinnoissa on polkuparametreja, kuten /users/12345, voit myös normalisoida tunnisteet muotoon /users/:id käyttämällä sed-komentoa tai monimutkaisempaa awk-kuviota.
#!/usr/bin/env bash
# Top 20 requested endpoints (method + path, no query string)
awk -F'"' '{ print $2 }' /var/log/nginx/access.log \
| awk '{ print $1, $2 }' \
| sed 's|/[0-9][0-9]*\b|/:id|g' \
| sort \
| uniq -c \
| sort -rn \
| head -20Virheiden yhdistäminen päätepisteisiin awk-komennolla
Tehokkaimmassa yhden läpikäynnin analyysissä yhdistetään useita kenttiä samanaikaisesti: päätepiste, tilakoodi ja tarvittaessa viive. awk-komennon assosiatiiviset taulukot, joiden avaimina käytetään yhdistelmäarvoja, tekevät tästä selkeää ja nopeaa.
Alla oleva menetelmä laskee 5xx-virheet päätepisteittäin yhdellä läpikäynnillä — väliaikaistiedostoja ei tarvita, eikä välituloksia tarvitse lajitella ennen loppua. Tätä tapaa käytetään tuotannon observability-skripteissä, kun suuresta lokista tarvitaan vastauksia alle minuutissa.
#!/usr/bin/env bash
# Count 5xx errors per endpoint path in a single pass
awk -F'"' '{
# $2 = request line e.g. "GET /api/orders HTTP/1.1"
# $0 in original space-split: $9 = status
split($0, fields, " ")
status = fields[9]
if (status ~ /^5/) {
split($2, req, " ")
path = req[2]
# Normalise numeric IDs
gsub(/\/[0-9]+/, "/:id", path)
errors[path]++
}
}
END {
for (p in errors)
printf "%6d %s\n", errors[p], p
}' /var/log/nginx/access.log \
| sort -rn \
| head -20Kierrotettujen ja pakattujen lokien käsittely
Useimmilla palvelimilla lokit kierretään päivittäin. Vanhemmat tiedostot pakataan gzip-muotoon nimillä access.log.1.gz, access.log.2.gz ja niin edelleen. Vakiotyökalut eivät voi lukea niitä suoraan, mutta kaksi menetelmää toimii siististi:
zcat— pura vakiotulosteeseen ja ohjaa tulos komentoputkeenzgrep— suorita grep-haku suoraan gzip-tiedostojen sisältä ilman purkamista
Kun haluat analysoida kokonaisen viikon lokit, jotka koostuvat sekä pakkaamattomista että pakatuista tiedostoista, käytä prosessisubstituutiota tai yhdistä tiedostot komennolla zcat. Alla oleva koodinpätkä käsittelee seitsemän viimeksi kierrotettua tiedostoa ja nykyisen aktiivisen lokin yhdellä awk-kutsulla — väliaikaistiedostoja ei tarvita.
#!/usr/bin/env bash
# Aggregate status codes across a week of rotated logs
# Handles both plain and gzip-compressed rotation files
LOG_DIR="/var/log/nginx"
{
cat "${LOG_DIR}/access.log" 2>/dev/null
zcat "${LOG_DIR}/access.log".*.gz 2>/dev/null
} | awk '
{ count[$9]++ }
END {
for (s in count)
printf "%6d %s\n", count[s], s
}' | sort -rnMissä awk-kentässä HTTP-tilakoodi sijaitsee Combined Log Format -muodossa?
Kirjoitat awk-yksirivistä komentoa, jolla suodatetaan tavallisesta Nginx-käyttölokista Combined Log Format -muodossa (välilyönnein eroteltuna ja pyyntörivi lainausmerkeissä) vain HTTP 4xx -vastaukset. Mikä kentän numero tunnistaa HTTP-tilakoodin oikein?
Oppitunnin kertaus: lokianalyysiputket
Tässä oppitunnissa rakensitte täydellisen työkalupakin verkko- ja sovelluslokien analysointiin suuressa mittakaavassa käyttäen vain tavallisia BASH-apuohjelmia.
Keskeiset käsitellyt tekniikat:
- Rakenne ensin — Combined Log Format -muodossa on ennustettava kenttärakenne; kun tunnette sen, voitte jakaa rivit luotettavasti komennolla
cut -d'"'taiawk-kenttäviittauksilla. - Tilakoodien poiminta —
awk '{ count[$9]++ }'laskee kaikki koodit yhdellä läpikäynnillä; suodattamalla ehdolla$9 ~ /^5/saatte palvelinvirheet. - Viiveanalyysi — jäsentäkää mukautettu
rt=-kenttäawk-komennolla ja laskekaa keskiarvot, maksimiarvot sekä histogrammin luokat ilman ulkoisia työkaluja. - Asiakas- ja bottianalyysi — jakakaa rivit
"-merkin kohdalta komennolla-F'"', jotta pääsette User-Agent-kenttään; ohjatkaa tulosgrep -iv-komennon läpi bottien poissulkemiseksi ennen koostamista. - Päätepisteiden normalisointi — käyttäkää
awk:n sisällä komentoagsub(/\/[0-9]+/, "/:id")parametrisoitujen polkujen yhdistämiseen ennen laskentaa. - Kiertävien lokien käsittely — yhdistäkää
catjazcatalikuoressa, jotta kaikki kiertoon liittyvät tiedostot voidaan syöttää yhteen putken läpikäyntiin.
Nämä mallit toimivat yhdessä: voitte ketjuttaa suodatuksen, poiminnan, normalisoinnin ja koostamisen yhdeksi putkeksi, joka käsittelee satoja miljoonia rivejä tavanomaisella laitteistolla. Kun hallitsette nämä peruspalikat, tarvitsette harvoin erillistä lokien koostamispalvelua tapauskohtaiseen häiriötutkintaan.
Opi Bash tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 22
- Oppitunnit
- 88
Usein kysytyt kysymykset
Onko oppitunti ”Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa” ilmainen?
Kyllä – oppitunnin ”Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Linux-komentorivin ja Bash-komentosarjojen hallinta-kurssin, päivitä CoddyKit PROhon. Linux-komentorivin ja Bash-komentosarjojen hallinta-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa”?
Poimi käyttölogeista tilakoodit, viiveet ja asiakaskentät grepillä, cutilla ja awkilla. Harjoittelet Linux-komentorivin ja Bash-komentosarjojen hallinta-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Linux-komentorivin ja Bash-komentosarjojen hallinta-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Linux-komentorivin ja Bash-komentosarjojen hallinta-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Linux-komentorivin ja Bash-komentosarjojen hallinta-oppitunnilla?
Kyllä. Jokainen Linux-komentorivin ja Bash-komentosarjojen hallinta-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Web- ja sovelluslokien jäsentäminen suuressa mittakaavassa
- Lokien seuraaminen reaaliajassa ja suoratoistohälytykset
- journaldin kyselyt journalctlillä skripteissä
- Mittareiden ja histogrammien laskeminen lokivirroista