Imaginemos que un gerente malvado quiere controlar a sus empleados y quiere registrar todos los accesos a la web que hacen (menos los suyos 'of course'). Usando un proxy squid o cualquier otro que genere los logs en el mismo formato, podemos hacer que se guarden en un gestor de BD para su posterior analisis. Mediante un script de perl se puede analizar el log del proxy cache SQUID y generar un fichero CSV (texto delimitado por punto y coma) para meterlo en una BD. Luego con un script de shell se crea la tarea periodica y ya esta. Aqui paso los elementos necesarios:
##### Script perl de cosecha propia (en su mayor parte)
# A este script hay que especificarle el dia del que se desean sacar
# los datos, sino sacara un CSV con todo lo que pille en el log.

Código:
#!/usr/bin/perl -w

# extraer.pl - (c) Pello Xabier Altadill Izura - www.pello.info

# Script para convertir los logs de SQUID a formato CSV.
# Si no se especifica fecha, crea un CSV de TODO!

# Librerias requeridas
use Time::localtime;

## Variables
my $PROGRAM = "Xtraer";
# Pasamos parametros de inicio

my ($fichero,$dia) = @ARGV;
my $all = 0;
my $current_dia = "";
my $url_inicio = "";

## Chequeo de parametros
if (!defined($fichero)) {
die("Pasa el parametro del fichero.
Agur
");
}

# Si no esta definida la variable dia, se muestra todo
$all = (!defined($dia));


## Inicio de programa
#&println("Abriendo fichero: $fichero");
unless (open (FICHERO_LOGS,$fichero) ) {
die("Lo siento, no se pudo abrir el fichero $fichero");
}

## Definimos las varibles que corresponden con cada campo de log
my ($when,$elapsed,$who,$tag,$size,$method,$what,$id,$hier);

## Iteracion que procesa cada linea de log
while (<FICHERO_LOGS>) {
chomp; # Cortamos el new-line
@LINEA = split; # Et voila! convertimos la linea en un array.
# Asginamos el array a variables concretas

($when,$elapsed,$who,$tag,$size,$method,$what,$id,$hier) = @LINEA;

# salvamos la hora unix
$unix_hour = $when;

#Convertimos la hora Unix en una hora -human readable-
$when = &convertir($when);
$url_inicio = &sacar_url($what);
if ($all) {
print("$unix_hour;$when;$elapsed;$who;$tag;$size;$method;$what;$url_inicio;$id;$hier
"
);
} elsif ($dia eq $current_dia) {
# sacamos por pantalla la linea en CSV en caso de que coincida el dia quequeremos
print("$unix_hour;$when;$elapsed;$who;$tag;$size;$method;$what;$url_inicio;$id;$hier
"
);
}
}

# Cerramos el fichero
close(FICHERO_LOGS);

####### Subrutinas
# Esta no se usa ahora
sub println () {
 print "$PROGRAM> $_[0]
";
}

## convertir
# convierte la fecha de formato UNIX a formato normal
# parametro 1: la fecha en formato unix
sub convertir () {
my $nuevo = localtime($_[0]);
        my $mday =  $nuevo->mday;
$mday = (($mday <10)?"0":"") . $mday;
        my $mon = ($nuevo->mon+1);
$mon = (($mon <10)?"0":"") . $mon;
        my $year = ($nuevo->year+1900);
        my $hour = $nuevo->hour;
        my $min = $nuevo->min;
        my $sec = $nuevo->sec;
# Este es el formato propuesto, se puede cambiar a otro.
$current_dia = "$mday/$mon/$year";

# In mysql datetime format
my $fecha = "$year/$mon/$mday $hour:$min:$sec";
return $fecha;
}

## sacar_url
# extrae la url inicial de un enlace complejo
sub sacar_url () {

my ($url) = @_;
my $url_final = "";
my $resultado_url = "";

# Extraemos el protocolo: https:// , http://, ...
$url_final = substr($url,0,index($url,"//")+2);

# Le quitamos el protocolo
$resultado_url = substr($url,(index($url,"//")+2),length($url));

# le quitamos el resto
$resultado_url = substr($resultado_url,0,index($resultado_url,"/"));
$resultado_url = $url_final . $resultado_url;

# Y devolucion!
return $resultado_url;
}
-------------------------------------------------------------------------------------


##### Estructura mysql (una tabla), mas los comandos para meter un usuario concreto.

Código:
CREATE TABLE log (
  logid char(16) NOT NULL default '',
  date datetime default NULL,
  elapsed_time int(11) default NULL,
  who char(30) default NULL,
  squid_code char(30) default NULL,
  size int(11) default NULL,
  mehtod char(15) default NULL,
  what char(255) default NULL,
  url_inicio char(255) default NULL,
  id char(30) default NULL,
  hier char(40) default NULL,
  PRIMARY KEY  (logid)
) TYPE=MyISAM;

-- aqui creamos permisos y passwords
grant CREATE, INSERT, SELECT, DELETE on webdb.* to wcaccess@localhost;
grant CREATE, INSERT, SELECT, DELETE on webdb.* to wcaccess@'%';
set password for 'wcaccess'@'localhost' = password('dFwY4.;u');
set password for 'wcaccess'@'%' = password('dFwY4.;u');
flush privileges;


------------------------------------------------------------------------------

###### Script para poner en cron.
Código:

#!/bin/sh

# crea_reporte - (c) Pello Xabier Altadill Izura - www.pello.info

# Script para convertir los logs de SQUID a formato CSV,
# Utiliza un script de perl marca de la casa.
# grant CREATE, INSERT, SELECT, DELETE on webdb.* to wcaccess@localhost;
# grant CREATE, INSERT, SELECT, DELETE on webdb.* to wcaccess@'%';
# set password for 'wcaccess'@'localhost' = password('dFwY4.;u');
# set password for 'wcaccess'@'%' = password('dFwY4.;u');
# flush privileges;

## Variables

# Fichero destino
DESTINO=/tmp/accesos
# Logs de donde sacamos los datos
FICHERO_LOG=/var/log/squid/access.log
# Calculo del dia anterior como parametro
DIAP=`date --date "1 day ago" +%d/%m/%Y`
# Calculo del dia anterior
DIA=`date --date "1 day ago" +%d.%m.%Y`

echo Iniciando extraccion del dia $DIA
/etc/scripts/feedsquid.pl $FICHERO_LOG $DIAP > $DESTINO.$DIA.csv && echo OK

echo Metiendo contenido...
mysql --user='wcaccess' --password='dFwY4.;u' webdb << EOF
LOAD DATA LOCAL INFILE "$DESTINO.$DIA.csv" REPLACE INTO table log FIELDS TERMINATED BY ';';
EOF

echo Borrando: $DESTINO.$DIA.csv

rm -f $DESTINO.$DIA.csv

echo Finalizado.