Analizza timestamp dei log
Il 25/Jul/2026:14:30:00 +0200 di Apache, il Jul 25 14:30:00 di syslog e il 2026-07-25T14:30:00.123Z tornano ciascuno come un orario ISO 8601 in UTC, con i millisecondi epoch e il formato riconosciuto. Gratis nel suo browser.
- Gratis
- Funziona nel suo browser
- Senza registrazione
- I suoi dati restano sul dispositivo
Esegui gratis nel browser
Esempio risolto
- Testo
- 2026-07-25T14:30:00.123Z INFO worker started
- Iso
- 2026-07-25T14:30:00.123Z
- Epoch (ms)
- 1.784.989.800.123
- Formato di uscita
- iso8601
I file di log non si mettono d'accordo su come scrivere un timestamp. La Sua applicazione emette ISO 8601, l'host scrive in syslog e il web server marca tutto nel formato common log di Apache: unire tre fonti significa riscrivere sempre lo stesso codice di parsing. Una sola chiamata sostituisce una pila di regex specifiche e calcoli sui fusi orari.
Tre formati, una sola risposta normalizzata
Ogni fonte di log ha scelto la propria convenzione decenni fa e non l'ha più cambiata. I timestamp ISO 8601 come 2026-07-25T14:30:00.123Z sono inequivocabili, ma sono solo uno dei formati che incontrerà sul campo. Le righe syslog secondo RFC 3164 si aprono con un marcatore come Jul 25 14:30:00: niente anno, niente fuso orario e un doppio spazio quando il giorno ha una sola cifra.
I log di accesso di Apache e nginx nel common log format usano una forma completamente diversa: 25/Jul/2026:14:30:00 +0200, con barre, due punti e un offset numerico. Il parser di timestamp dei log accetta il timestamp iniziale di una riga in uno qualsiasi dei tre formati e risponde con un'unica stringa ISO 8601 UTC normalizzata, i millisecondi epoch e il nome del formato riconosciuto. Non dovrà più ramificare il codice in base al tipo di fonte: qualunque cosa arrivi, un solo campo Le dice quando è successo.
Tutto ciò che non inizia con un timestamp noto viene rifiutato con un errore chiaro invece di una data indovinata, così una riga malformata fallisce rumorosamente a monte invece di corrompere silenziosamente le Sue analisi a valle.
Cosa significa davvero normalizzare
È nella normalizzazione che si annidano i bug più subdoli, quindi le regole sono dichiarate in modo esplicito. Un input ISO 8601 con offset esplicito, ad esempio 2026-07-25T16:30:00+02:00, viene convertito in UTC e restituito come 2026-07-25T14:30:00.000Z: lo stesso istante, un'unica grafia canonica. Un marcatore ISO senza alcuna zona viene considerato UTC, l'impostazione predefinita meno sorprendente per i log dei server.
L'offset numerico obbligatorio di Apache viene rispettato esattamente. I secondi frazionari sono mantenuti con precisione al millisecondo. La validazione del calendario è rigorosa: il 30 febbraio, una venticinquesima ora o un sessantunesimo secondo sono errori, non silenziosi riporti al giorno successivo, perché una pipeline di log che accetta date impossibili prima o poi La trarrà in inganno durante un incidente.
Pensato per le pipeline, deterministico per progettazione
Il parser è una funzione pura: espressioni regolari per riconoscere il formato, poi aritmetica intera sul calendario per convertire le date civili in epoch. Non legge mai l'orologio di sistema, non chiama mai la rete e non dipende mai dal fuso orario della macchina su cui gira: lo stesso input produce lo stesso output nei Suoi test di oggi e in produzione fra un anno. Questo determinismo conta quando rielabora log archiviati attraverso una nuova pipeline e si aspetta che la linea temporale ricostruita corrisponda all'originale byte per byte.
Gli usi tipici sono la normalizzazione di archivi in formati misti prima del caricamento in un motore di ricerca, l'allineamento di eventi provenienti da log applicativi, di sistema e del web server su un'unica linea temporale UTC durante l'analisi di un incidente, e la verifica che uno shipper marchi le righe nel formato atteso dal Suo collector.
Casi d'uso
Unire log da fonti diverse
Normalizzi i marcatori ISO, syslog e Apache su un'unica linea temporale UTC prima di caricare archivi misti nel Suo log store.
Ricostruire la cronologia di un incidente
Allinei cronologicamente gli eventi di applicazione, sistema e web server quando ogni livello ha marcato le righe in modo diverso.
Validare il formato di un log shipper
Verifichi che le righe in uscita dai Suoi agent inizino davvero con il formato di timestamp atteso dal collector, scartando subito quelle malformate.
Domande frequenti
Quanto costa?
Lo stesso parser funziona anche gratuitamente nel Suo browser su questa pagina.
Quali formati di timestamp sono supportati?
ISO 8601 (con o senza secondi frazionari e offset di fuso orario), syslog secondo RFC 3164 come 'Jul 25 14:30:00', e l'Apache common log format come '25/Jul/2026:14:30:00 +0200'.
E se un timestamp non ha fuso orario?
Viene considerato UTC. I marcatori con offset esplicito vengono convertiti in UTC, quindi ogni risposta torna nella stessa forma normalizzata.
E se la riga non inizia con un timestamp noto?
Date impossibili come il 30 febbraio o l'ora 25 vengono rifiutate allo stesso modo.
I miei dati di log vengono conservati?
No. La riga viene analizzata in memoria e scartata; viene restituito solo il timestamp normalizzato.
Strumenti correlati
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo stack
curl -X POST https://api.kit.forhosting.com/dev/timestamp-log-parse \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"2026-07-25T14:30:00.123Z INFO worker started"}'const res = await fetch("https://api.kit.forhosting.com/dev/timestamp-log-parse", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "2026-07-25T14:30:00.123Z INFO worker started"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/timestamp-log-parse",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "2026-07-25T14:30:00.123Z INFO worker started"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/timestamp-log-parse", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"2026-07-25T14:30:00.123Z INFO worker started"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"2026-07-25T14:30:00.123Z INFO worker started"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/timestamp-log-parse", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Esempio di richiesta
{
"text": "2026-07-25T14:30:00.123Z INFO worker started"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.timestamp_log_parse",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_chars | 10000 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |
Note tecniche
Questa API prende una riga di log, legge il timestamp iniziale in uno qualsiasi dei tre formati e lo restituisce normalizzato in ISO 8601 UTC, insieme ai millisecondi epoch e al formato riconosciuto.
Cosa significa davvero normalizzare
L'anno mancante di syslog è l'unico punto in cui una supposizione è inevitabile: RFC 3164 semplicemente non lo trasporta, quindi il parser lo ricava dal parametro default_year (2000 salvo diverso valore indicato) e marca il risultato con year_assumed: true, affinché sia l'output stesso ad ammettere la supposizione.
Pensato per le pipeline, deterministico per progettazione
Lo stesso codice gira gratuitamente nel Suo browser su questa pagina — incolli una riga, veda il risultato — e costa $0.002 a richiesta quando lo automatizza tramite l'API, senza che alcun file o riga venga conservato dopo la risposta.
Domande tecniche
Cosa succede con le righe syslog senza anno?
L'anno viene ricavato dal parametro default_year (2000 salvo che ne passi uno Suo) e il risultato viene marcato con year_assumed: true, così la supposizione resta visibile nell'output.