Учет использования общих принтеров


Не секрет, что после каждого улучшения в электронном документообороте компании, в последней возрастает потребление бумаги. Даже извечные студенты, печатающие за счет работодателя свои бесчисленные рефераты о влиянии интенсивности потока лунного света на износ рельс, вовсе не так уж и много изводят бумаги. Гораздо больше бумаги и тонера расходуется на ритуальные кормления шредеров из-за того, что электронный документооборот позволяет многократно бездумно создавать копию многих версий одного и того же документа.

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

И снова нам на помощь приходит простое и функциональное средство LogParser (ранее примеренное для анализа логов Exhange2007), на этот раз используемое для анализа логов принт-сервера.

Итак, предположим, нам необходимо получить простой csv файл, где будет присутствовать информация за сегодняшний день о том, когда, кто, на каком принтере и сколько страниц распечатал. Да и название отправленного на печать документа лишним не будет.
Для этого к командной строке нам необходимо написать:
1. LogParser.exe — без комментариев
2. file:parsprn.sql — файл, в котором записан необходимый SQL запрос
3. -i:EVT — указатель, что ввод необходимо взять из системного лога принт-сервера
4. -o:CSV — указатель на необходимый формат вывода

Но прежде, чем выполнять команду, неплохо будет создать сам файл запроса parsprn.sql:
select
TimeGenerated AS LogonDate,
EXTRACT_TOKEN(Strings, -6, ‘|’) AS docname, — из за того, что в имени файла могут встречаться символы |, рекомендую использовать именно «обратную» форму записи.
EXTRACT_TOKEN(Strings, -5, ‘|’) AS username,
EXTRACT_TOKEN(Strings, -4, ‘|’) AS prndevice,
EXTRACT_TOKEN(Strings, -2, ‘|’) AS bytesize,
EXTRACT_TOKEN(Strings, -1, ‘|’) AS pgsize
into v:\parsprn.csv
from SYSTEM — указатель, из какого именно системного лога нам необходимо извлечь данные
where
TO_TIMESTAMP(TO_STRING(TimeGenerated, ‘yyyy-MM-dd’),’yyyy-MM-dd’) = TO_TIMESTAMP(TO_STRING(SYSTEM_TIMESTAMP(),’yyyy-MM-dd’),’yyyy-MM-dd’) — на каком-то этапе была выявлена неприятная особенность определения понятия «сегодня», поэтому надежнее сравнивать простые строки
and EventID IN (10)

Отчет для целей архивного хранения мы таким образом получили. А теперь предлагаю начать создавать отчеты, приемлемые для восприятия человеком.
Первым делом, предлагаю не уходить далеко от простейшего отчета в виде csv файла, но вывести в него только события, имевшие место после завершения рабочего дня. Очень, кстати, забавно наблюдать реакцию, утверждающего что месячный отчет для вас он героически готовил вчера аж до 11 вечера, когда этому «герою» задаешь вопрос, как же так получается, если единственную копию он распечатал в 18:23? 🙂
Особенных изменения предыдущий вариант файла SQL запроса не потребует, всего лишь нужно добавить условие отбора:
and TO_TIMESTAMP(TO_STRING(TimeGenerated, ‘h’),’h’) > TO_TIMESTAMP(TO_STRING(’17’),’h’)

Теперь предлагаю наглядно вывести, так сколько же отпечатков суммарно выводится на каждом из принтеров. Данная информация, кстати, может послужить хорошим аргументом в планировании модернизации оборудования. Вовсе не факт, что тому или иному департаменту действительно актуален апгрейд многофункционального устройства, а не установка дополнительного дешевого копира.
Примерная строка запуска будет выглядеть следующим образом:
LogParser file:parsprnpcountd.sql -i:EVT -o:CHART -chartType:barstacked -chartTitle:»printers by pages» -groupSize:1024×1600
parsprnpcountd.sql

Файл же непосредственно SQL запроса, примерно так:
select
EXTRACT_TOKEN(Strings,-4, ‘|’) AS prndevice,
sum(TO_INT(EXTRACT_TOKEN(Strings,-1, ‘|’))) AS pgcount
into v:\pages_per_device.gif
from SYSTEM
where
TO_TIMESTAMP(TO_STRING(TimeGenerated, ‘yyyy-MM-dd’),’yyyy-MM-dd’) = TO_TIMESTAMP(TO_STRING(SYSTEM_TIMESTAMP(),’yyyy-MM-dd’),’yyyy-MM-dd’)
and EventID IN (10)
group by prndevice
order by pgcount desc

На выходе мы получим вполне наглядное представление того, что хотели выяснить:
pages_per_device

Наконец, предлагаю вывести 25 «рекордсменов» по расходу бумаги. Примерная строка запуска запроса будет выглядеть следующим образом:
LogParser file:parsprnpcountopu.sql -i:EVT -o:CHART -chartType:barstacked -chartTitle:»top 25 users by pages» -groupSize:1024×800

Сам же файл запроса parsprnpcountopu.sql будет выглядеть следующим образом:
select
top 25 EXTRACT_TOKEN(Strings,-5, ‘|’) AS username, — соответственно, если из запроса убрать «top 25», мы получим отчет, включающий всех пользователей
sum(TO_INT(EXTRACT_TOKEN(Strings,-1, ‘|’))) AS pgcount
into v:\top_users_by_pages.gif
from SYSTEM
where
TO_TIMESTAMP(TO_STRING(TimeGenerated, ‘yyyy-MM-dd’),’yyyy-MM-dd’) = TO_TIMESTAMP(TO_STRING(SYSTEM_TIMESTAMP(),’yyyy-MM-dd’),’yyyy-MM-dd’)
and EventID IN (10)
group by username
order by pgcount desc

Примерный вид получившегося отчета будет таков:
top_users_by_pages

Ровно аналогичные отчеты можно, разумеется, получить и за другие промежутки времени. Все зависит исключительно от буйности фантазии. Например, запрос распределения количества отпечатков по дням будет выглядеть следующим образом:
select
TO_STRING(TimeGenerated, ‘dd’) as day,
sum(TO_INT(EXTRACT_TOKEN(Strings,-1, ‘|’))) AS pgcount
into v:\pages_per_day_month.gif
from SYSTEM
where
TO_TIMESTAMP(TO_STRING(TimeGenerated, ‘yyyy-MM’),’yyyy-MM’) = TO_TIMESTAMP(TO_STRING(SYSTEM_TIMESTAMP(),’yyyy-MM’),’yyyy-MM’)
and EventID IN (10)
group by day
order by day


Ваш отзыв