I log sono molto utili per la risoluzione dei problemi e il debug dei siti WordPress. Su Kinsta è possibile accedere a tre tipi di log: log degli errori, log di kinsta-cache-perf (prestazioni della cache) e log degli accessi.

Accedere ai log attraverso il cruscotto di MyKinsta è semplice: basta andare su Siti WordPress, selezionare il sito desiderato e cliccare sulla scheda Log per aprire la pagina di visualizzazione dei log.

Ora, grazie all’API di Kinsta, è possibile accedere a questi log in modo programmatico. Mentre le agenzie possono creare interfacce personalizzate per accedere ai log, i team più grandi possono sfruttare strumenti come Slack per creare uno Slackbot personalizzato. Questo bot può interagire con l’API attraverso i comandi Slash, semplificando il recupero e la gestione dei log.

Questa guida spiega come funziona l’endpoint dei log disponibile attraverso l’API, i suoi potenziali utilizzi e come accedere a questi log in un ambiente Slack.

L’API di Kinsta

L’API di Kinsta è un potente strumento che permette di interagire programmaticamente con i servizi di Kinsta come i siti WordPress ospitati. Può aiutare ad automatizzare diverse attività legate alla gestione di WordPress, tra cui la creazione di un sito, il recupero di informazioni sul sito, lo stato di un sito, la consultazione e il ripristino dei backup, l’acquisizione dei log del sito e altro ancora.

Per utilizzare le API di Kinsta, è necessario avere un account con almeno un sito WordPress, un’applicazione o un database in MyKinsta. È anche necessario generare una chiave API per autenticarsi e accedere al proprio account.

Per generare una chiave API:

  1. Andiamo alla dashboard di MyKinsta.
  2. Andiamo alla pagina delle chiavi API (Nome > Impostazioni azienda > Chiavi API).
  3. Clicchiamo su Crea chiave API.
  4. Scegliamo una scadenza o impostiamo una data di inizio personalizzata e un numero di ore di scadenza della chiave.
  5. Assegniamo alla chiave un nome univoco.
  6. Clicchiamo su Genera.

Dopo aver creato una chiave API, copiamola e conserviamola in un luogo sicuro (noi consigliamo l’uso di un gestore di password), poiché è l’unica volta che verrà rivelata all’interno di MyKinsta. È possibile generare più chiavi API, che saranno elencate nella pagina delle chiavi API. Se si desidera revocare una chiave API, basta cliccare sul pulsante Revoca accanto al nome e alla data di scadenza.

Accedere ai log del server con Kinsta API

Per accedere ai log con l’API di Kinsta, è necessario specificare l’ID dell’ambiente del sito, il tipo di log che si desidera recuperare (ad esempio error, access, o kinsta-cache-perf) e il numero di righe di log da recuperare.

Esploriamo questo endpoint e successivamente integriamolo in uno Slackbot in modo da poter utilizzare i comandi Slash di Slack per interagire con l’API di Kinsta.

Possiamo ottenere l’ID dell’ambiente del sito in modo programmatico attraverso l’endpoint get site environment, che restituisce i dettagli dell’ambiente del sito, compreso il suo ID:

{
  "site": {
    "environments": [
      {
        "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
        "name": "first-site",
        "display_name": "First site",
        "is_blocked": false,
        "id_edge_cache": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
        "cdn_cache_id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
        "is_premium": false,
        "domains": [
          {
            "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
            "name": "example.com",
            "type": "live"
          }
        ],
        "primaryDomain": {
          "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
          "name": "example.com",
          "type": "live"
        },
        "ssh_connection": {
          "ssh_port": "808080",
          "ssh_ip": {
            "external_ip": "1xx.1xx.1xx.1xx"
          }
        },
        "container_info": {
          "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
          "php_engine_version": "php8.0"
        }
      }
    ]
  }
}

