2009-11-11 4 views
3

Я пытаюсь подсчитать количество обращений к конкретному URL-адресу на нашем веб-сайте, проанализировав наши журналы IIS с помощью Log Parser 2.2. Кажется, все работает нормально, за исключением того, что обработка временных меток меня очень сбивает с толку.Log Parser 2.2, пропуская сегодняшние журналы IIS

Журналы IIS имеют все временные метки, выраженные в UTC. Поэтому в моем приложении я конвертирую время сервера в UTC, прежде чем подключать его к запросу. Однако, когда я пытаюсь запросить данные текущего дня, я возвращаю нулевой счет, несмотря на то, что вижу записи в файле журнала. Сформированный запрос я пытаюсь запустить, чтобы получить все, что в течение текущего дня выглядит примерно так (запрос выполняется на 11.11.2009, и я использую время Аризона):

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') 

Это выглядит для по какой-то причине данные текущего дня пропускаются. Когда вы запрашиваете более ранние даты, я возвращаю данные просто отлично. Почему это происходит?

ответ

1

Получается, что Log Parser не выполняет сопоставления временной метки должным образом. Однако, когда я преобразовал метки времени в строки, сравнение строк работало нормально. Вот то, что измененный запрос выглядит следующим образом:

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

Иаков, Спасибо за Ваше сообщение. У меня также возникли проблемы с сопоставлением даты/времени в журналах IIS. Объединив свой вопрос и решение, я смог выполнить поиск без 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') 

Полный Источник:

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

Рад, что помог, и что вы нашли лучший способ Делать это. – Jacob

+2

Быстрый комментарий. Строка формата даты чувствительна к регистру, запись «yyyy-mm-dd» заставит вас потратить добрые 15 минут, пытаясь понять, почему даты LogParser нарушены. вздох. –

1

Log Parser имеет функцию преобразования времени от UTC в местное для вас:

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')