Script para cargas incrementales de log en Piwik/Matomo

por | enero 15, 2018

Piwik -recientemente renombrada a Matomo– ya cuenta con un script en Python para importar logs llamado import_logs.py. El problema es que si cargamos el mismo log de Apache por segunda vez, si bien no duplica registros, sí tenemos que esperar a que el script lo parsee. Si esto nos hace perder tiempo, la situación empeora aún más si cargamos en serie varios logs almacenados en un mismo directorio.

He generado un sencillo script con el fin de automatizar las cargas de logs en Piwik evitando cargar logs que ya han sido tratados:

  • Las cargas se realizan a partir de los logs guardados en logfiles_folder. Al principio del script, se genera una lista de los ficheros a cargar en log-list.
  • El nombre de los ficheros de log ya cargados se van a añadiendo al fichero control-list.
  • En sucesivas ejecuciones, el script comprueba que el log a cargar no esté en la lista de control. Si lo está, procede a cargar el siguiente. Si no, lo carga y después lo añade a la lista de control para evitar tratarlo en la siguiente carga.

Como ves el funcionamiento es muy sencillo. El script se lanza con root, aunque después para las cargas se invoca al usuario definido en la variable piwik_user (suele ser www-data o apache), propietario de los ficheros de instalación de Piwik. Recuerda que necesitarás al menos Python 2.7 para utilizar import_logs.py. Modificad el script según necesitéis:

#!/bin/bash
#
# Author        :Julio Sanz
# Website       :www.elarraydejota.com
# Email         :juliojosesb@gmail.com
# Description   :Script to process Apache logs for Piwik Analytics
# Dependencies  :python 2.7
# License       :GPLv3
#

#
# VARIABLES
#

unalias ls 2> /dev/null
line=""
logfiles_folder="/opt/apache/backup-logs-piwik"
piwik_user="www-data"
piwik_dir="/var/www/html/piwik"

#
# FUNCTIONS
#

process_logs(){
    # Generate log list
    ls -rlht "$logfiles_folder"/*access.* | awk '{print $9}' > log-list

    # Process logs
    while read line;do
        if grep -Fxq "$line" control-list;then
            echo "DATE $(date +%Y%m%d-%H:%m) --- File $(basename ${line}) already processed, skipping..." | tee -a processing-history.log
        else
            echo "DATE $(date +%Y%m%d-%H:%m) --- Processing $(basename ${line})..." | tee -a processing-history.log
            su - ${piwik_user} -s /bin/bash -c "python ${piwik_dir}/misc/log-analytics/import_logs.py --url='http://localhost/piwik' \
            --idsite=1 --recorders=4 --enable-http-errors --enable-http-redirects --enable-static ${line}"
            su - ${piwik_user} -s /bin/bash -c "${piwik_dir}/console core:archive --force-all-websites --force-all-periods=315576000 \
            --force-date-last-n=1000 --url='http://localhost/piwik'"
            echo "$line" >> control-list
        fi
    done < log-list
    exit 0
}

#
# MAIN
#

if [ $# -ne 0 ];then
    echo "Don't use arguments with this script"
    exit 1
else
    process_logs
fi

Una vez realizada la carga, podemos revisar el resultado en processing-history.log. Por ejemplo, veremos los logs que el script se ha saltado ya que fueron cargados en procesos anteriores:

...
DATE 20180114-18:01 --- File ssl_access.log-20171216.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171217.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171218.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171219.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171220.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171221.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171222.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171223.gz already processed, skipping...
DATE 20180114-18:01 --- File ssl_access.log-20171224.gz already processed, skipping...
...

Los ficheros procesados se verán de la siguiente manera:

...
DATE 20180114-18:01 --- Processing ssl_access.log-20180109.gz...
DATE 20180114-18:01 --- Processing ssl_access.log-20180110.gz...
DATE 20180114-18:01 --- Processing ssl_access.log-20180111.gz...
...

Además de su web oficial, tenéis la web del proyecto también en GitHub.