2009-08-18 9 views
2

Ich habe ein Problem, wo eine Anwendung während eines DBI-Aufrufs zufällig stirbt. Wir können dies nicht zuverlässig in unserer Test- oder Akzeptanzumgebung reproduzieren, daher muss ich es in unserem Produktionssystem überwachen, um herauszufinden, was passiert.Wie kann ich Zeitstempel in Perl DBI-Logfiles bekommen?

Ich protokolliere alle DBI Verkehr über die Umgebungsvariable DBI_TRACE.

DBI_TRACE=3=dbi.log script.pl 

Das Problem ist jedoch, dass es keine Zeitmarken in den DBI-Protokolldateien sind, so ist es schwierig, durch sie zurück zu gehen zu finden, was zum Zeitpunkt der Düse auftritt.

Gibt es eine Möglichkeit, die Protokollierung von DBI mit Zeitstempeln zu aktivieren?

Antwort

2

DBI-Dokumentation contains Code zum Aktivieren von Timestamp-Protokollen mithilfe von Dateihandles mit Ebenen. Der Nachteil ist, dass Sie den Luxus mit Umgebungsvariablen verlieren, und Tracing-Parameter in Code zu setzen haben:

$dbh->trace('SQL', $fh); 

Wo $ fh Referenz auf das Objekt hält, das ist ‚Unterklasse‘ von PerlIO::Via

3

Sie könnten File::Tee verwenden, um STDERR umzuleiten und ein Präfix mit dem Zeitstempel hinzuzufügen.

Zum Beispiel:

use strict; 
use warnings; 

use File::Tee 'tee'; 

my $logfile = "/path/to/timestamped/logfile.log"; 
my $filter = sub { return localtime() . ' ' . $_[0] }; 

my $pid = tee STDERR, { preprocess => $filter, reopen => $logfile }; 

print STDERR "something bad happened."; 

Der hier Vorteil ist, dass es nicht mit Ihrer vorhandenen STDERR stören - alle Fehlermeldungen an den gleichen Ort gehen, wird sich fortsetzen. Aber der Stream ist dupliziert und auch geschrieben, um $logfile, mit welcher Transformation Sie wollen über die $filter Hook.

2

Wenn überwiegendes STDERR ist keine Option, und wenn Sie auf einem Unixy System sind (die Sie sind in verschiedenen Funktionen vorschlagen), können Sie die Trace-Ausgabe an einen fifo direkt und timestamping Filter dort laufen:

$ mkfifo /tmp/fifo 
$ perl -MTime::HiRes=time -npe 's/^/time . " "/e' </tmp/fifo> /tmp/timestamped.log & 
[1] 12345 
$ DBI_TRACE=1=/tmp/fifo script.pl 

Dieses Filterprogramm könnte alles sein, auch logger, die auf meinem System Zeitstempel mit freundlicher Genehmigung von syslogd hinzugefügt.

0

Ich schrieb eine minimalistische perl logger mit konfigurierbaren dynamischen Protokollieren Sie die folgende API geben:

 use strict ; use warnings ; use Exporter; 
     use Configurator ; 
     use Logger ; 


     # anonymous hash !!! 
     our $confHolder =() ; 

     sub main { 

       # strip the remote path and keep the bare name 
       $0=~m/^(.*)(\\|\/)(.*)\.([a-z]*)/; 
       my $MyBareName = $3; 
       my $RunDir= $1 ; 

       # create the configurator object 
       my $objConfigurator = new Configurator($RunDir , $MyBareName); 
       # get the hash having the vars 
       $confHolder = $objConfigurator ->getConfHolder() ; 
       # pring the hash vars 
       print $objConfigurator->dumpIni(); 

       my $objLogger = new Logger (\$confHolder) ; 
       $objLogger->LogMsg ( " START MAIN ") ; 

       $objLogger->LogMsg ( "my \$RunDir is $RunDir") ; 
       $objLogger->LogMsg ( "this is a simple message") ; 
       $objLogger->LogErrorMsg ( "This is an error message ") ; 
       $objLogger->LogWarningMsg ( "This is a warning message ") ; 
       $objLogger->LogInfoMsg ( "This is a info message ") ; 
       $objLogger->LogDebugMsg ( "This is a debug message ") ; 
       $objLogger->LogTraceMsg ( "This is a trace message ") ; 
       $objLogger->LogMsg ( "using the following log file " . "$confHolder->{'LogFile'}") ; 
       $objLogger->LogMsg ( " STOP MAIN \n\n") ; 

     } #eof main 



     #Action !!! 
     main(); 

     1 ; 

     __END__ 
+0

"Konfigurator" und "Logger" sind schreckliche Paketnamen. http://perldoc.perl.org/perlmodlib.html#Guidelines-for-Module-Creation – Oesor

0

ich bezweifle, dass es ein Problem in DBI selbst, obwohl es möglich ist. DBI-Tracing kann sehr ausführlich sein, obwohl ich sehe, dass Sie Trace-Level 3 verwenden. Verwenden Sie DBIx :: Log4perl und Sie erhalten konfigurierbare Zeitstempel, Methodenaufruf, SQL, Binding Tracing und alles, was Sie tun müssen, ist Ihre Verbindung ändern.

0

Ich schlage vor, einen Blick in DBI::Log zu werfen.

Standardmäßig druckt es auf STDERR so Ihre Nutzung Sie es so zu replizieren nennen:

perl -MDBI :: Log script.pl 2> dbi.lügen

Der Ausgang gibt Ihnen ein viel besseres Gesamtbild von dem, was in Ihrem DBI basierten SQL-Zugriff geschah durch:

  • enthalten Zeitstempel,
  • ersetzt Platzhalter (auch bekannt als gebundenen Parameter.) mit tatsächlichen Werten, die das erneute Ausführen der Abfragen direkt in SQL zum Debuggen erleichtern, und
  • mit Aufrufspuren des Perl-Codes, der zur entsprechenden SQL-Abfrage geführt hat.
Verwandte Themen