Una volta ottenuto l’ID dell’ambiente del sito, inviamo una richiesta GET a /sites/environments/{env_id}/logs?file_name=error&lines=100:

curl -i -X GET \
  'https://api.kinsta.com/v2/sites/environments/{env_id}/logs?file_name=access&lines=100' \
  -H 'Authorization: Bearer '

Questo restituirà una stringa con il numero di righe di log specificato:

{
    "environment": {
        "container_info": {
            "logs": "mysite.kinsta.cloud ::1 [07/Dec/2023:00:02:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.017 0.018\nmysite.kinsta.cloud ::1 [07/Dec/2023:00:17:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.139 0.139\nmysite.kinsta.cloud ::1 [07/Dec/2023:00:32:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.016 0.016\nmysite.kinsta.cloud ::1 [07/Dec/2023:00:47:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.015 0.015\n"
        }
    }
}

Potremo quindi formattare l’output in modo da separare ogni riga con l’interruzione di riga n. Ad esempio, con JavaScript, possiamo utilizzare il metodo split():

const logsData = {
    "environment": {
        "container_info": {
            "logs": "string"
        }
    }
};

const logsString = logsData.environment.container_info.logs;

// Splitting the logs string into an array of log entries based on the newline character '\n'
const logEntries = logsString.split('\n');

console.log(logEntries);

Implementare i comandi Slash di Slack per recuperare i log del server con l’API Kinsta

In una recente guida è stato spiegato il processo di creazione di uno Slackbot utilizzando Node.js e l’API Kinsta per la gestione del sito. La guida illustrava la creazione di uno Slackbot e l’interazione con l’API Kinsta tramite un’applicazione Node.js ospitata sulla nostra piattaforma di Hosting di Applicazioni.

Per questa guida, creeremo un nuovo comando Slackbot per ottenere gli endpoint di log del sito. Per seguire questa guida, è necessario consultare la guida precedente per capire come funziona l’applicazione Node.js e come configurare uno Slackbot personalizzato.

Una volta completata, potremo procedere a clonare il nostro progetto iniziale con Git:

  1. Navighiamo nella directory che preferiamo per archiviare il codice ed eseguiamo il comando qui sotto nel terminale:
    git clone -b tutorial-1 --single-branch https://github.com/olawanlejoel/SlackBot-KinstaAPI.git
  2. Spostiamoci nella cartella del progetto e installiamo tutte le dipendenze necessarie:
    cd SlackBot-KinstaAPI
    npm install

Creare comandi slash su Slack per recuperare i log del server

Nella precedente guida su Kinsta API e Slackbot, abbiamo creato cinque comandi slash per gestire quanto segue:

  • /site_id [site name]: utilizzato per recuperare l’ID del sito.
  • /environment_id [site name]: utilizzato per recuperare l’ID dell’ambiente.
  • /clear_site_cache [environment id]: utilizzato per cancellare la cache del sito.
  • /restart_php_engine [environment id]: utilizzato per riavviare il motore PHP di un sito.
  • /operation_status [operation id]: utilizzato per controllare lo stato di un’operazione.

In questa guida, creeremo un nuovo comando. Per impostare i comandi Slash su Slack per recuperare i log del server, seguiamo questi passaggi:

  1. Apriamo l’applicazione Slack e andiamo al menu Comandi Slash nella barra laterale sinistra.
  2. Clicchiamo sul pulsante Crea nuovo comando.
  3. Inseriamo i dettagli come segue:
    • Comando: /get_site_logs
    • Breve descrizione: Recupera i file di log del sito, inclusi error.log, kinsta-cache-perf.log e access.log.
    • Suggerimento d’uso: [Environment ID] [File name] [Lines, e.g., 1000]

Utilizzando questo comando insieme a parametri come [Environment ID], [File name], e [Lines], gli utenti possono richiedere file di log specifici, assicurandosi di accedere alle informazioni necessarie. Inoltre, abbiamo configurato il comando in modo che abbia dei valori predefiniti nel caso in cui l’utente non inserisca il nome del file di log e il numero di righe, garantendo un’esperienza più fluida.

