{"id":27395,"date":"2026-09-04T08:00:00","date_gmt":"2026-09-04T06:00:00","guid":{"rendered":"https:\/\/weare.fi\/?p=27395"},"modified":"2026-07-22T05:39:36","modified_gmt":"2026-07-22T03:39:36","slug":"strukturoitu-lokitus","status":"publish","type":"post","link":"https:\/\/weare.fi\/en\/strukturoitu-lokitus\/","title":{"rendered":"Strukturoitu lokitus"},"content":{"rendered":"<p>Lokitiedostot ovat olleet osa ohjelmistokehityst\u00e4 niin kauan kuin sovelluksia on rakennettu. Silti monissa j\u00e4rjestelmiss\u00e4 lokit ovat edelleen sekalainen kokoelma vapaata teksti\u00e4, joka on vaikea tulkita ja l\u00e4hes mahdoton analysoida automaattisesti. Strukturoitu lokitus muuttaa t\u00e4m\u00e4n perustavanlaatuisesti. Se ei ole vain tekninen yksityiskohta, vaan tapa tehd\u00e4 lokidatasta oikeasti k\u00e4ytt\u00f6kelpoista silloin kun sit\u00e4 tarvitaan eniten.<\/p>\n<p>T\u00e4ss\u00e4 artikkelissa k\u00e4ymme l\u00e4pi strukturoidun lokituksen perusteet, sen yhteyden observabilityyn ja sen, miten voit alkaa soveltaa sit\u00e4 omassa ymp\u00e4rist\u00f6ss\u00e4si. Etenemme k\u00e4sitteist\u00e4 k\u00e4yt\u00e4nt\u00f6\u00f6n, joten artikkeli sopii niin aiheeseen tutustuvalle kuin lokitusstrategiaansa kehitt\u00e4v\u00e4lle.<\/p>\n<h2>Mit\u00e4 on strukturoitu lokitus?<\/h2>\n<p>Strukturoitu lokitus tarkoittaa lokitapahtumien kirjaamista koneluettavassa, ennalta m\u00e4\u00e4r\u00e4tyss\u00e4 muodossa sen sijaan, ett\u00e4 kirjoitettaisiin vapaata teksti\u00e4. Yleisin formaatti on JSON, mutta my\u00f6s muita rakenteisia muotoja k\u00e4ytet\u00e4\u00e4n. Jokainen lokitapahtuma koostuu avain-arvo-pareista, joissa kent\u00e4t ovat nimetty ja tyypit johdonmukaiset.<\/p>\n<p>Perinteinen lokiviesti saattaa n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4: <em>&#8221;User login failed for user johndoe at 2026-03-14 08:42:11&#8221;<\/em>. Strukturoituna sama tapahtuma kirjataan esimerkiksi n\u00e4in:<\/p>\n<ul>\n<li><strong>timestamp:<\/strong> 2026-03-14T08:42:11Z<\/li>\n<li><strong>event:<\/strong> user_login_failed<\/li>\n<li><strong>username:<\/strong> johndoe<\/li>\n<li><strong>severity:<\/strong> warning<\/li>\n<li><strong>service:<\/strong> auth-service<\/li>\n<\/ul>\n<p>Ero on merkitt\u00e4v\u00e4. Vapaatekstimuodossa oleva viesti on ihmisen luettavissa, mutta ohjelman on vaikea erottaa siit\u00e4 kentt\u00e4arvoja ilman monimutkaisia tekstink\u00e4sittelys\u00e4\u00e4nt\u00f6j\u00e4. Rakenteinen muoto puolestaan on suoraan suodatettavissa, haettavissa ja yhdistett\u00e4viss\u00e4 muuhun dataan ilman lis\u00e4k\u00e4sittely\u00e4.<\/p>\n<h2>Miten strukturoitu lokitus toimii k\u00e4yt\u00e4nn\u00f6ss\u00e4<\/h2>\n<p>Strukturoitu lokitus rakentuu kolmesta periaatteesta: johdonmukaisesta skeemasta, kontekstin sis\u00e4llytt\u00e4misest\u00e4 ja lokitasojen hallinnasta.<\/p>\n<h3>Johdonmukainen skeema<\/h3>\n<p>Skeema tarkoittaa sopimusta siit\u00e4, mit\u00e4 kentti\u00e4 lokeissa k\u00e4ytet\u00e4\u00e4n ja miss\u00e4 muodossa. Kun kaikki palvelut k\u00e4ytt\u00e4v\u00e4t samoja kentt\u00e4nimi\u00e4, kuten <em>service<\/em>, <em>trace_id<\/em> ja <em>severity<\/em>, lokidataa voidaan hakea ja yhdist\u00e4\u00e4 eri l\u00e4hteist\u00e4 ilman erillisi\u00e4 muunnosaskeleita. Ilman skeemaa jokainen tiimi kirjoittaa lokit omalla tavallaan, mik\u00e4 tekee koko infrastruktuurin tason analyysista k\u00e4yt\u00e4nn\u00f6ss\u00e4 mahdotonta.<\/p>\n<h3>Kontekstin sis\u00e4llytt\u00e4minen<\/h3>\n<p>Strukturoidun lokituksen todellinen voima tulee siit\u00e4, ett\u00e4 jokaiseen tapahtumaan liitet\u00e4\u00e4n riitt\u00e4v\u00e4sti kontekstia. Pelkk\u00e4 tieto siit\u00e4, ett\u00e4 jokin ep\u00e4onnistui, ei riit\u00e4. Tarvitaan my\u00f6s tieto siit\u00e4, miss\u00e4 palvelussa, mink\u00e4 pyynn\u00f6n yhteydess\u00e4, milt\u00e4 k\u00e4ytt\u00e4j\u00e4lt\u00e4 ja miss\u00e4 ymp\u00e4rist\u00f6ss\u00e4. Esimerkiksi <em>request_id<\/em>-kent\u00e4n lis\u00e4\u00e4minen jokaiseen lokiviestiin mahdollistaa yhden HTTP-pyynn\u00f6n seuraamisen l\u00e4pi useiden mikropalveluiden.<\/p>\n<h3>Lokitasot k\u00e4yt\u00e4nn\u00f6ss\u00e4<\/h3>\n<p>Lokitasot, kuten DEBUG, INFO, WARNING, ERROR ja CRITICAL, ovat tuttuja k\u00e4site useimmille kehitt\u00e4jille. Strukturoidussa lokituksessa ne ovat rakenteinen kentt\u00e4, ei vain tekstin osa. T\u00e4m\u00e4 mahdollistaa esimerkiksi sen, ett\u00e4 tuotantoymp\u00e4rist\u00f6ss\u00e4 ker\u00e4t\u00e4\u00e4n vain WARNING-tason ja sit\u00e4 vakavammat tapahtumat, kun taas kehitysymp\u00e4rist\u00f6ss\u00e4 kaikki DEBUG-tason viestit tallennetaan.<\/p>\n<h2>Strukturoitu lokitus osana observabilitya<\/h2>\n<p>Observability tarkoittaa kyky\u00e4 ymm\u00e4rt\u00e4\u00e4 j\u00e4rjestelm\u00e4n sis\u00e4inen tila sen tuottaman datan perusteella. Se rakentuu kolmen pilarin varaan: lokit, metriikat ja j\u00e4ljitykset. Strukturoitu lokitus on n\u00e4ist\u00e4 se perusta, joka tekee muiden pilarien hy\u00f6dynt\u00e4misest\u00e4 mielek\u00e4st\u00e4.<\/p>\n<p>Lokit kertovat <em>mit\u00e4 tapahtui ja miksi<\/em>. Metriikat kertovat <em>mit\u00e4 tapahtuu juuri nyt<\/em>. J\u00e4ljitykset, eli tracerit, n\u00e4ytt\u00e4v\u00e4t <em>miss\u00e4 ongelma sijaitsee<\/em> n\u00e4ytt\u00e4m\u00e4ll\u00e4 pyynn\u00f6n reitin j\u00e4rjestelm\u00e4n l\u00e4pi. N\u00e4m\u00e4 kolme t\u00e4ydent\u00e4v\u00e4t toisiaan, mutta vain silloin, kun lokidata on rakenteista. Vapaamuotoinen teksti ei yhdisty trace-dataan eik\u00e4 mahdollista automaattista korrelaatiota metriikoiden kanssa.<\/p>\n<p>K\u00e4yt\u00e4nn\u00f6n esimerkki: kun API-vasteaika nousee \u00e4killisesti, metriikat havaitsevat poikkeaman. J\u00e4ljitys paikantaa, miss\u00e4 palvelussa viive syntyy. Strukturoidut lokit kertovat, mik\u00e4 pyynt\u00f6, milt\u00e4 k\u00e4ytt\u00e4j\u00e4lt\u00e4 ja mill\u00e4 sy\u00f6tteell\u00e4 ongelman aiheutti. Ilman rakenteisia lokeja viimeinen askel j\u00e4\u00e4 puuttumaan, ja juurisyyn selvitt\u00e4minen muuttuu manuaaliseksi arvaamiseksi.<\/p>\n<p>Syvemp\u00e4\u00e4 tietoa lokidatan hallinnasta k\u00e4yt\u00e4nn\u00f6ss\u00e4 l\u00f6yd\u00e4t t\u00e4st\u00e4 <a href=\"https:\/\/weare.fi\/en\/log-and-data-management-with-splunk-case-study\/\">Splunk-pohjaisen lokienhallintaratkaisun case-kuvauksesta<\/a>.<\/p>\n<h2>Strukturoidun lokituksen k\u00e4ytt\u00f6\u00f6notto sovelluksessa<\/h2>\n<p>Strukturoidun lokituksen k\u00e4ytt\u00f6\u00f6notto ei vaadi kaiken kirjoittamista alusta. Useimmissa ohjelmointikieliss\u00e4 on valmiita kirjastoja, jotka hoitavat JSON-muotoilun automaattisesti. T\u00e4rke\u00e4mp\u00e4\u00e4 on p\u00e4\u00e4tt\u00e4\u00e4, mit\u00e4 kentti\u00e4 lokeissa k\u00e4ytet\u00e4\u00e4n ja miten ne nimet\u00e4\u00e4n johdonmukaisesti.<\/p>\n<h3>Aloitusaskeleet<\/h3>\n<ol>\n<li><strong>Valitse lokituskirjasto<\/strong>, joka tukee rakenteista ulostuloa. Pythonissa t\u00e4m\u00e4 on esimerkiksi <em>structlog<\/em>, Node.js:ss\u00e4 <em>pino<\/em> tai <em>winston<\/em>, Javassa <em>Logback<\/em> JSON-appenderilla.<\/li>\n<li><strong>M\u00e4\u00e4rittele yhteiset kent\u00e4t<\/strong>, jotka lis\u00e4t\u00e4\u00e4n automaattisesti jokaiseen lokiviestiin. N\u00e4it\u00e4 ovat tyypillisesti <em>timestamp<\/em>, <em>service<\/em>, <em>environment<\/em>, <em>severity<\/em> ja <em>trace_id<\/em>.<\/li>\n<li><strong>Lis\u00e4\u00e4 tapahtumakonteksti<\/strong> jokaisen lokikutsun yhteydess\u00e4. \u00c4l\u00e4 kirjoita &#8221;Login failed&#8221;, vaan lis\u00e4\u00e4 kenttin\u00e4 <em>username<\/em>, <em>ip_address<\/em> ja <em>failure_reason<\/em>.<\/li>\n<li><strong>V\u00e4lt\u00e4 dynaamisia merkkijonoja<\/strong> lokiviesteiss\u00e4. Sen sijaan, ett\u00e4 kirjoitat <em>&#8221;User 123 failed to login&#8221;<\/em>, kirjoita <em>&#8221;User login failed&#8221;<\/em> ja lis\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4tunnus erilliseen kentt\u00e4\u00e4n.<\/li>\n<li><strong>Testaa lokit hakuty\u00f6kalulla<\/strong> ennen tuotantoonvienti\u00e4. Varmista, ett\u00e4 kent\u00e4t ovat haettavissa ja suodatettavissa tarkoitetulla tavalla.<\/li>\n<\/ol>\n<p>Yksi t\u00e4rke\u00e4 huomio: \u00e4l\u00e4 yrit\u00e4 muuttaa kaikkea kerralla. Aloita kriittisimmist\u00e4 palveluista tai niist\u00e4, joissa h\u00e4iri\u00f6iden selvitt\u00e4minen vie eniten aikaa. Strukturoitu lokitus tuottaa arvoa nopeasti, kun se kohdistetaan oikein.<\/p>\n<h2>Yleisimm\u00e4t virheet strukturoidussa lokituksessa<\/h2>\n<p>Strukturoidun lokituksen k\u00e4ytt\u00f6\u00f6notto on teknisesti suoraviivaista, mutta muutamat yleiset virheet heikent\u00e4v\u00e4t sen hy\u00f6ty\u00e4 merkitt\u00e4v\u00e4sti.<\/p>\n<h3>Ep\u00e4johdonmukaiset kentt\u00e4nimet<\/h3>\n<p>Yksi tiimi k\u00e4ytt\u00e4\u00e4 kentt\u00e4\u00e4 <em>user_id<\/em>, toinen <em>userId<\/em> ja kolmas <em>uid<\/em>. Tulos on se, ett\u00e4 haut palauttavat vain osan tapahtumista, ja korrelaatio eri palveluiden v\u00e4lill\u00e4 ep\u00e4onnistuu. Ratkaisu on yhteinen kentt\u00e4sanasto, joka dokumentoidaan ja jonka noudattaminen varmistetaan esimerkiksi koodikatselmoinneissa tai automaattisilla testeill\u00e4.<\/p>\n<h3>Liikaa tai liian v\u00e4h\u00e4n lokitettavaa<\/h3>\n<p>Liian v\u00e4h\u00e4inen lokitus j\u00e4tt\u00e4\u00e4 kriittiset tapahtumat dokumentoimatta. Liika lokitus puolestaan tuottaa niin paljon dataa, ett\u00e4 t\u00e4rke\u00e4t signaalit hukkuvat kohinaan ja tallennuskustannukset kasvavat hallitsemattomasti. Hyv\u00e4 nyrkkis\u00e4\u00e4nt\u00f6 on lokittaa kaikki tapahtumat, jotka vaikuttavat k\u00e4ytt\u00e4j\u00e4kokemukseen, tietoturvaan tai liiketoimintaprosessiin, ja pit\u00e4\u00e4 DEBUG-tason lokit tiukasti kehitysymp\u00e4rist\u00f6iss\u00e4.<\/p>\n<h3>Henkil\u00f6tietojen p\u00e4\u00e4tyminen lokeihin<\/h3>\n<p>Strukturoitu lokitus helpottaa kontekstin lis\u00e4\u00e4mist\u00e4, mutta se tekee my\u00f6s helpoksi vahingossa kirjata arkaluonteisia tietoja, kuten salasanoja, s\u00e4hk\u00f6postiosoitteita tai maksutietoja. Tietosuojavaatimukset, kuten GDPR, edellytt\u00e4v\u00e4t, ett\u00e4 henkil\u00f6tietoja ei tallenneta lokeihin ilman perustetta. T\u00e4m\u00e4 kannattaa ratkaista teknisesti: kirjastoihin voidaan rakentaa suodattimet, jotka est\u00e4v\u00e4t tiettyjen kenttien lokittamisen automaattisesti.<\/p>\n<h3>Lokit ilman hakuinfrastruktuuria<\/h3>\n<p>Strukturoitu lokitus tuottaa arvoa vain, jos lokit p\u00e4\u00e4tyv\u00e4t j\u00e4rjestelm\u00e4\u00e4n, jossa niit\u00e4 voidaan hakea ja analysoida. JSON-muotoiset lokit tiedostoj\u00e4rjestelm\u00e4ss\u00e4 ilman keskitetty\u00e4 hakupalvelua eiv\u00e4t juuri paranna tilannetta verrattuna vapaatekstilokeihin. K\u00e4ytt\u00f6\u00f6notto kannattaa suunnitella niin, ett\u00e4 lokidata virtaa alusta asti keskitettyyn analyysialustaan.<\/p>\n<h2>Kohti kyps\u00e4\u00e4 lokitusstrategiaa<\/h2>\n<p>Strukturoitu lokitus on askel kohti kyps\u00e4\u00e4 observability-k\u00e4yt\u00e4nt\u00f6\u00e4, mutta se on vasta l\u00e4ht\u00f6kohta. Kun lokit ovat rakenteisia ja keskitetysti ker\u00e4ttyj\u00e4, seuraava taso on niiden aktiivinen hy\u00f6dynt\u00e4minen: automaattiset h\u00e4lytykset poikkeamista, lokidatan korrelaatio metriikoiden kanssa ja pitk\u00e4aikainen arkistointi auditointitarpeita varten.<\/p>\n<p>Kyps\u00e4 lokitusstrategia vastaa nelj\u00e4\u00e4n kysymykseen: mit\u00e4 lokitetaan, miss\u00e4 muodossa, kuinka kauan data s\u00e4ilytet\u00e4\u00e4n ja kuka voi k\u00e4ytt\u00e4\u00e4 sit\u00e4. N\u00e4m\u00e4 eiv\u00e4t ole puhtaasti teknisi\u00e4 kysymyksi\u00e4. Ne koskevat my\u00f6s tietosuojaa, kustannusten hallintaa, vaatimustenmukaisuutta ja organisaation sis\u00e4ist\u00e4 vastuunjakoa.<\/p>\n<p>K\u00e4yt\u00e4nn\u00f6ss\u00e4 kypsyyden rakentaminen tapahtuu vaiheistamalla. Ensin varmistetaan, ett\u00e4 kriittiset palvelut tuottavat rakenteisia lokeja yhten\u00e4isell\u00e4 skeemalla. Sen j\u00e4lkeen laajennetaan kattavuutta muihin palveluihin ja ymp\u00e4rist\u00f6ihin. Lopuksi rakennetaan elinkaarihallinnan k\u00e4yt\u00e4nn\u00f6t: kuuma data nopeaan hakuun, kylm\u00e4 data edulliseen pitk\u00e4aikaisarkistoon.<\/p>\n<p>Jos lokitusstrategiasi on viel\u00e4 kehitysvaiheessa tai haluat arvioida, miss\u00e4 kohtaa observability-kypsyyden polkua organisaatiosi t\u00e4ll\u00e4 hetkell\u00e4 on, kannattaa aloittaa kartoittamalla nykytilanne. <a href=\"https:\/\/weare.fi\/en\/contact-us\/\">Ota yhteytt\u00e4 WeAren tiimiin<\/a> ja k\u00e4yd\u00e4\u00e4n yhdess\u00e4 l\u00e4pi, miten lokituksesta voidaan rakentaa teille toimiva perusta koko observability-k\u00e4yt\u00e4nn\u00f6lle.<\/p>","protected":false},"excerpt":{"rendered":"<p>Strukturoitu lokitus muuttaa sekavan tekstitulvan analysoitavaksi dataksi \u2013 n\u00e4in se toimii k\u00e4yt\u00e4nn\u00f6ss\u00e4.<\/p>","protected":false},"author":14,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[19],"tags":[],"blog":[],"customer-cases":[],"class_list":["post-27395","post","type-post","status-publish","format-standard","hentry","category-all"],"_links":{"self":[{"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/posts\/27395","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/comments?post=27395"}],"version-history":[{"count":2,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/posts\/27395\/revisions"}],"predecessor-version":[{"id":27450,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/posts\/27395\/revisions\/27450"}],"wp:attachment":[{"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/media?parent=27395"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/categories?post=27395"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/tags?post=27395"},{"taxonomy":"blog","embeddable":true,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/blog?post=27395"},{"taxonomy":"customer-cases","embeddable":true,"href":"https:\/\/weare.fi\/en\/wp-json\/wp\/v2\/customer-cases?post=27395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}