2009-11-11 17 views
3

Je suis en train de compter le nombre de résultats pour une URL particulière sur notre site Web en analysant nos journaux IIS utilisant Log Parser 2.2. Tout semble bien fonctionner, sauf que sa gestion des horodatages me perturbe grandement.Log Parser 2.2 sauter les journaux d'aujourd'hui IIS

Les journaux IIS ont toutes les horodatages exprimées dans le temps UTC. Par conséquent, dans mon application, je convertis l'heure du serveur à UTC avant de le brancher dans la requête. Cependant, lorsque j'essaie de rechercher les données du jour actuel, je récupère un nombre zéro, bien que je voie les enregistrements dans le fichier journal. La requête générée j'essaie de courir pour obtenir tout dans la journée actuelle ressemble à quelque chose comme ceci (la requête est exécutée le 11/11/2009, et je me sers de temps Arizona):

SELECT COUNT(*) 
FROM \\Server\IIS Logs\LogFiles\W3SVC1\u_ex*.log 
WHERE 
    cs-method = 'GET' 
    AND cs(Referer) NOT LIKE '%ntorus%' 
    AND c-ip NOT LIKE '192%' 
    AND c-ip NOT LIKE '127%' 
    AND (
     cs-uri-stem = '/' 
     OR cs-uri-stem = '/myurl') 
    AND sc-status BETWEEN 200 AND 299 
    AND date BETWEEN 
     TIMESTAMP('2009-11-11 07:00', 'yyyy-MM-dd hh:mm') 
     AND TIMESTAMP('2009-11-12 07:00', 'yyyy-MM-dd hh:mm') 

Il ressemble à Pour une raison quelconque, les données de la journée en cours sont ignorées. Lorsque j'interroge des dates antérieures, je récupère très bien les données. Pourquoi cela arrive-t-il?

Répondre

1

Il se trouve que Log Parser ne fait pas des comparaisons de l'horodatage correctement. Toutefois, lorsque j'ai converti les horodatages en chaînes, la comparaison de chaînes a bien fonctionné. Voici ce que la requête modifiée ressemble:

SELECT COUNT(*) 
FROM \\Server\IIS Logs\LogFiles\W3SVC1\u_ex*.log 
WHERE 
    cs-method = 'GET' 
    AND cs(Referer) NOT LIKE '%ntorus%' 
    AND c-ip NOT LIKE '192%' 
    AND c-ip NOT LIKE '127%' 
    AND (
     cs-uri-stem = '/' 
     OR cs-uri-stem = '/myurl') 
    AND sc-status BETWEEN 200 AND 299 
    AND TO_STRING(TO_TIMESTAMP(date, time), 'yyyy-MM-dd hh:mm') 
     BETWEEN '2009-11-11 07:00' AND '2009-11-12 07:00' 
2

Jacob, Merci pour votre message. J'avais aussi du mal à comparer la date et l'heure dans les journaux IIS. En combinant votre question et votre solution, j'ai pu chercher sans le TO_STRING.

TO_TIMESTAMP(date, time) 
     BETWEEN TIMESTAMP('2009-11-11 07:00', 'yyyy-MM-dd hh:mm') 
      AND TIMESTAMP('2009-11-12 07:00', 'yyyy-MM-dd hh:mm') 

Source complet:

SELECT COUNT(*) 
FROM \\Server\IIS Logs\LogFiles\W3SVC1\u_ex*.log 
WHERE 
    cs-method = 'GET' 
    AND cs(Referer) NOT LIKE '%ntorus%' 
    AND c-ip NOT LIKE '192%' 
    AND c-ip NOT LIKE '127%' 
    AND ( 
     cs-uri-stem = '/' 
     OR cs-uri-stem = '/myurl') 
    AND sc-status BETWEEN 200 AND 299 
    AND TO_TIMESTAMP(date, time) 
     BETWEEN TIMESTAMP('2009-11-11 07:00', 'yyyy-MM-dd hh:mm') 
      AND TIMESTAMP('2009-11-12 07:00', 'yyyy-MM-dd hh:mm') 
+0

Heureux il a aidé et que vous avez trouvé une meilleure façon de je le fais. – Jacob

+2

Un commentaire rapide .. la chaîne de format de date est sensible à la casse, l'écriture « aaaa-mm-jj » vous fera perdre un bon 15 minutes à essayer de comprendre pourquoi les dates de LogParser sont cassés. soupir. –

1

Log Parser a une fonction pour convertir le temps UTC au niveau local pour vous:

AND TO_LOCALTIME(TO_TIMESTAMP(date, time)) 
    BETWEEN TIMESTAMP('2009-11-11 03:00', 'yyyy-MM-dd hh:mm') 
     AND TIMESTAMP('2009-11-12 03:00', 'yyyy-MM-dd hh:mm')