Bien que je dise presque toujours aux gens d'utiliser l'un des nombreux excellents modules du CPAN pour cela, la plupart d'entre eux ont un inconvénient majeur - la vitesse. Si vous analysez un grand nombre de fichiers journaux en temps réel, cela peut parfois poser un problème. Dans ces cas, rouler le vôtre peut souvent être une solution plus appropriée, mais il y a beaucoup d'embûches et de nuances qui doivent être considérées et traitées correctement. D'où la préférence pour l'utilisation d'un module connu-correct, éprouvé, fiable écrit par quelqu'un d'autre. :)
Cependant, avant même de prendre en compte mes conseils ci-dessus, j'ai regardé votre code et l'avais converti en perl dans ma tête ... donc, voici une conversion plus ou moins directe de votre code gawk en perl. J'ai essayé de l'écrire aussi simplement que possible, afin de mettre en évidence certaines des parties les plus délicates de traiter les dates et les heures en perl à la main.
# import the mktime function from the (standard) POSIX module
use POSIX qw(mktime);
sub log4jTimeStampToMillis {
my ($log4jts, $dst) = @_;
# extract the millisecond field
my ($tsstr, $millis) = split(',', $log4jts);
# extract values to pass to mktime()
my @mktime_args = reverse split('[-: ]', $tsstr);
# munge values for posix compatibility (ugh)
$mktime_args[3] -= 1;
$mktime_args[4] -= 1;
$mktime_args[5] -= 1900;
# print Dumper \@mktime_args; ## DEBUG
# convert, make sure to account for daylight savings
my $seconds = mktime(@mktime_args, 0, 0, $dst);
# return that time as milliseconds since the epoch
return $seconds * 1000 + $millis;
}
Une différence importante entre mon code et le vôtre - mon sous-routine log4jTimeStampToMillis prend deux paramètres:
- la chaîne d'horodatage du journal
- si oui ou non que l'horodatage utilise l'heure d'été (1 pour vrai, 0 pour faux)
Bien sûr, vous pourriez simplement ajouter du code pour détecter si ce ti moi tombe en DST ou pas et ajuster automatiquement, mais j'essayais de garder les choses simples. :)
REMARQUE: Si vous décommentez la ligne marquée DEBUG, veillez à ajouter "use Data :: Dumper;" avant cette ligne dans votre programme, donc ça va marcher.
Voici un exemple de la façon dont vous pouvez tester ce sous-programme:
my $milliseconds = log4jTimeStampToMillis("2009-05-10 00:48:41,905", 1);
my $seconds = int($milliseconds/1000);
my $local = scalar localtime($seconds);
print "ms: $milliseconds\n"; # ms: 1241844521905
print "sec: $seconds\n"; # sec: 1241844521
print "local: $local\n"; # local: Sat May 9 00:48:41 2009
Un grand merci. Parsedate dans le module est le même que mktime dans gawk, mais je peux comprendre le reste. –