Implementare le richieste di Node.js Fetch per le operazioni sui log del server

Una volta creato il comando slash, potremo modificare l’applicazione Node.js per rispondere al comando. Iniziamo creando una funzione asincrona per interagire con l’endpoint.

Nel file app.js, definiamo una funzione getSiteLogs() che riceve tre parametri da Slack:

async function getSiteLogs(environmentId, fileName, lines) {
    const query = new URLSearchParams({
        file_name: fileName || 'error',
        lines: lines || 1000,
    }).toString();
    const resp = await fetch(
        `https://api.kinsta.com/v2/sites/environments/${environmentId}/logs?${query}`,
        {
            method: 'GET',
            headers: getHeaders,
        }
    );
    const data = await resp.json();
    return data;
}

La funzione comunica con l’API di Kinsta utilizzando l’API Fetch di JavaScript. I parametri sono input attesi, che devono essere ricevuti dai comandi di Slack e poi passati a queste funzioni per l’esecuzione.

Nel codice, noterete che i parametri della query hanno alcuni valori predefiniti, supponendo che il nome del file e le righe del registro non vengano aggiunti tramite Slack.

Una volta creata la funzione getSiteLogs(), il passo successivo consiste nel configurare i comandi di Slack. Questa configurazione prevede la ricezione di valori di input da Slack, l’invocazione della funzione e l’invio di una risposta specifica a Slack.

Configurare i comandi Slash con Node.js per recuperare i log del server

Per configurare un comando Slash, utilizziamo la funzione app.command(), che funziona in modo simile agli ascoltatori di eventi in JavaScript. Specifichiamo il comando che vogliamo ascoltare e poi creiamo una funzione di callback asincrona per definire l’azione desiderata. Questa funzione accetta tre parametri:

  • command: contiene i dettagli del comando slash inviato dall’utente.
  • ack: conferma la ricezione del comando slash.
  • say: invia un messaggio al canale Slack.

Ecco la configurazione del comando /get_site_logs:

app.command('/get_site_logs', async ({ command, ack, say }) => {
    await ack();

    const [environmentId, fileName, lines] = command.text.split(' ');
    let response = await getSiteLogs(environmentId, fileName, lines);

    if (response) {
        const logs = response.environment.container_info.logs.split('\n');
        const formattedLogs = logs.join('\n\n'); // or any other formatting needed
        say(`Hey 👋, \n\nHere are the logs for ${fileName}:\n\n${formattedLogs}`);
    } else {
        say(`Sorry, no logs found for ${fileName}.`);
    }
});

Il codice qui sopra utilizza la funzione getSiteLogs() per recuperare i log in base ai parametri. Se i log vengono recuperati con successo, li formatta e invia un messaggio Slack che mostra i log del file specificato utilizzando la funzione say(). Se non viene trovato alcun log, l’utente viene avvisato di conseguenza.

Possiamo poi distribuire il codice del server Node.js su Kinsta per rendere attivo lo Slackbot.

Demo of interacting with the server logs endpoint with Slack Slash command and Kinsta API

È possibile accedere al codice completo di questo progetto sul nostro repository GitHub.

Riepilogo

In questa guida abbiamo imparato a utilizzare in modo efficace gli endpoint dei log dell’API di Kinsta. Questo endpoint permette di recuperare i log del server del proprio sito rapidamente per velocizzare la risoluzione dei problemi.

L’API di Kinsta offre molte altre funzionalità, quindi vi invitiamo a esplorare altri endpoint e a trovare modi innovativi per sfruttarli nei vostri progetti.

Come utilizzate attualmente l’API di Kinsta? Ci sono funzioni specifiche che vi piacerebbe vedere introdotte o rese accessibili in futuro?

Joel Olawanle

Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.