Log-Datei

Ereignisse, die auf den Warteschlangen auftreten, werden im Queue-Log, normalerweise /var/log/asterisk/queue_log detailliert festgehalten (natürlich werden auch Einträge im CDR-Log gemacht). Im queue_log steht ein Eintrag pro Zeile im Format:

Timestamp|Anruf-ID|Schlange|Kanal|Event|Param1[|Param2[|Param3]]
Timestamp
Ist die Unix-Zeit, zu der der Event aufgetreten ist.
Anruf-ID
Ist die einmalige ID des Anrufs (alphanumerisch).
Schlange
Ist der Name der Warteschlange, z.B. support. Kann auch NULL sein.
Kanal
Ist der Name des überbrückten Kanals, z.B. Agent/1001. Kann auch NULL sein.
Event
Ist der Name des aufgetretenen Ereignisses (s.u.). Abhängig vom Event sind Param1, Param2 und Param3 angegeben.

Die möglichen Ereignisse sind u.a. (siehe auch doc/queuelog.txt):

ABANDON
Anrufer hat seine Position in der Schlange durch Auflegen aufgegeben. Parameter: Position, Einstiegsposition, Wartezeit.
AGENTDUMP
Agent hat den Anrufer während der Ankündigung der Schlange abgewiesen.
AGENTLOGIN
Agent hat sich eingeloggt. Parameter: Kanal (z.B. SIP/127.0.0.1-0181ac00).
AGENTCALLBACKLOGIN
Callback-Agent hat sich eingeloggt. Parameter: Login-Extension[@Context].
AGENTLOGOFF
Agent hat sich ausgeloggt. Parameter: Kanal, Login-Dauer.
AGENTCALLBACKLOGOFF
Agent hat sich (/wurde) ausgeloggt. Parameter: Login-Extension[@Context], Login-Dauer, Grund (z.B. Autologoff).
COMPLETEAGENT
Gespräch zwischen Anrufer und Agent wurde vom Agenten beendet. Parameter: Wartezeit, Anruf-Dauer, Einstiegsposition.
COMPLETECALLER
Gespräch zwischen Anrufer und Agent wurde vom Anrufer beendet. Parameter: Wartezeit, Anruf-Dauer, Einstiegsposition.
CONFIGRELOAD
Konfiguration wurde neu eingelesen (z.B. durch asterisk -rx "reload").
CONNECT
Anrufer wurde zu einem Agenten durchgestellt. Parameter: Wartezeit.
ENTERQUEUE
Anrufer wurde in die Schlange aufgenommen. Parameter URL (falls verfügbar), Caller-ID.
EXITEMPTY
Anrufer wurd aus der Schlange geworfen, weil keine Agenten verfügbar waren[121]. Parameter: Position zum Zeitpunkt des Verlassens der Schlange, ursprüngliche Position beim Eintritt, Wartezeit.
EXITWITHKEY
Anrufer hat die Schlange durch Drücken einer Taste verlassen. Parameter: Taste, Position.
EXITWITHTIMEOUT
Anrufer war zu lange in der Schlange, und der Timeout ist abgelaufen. Parameter: Position.
QUEUESTART
Das Warteschlangensystem wurde gestartet. Dabei haben die Felder Anruf-ID, Schlange und Kanal den Wert NULL.
RINGNOANSWER
Ein verfügbarer Agent wurde angeklingelt, hat aber nicht abgenommen (Timeout). Parameter: Klingeldauer (in Millisekunden).
SYSCOMPAT
Agent hat Anruf angenommen, aber die Kanäle waren nicht kompatibel, und der Anruf wurde beendet.
TRANSFER
Anrufer wurde auf eine andere Extension umgeleitet. Parameter: Extension, Context.

Kommerzielle Log-Analyse- und Echtzeitüberwachungssysteme sind QueueMetrics[122] oder Easy PABX[123]. Siehe auch QueueLog().

Asterisk kann derzeit das Queue-Log noch nicht direkt in eine SQL-Tabelle schreiben. Wie man das trotzdem erreichen kann, wird auf http://www.voip-info.org/wiki/view/Asterisk+queue_log+on+MySQL beschrieben. Eine Möglichkeit ist, die Datei queue_log durch eine Named-Pipe zu ersetzen und dann z.B. mit einem Perl-Skript die Einträge in eine Datenbank zu schreiben. Hier ein Perl-Skript von William Lloyd[124]:

#!/usr/bin/perl -w
#
# wlloyd at slap.net

# The asterisk version indpendant way to get queue stats into Mysql,  
Postgres
# or whatever is supported by Perl DBI

# It's all about named pipes

# to setup this software
# stop asterisk
# rm /var/log/asterisk/queue_log
# mkfifo /var/log/asterisk/queue_log

# make sure permissions are setup
# chmod 777 /var/log/asterisk/queue_log

# run this program as root or under another user as you see fit.
# should start BEFORE asterisk.  Add to /etc/rc.d/rc.local or whatever

# restart asterisk

# requires a DB table like the following..
# CREATE TABLE csr_queue (
#  qname varchar(30) default NULL,
#  agent varchar(30) default NULL,
#  action text,
#  info1 text,
#  info2 text,
#  info3 text,
#  timestamp int(11) NOT NULL default '0',
#  id tinytext NOT NULL
#) TYPE=MyISAM;

use DBI;
use IO::File;

my $opt_debug = 0;

# if you want postgres change this to "Pg"
my $db_type = "mysql";
my $db_host = "127.0.0.1";
my $db_user_name = 'username';
my $db_password = 'password';
my $db_database = 'asteriskstat';

my $dbh = DBI->connect("DBI:$db_type:dbname=$db_database;host= 
$db_host;", $db_user_name, $db_password);

open(FIFO, "< /var/log/asterisk/queue_log")        or die "Can't open  
queue_log : $!\n";

while (1) {

     $message = <FIFO>;
     next unless defined $message;   # interrupted or nothing logged
     chomp $message;

     # remove chars that will cause DB problems
     $message =~ s/\"\'//g;

     @data = split(/\|/,$message);

     # these messages are almost useless for my purposes
     next if ($data[4] eq "QUEUESTART" );
     next if ($data[4] eq "CONFIGRELOAD" );

     if (!defined($data[5])) {
       $data[5] = '';
     }
     if (!defined($data[6])) {
       $data[6] = '';
     }
     if (!defined($data[7])) {
       $data[7] = '';
     }

     my $sql = "INSERT INTO csr_queue (timestamp, id, qname, agent,  
action, info1, info2, info3) VALUES ('$data[0]', '$data[1]', '$data 
[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]', '$data[7]')";

     print "$sql \n\n" if ($opt_debug);

     $dbh->do($sql);

# if you want an actual logfile you might want to uncomment this
#        if ( open(LOG, ">> /var/log/asterisk/queue_log_real") ) {
#            print LOG "$message\n";
#            close(LOG);
#        } else {
#            warn "Couldn't log to /var/log/asterisk_queue_log: $!\n";
#        }
#
}

$dbh->disconnect();

exit 0;

Bei QueueMetrics (kostenlose Demo-Version) wird ebenfalls ein Perl-Skript queueLoader.pl mitgeliefert.



[124] wlloyd at slap.net, veröffentlicht auf der Digium-Mailingliste asterisk-users, siehe: http://lists.digium.com/pipermail/asterisk-users/2005-July/109892.html