2015-02-17 12 views
0

У меня есть файл журнала лицензии (TEXTLINE), который содержит сведения о пользователях и отметках времени, когда они взяли или выдали лицензию. Это выглядит, как показано ниже:Log Parser 2.2 Можем ли мы объединить два оператора select для получения комбинированного вывода

Для Ex:

9:43:58 (app_d) IN: "LICENSE_APP1_NAME" A123456 @ ABCDEFG
9:44:12 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ АБВГДЕЖ

Каждые шесть часов он также входит в систему даты, как показано ниже:

9:12:41 (Lmgrd) TIMESTAMP 2/6/2015

Она также имеет сведения о журнале, когда пользователю будет отказано в лицензии, как показано ниже:

6:24:21 (app_d) ЗАПРЕЩЕН: «LICENSE_APP1_NAME» A123456 @ АБВГДЕЖ (лицензированное количество пользователей уже достигнуто. (-4342: 10054 ""))

Теперь я попытался с помощью следующей команды в Log Parser:

LogParser -i: TextLine -rtp: -1 «Выбрать текст из '[LOGFILEPATH], где текст как '% лицензированное количество пользователей уже достигло%'»

LogParser -i: TextLine -rtp: -1 "Выбрать текст из '[LOGFILEPATH]', где текст как '% TIMESTAMP%'"

Первый дает мне список всех строк, где в журнале отображается Лицензия d и второй дает мне все строки, содержащие дату. Если я использую select '*', он дает три столбца: LogFilename, Index и Text.

Я хочу объединить эти два выбора. Я попробовал «СОЮЗ», но не работал. Мой желаемый результат: мне нужно распечатать все строки, у которых есть строки, показывающие как дату, так и строку с лицензией, как показано ниже.(По индексу)

Для Ex: (Plz игнорировать пробелы линии, если таковые имеются)

9:12:41 (Lmgrd) TIMESTAMP 2/6/2015

9:25 : 32 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ АБВГДЕЖ
10:36:40 (app_d) В: "LICENSE_APP1_NAME" A123456 @ ABCDEFG
10:36:53 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ АБВГДЕЖ
12:38:13 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ ABCDEFG
12:43:58 (app_d) IN: "LICENSE_APP1_NAME" A123456 @ ABCDEFG

15:12:42 (Lmgrd) TIMESTAMP 2/6/2015

15:27:41 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ АБВГДЕЖ
16:28:30 (app_d) IN: "LICENSE_APP1_NAME" A123456 @ ABCDEFG
16:28:54 (app_d) IN: "LICENSE_APP1_NAME" A123456 @ ABCDEFG
18:29: 04 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ ABCDEFG
18:30:51 (app_d) OUT: "LICENSE_APP1_NAME" A123456 @ ABCDEFG

Было бы даже лучше, если бы я мог отображать только дату в строке даты. Можем ли мы обрезать остальную часть?

Также мое будущее требование будет содержать вывод с таблицей, в которой отображается пользовательский столбец со всеми подробностями пользователей (пример: A123456 @ ABCDEFG), столбец «сеанс» с количеством раз, когда у пользователя был сеанс (в зависимости от количества «IN» и «OUT» в журналах), столбец «Всего часов», который использует разницу во временных марках, чтобы рассчитать время, в течение которого он использовал лицензию, и столбец «Отрицания», который показывает номер от времени пользователю было отказано в лицензии из-за ошибки «Лицензионное количество пользователей, уже достигнутых». Если не весь код, могу ли я получить некоторую помощь в понимании идеи о том, как это можно сделать возможным? Заранее спасибо.

P.S. A123456 @ ABCDEFG и LICENSE_APP1_NAME приведены в качестве примера. Есть много таких пользователей и несколько других приложений, которые поддерживает файл лицензии. Более поздние требования состоят в том, чтобы выяснить, какие пользователи подключены к каждому приложению из файла лицензии.

ответ

0

Ваш первый вопрос решается с помощью OR:

Select text from '[LOGFILEPATH]' 
where text like '%Licensed number of users already reached%' 
OR text like '%TIMESTAMP%' 

Затем вы можете сохранить только дату от «... TIMESTAMP ...» линии с помощью EXTRACT_TOKEN (см http://logparserplus.com/Functions) только на линии соответствия TIMESTAMP:

Select CASE INDEX_OF(text, 'TIMESTAMP') WHEN -1 THEN NULL ELSE EXTRACT_TOKEN(text, 3, ' ') END AS Date FROM ... 

Наконец, ваш последний набор требований может быть немного перенапряжению возможности LogParser. Прежде всего, я предлагаю вам переключиться на формат ввода TSV, который предполагает, что ваш журнал разделен пробелами и должен иметь возможность вернуть идентификатор пользователя в свой собственный столбец. Прочитайте его в документации LogParser.

Как только вы достигнете этого, вы можете начать использовать GROUP BY на идентификаторе пользователя и агрегировать различные счетчики в предложении SELECT.Например, если формат TSV дает вам индикатор IN/OUT в столбце «Field3» и идентификатор пользователя в столбце «Field5», следующий запрос возвращает общее число IN: для каждого пользователя:

SELECT Field5 AS User, COUNT(*) AS NumberOfSessions 
FROM '[LOGFILEPATH]' 
WHERE Field3 = 'IN:' 
GROUP BY Field5 

Это говорит о том, что требование «TotalHours» действительно сложно, так как для разных диапазонов требуется дельта (что довольно сложно сделать даже в базе данных SQL), а требование «Отрицания» - просто еще один счетчик, но на этот раз только сообщений, соответствующих вашему шаблону.

+0

Спасибо за ваше решение, первая часть моего вопроса была решена с помощью OR. – Pranav247

+0

О частике токена выписки, если я добавлю токрен выделения для одной строки., То есть для даты с датой, будет ли она не применяться ко второму предложению where, поскольку я упоминаю об этом «[LOGFILEPATH]» только один раз. Я мог бы извлечь его отдельно для этой линии. Но мне нужна дата, которая будет показана отдельно, а остальные строки останутся прежними. Есть ли способ использовать два отдельных предложения where в select? Я попробовал, но я не смог создать запрос. Благодарю. – Pranav247

+0

Удерживайте секунду, когда вы сказали, что хотите сохранить дату, вы имели в виду строки TIMESTAMP, правильно? Если это так, я допустил ошибку. Обновление ответа. –

 Смежные вопросы

  • Нет связанных вопросов^_^