Windows Экспорт журнала

  • Автор темы Автор темы LeonID
  • Дата начала Дата начала

LeonID

Новичок
В документации так
Каждая запись CSV файла состоит из следующих одиннадцати полей разделенных
символом «;»:
1. Последовательный номер записи
2. Дата события в формате ДД.ММ.ГГГГ
3. Время события в формате ЧЧ:MM:CC
4. Код события
5. Расшифровка события
6. Битовые признаки
7. Идентификатор лифта
8. Массив сохраненного состояния
9. Номер бита сохраненного состояния
10 Номер таблицы сообщений станции управления лифтом
11 Номер сообщения станции управления лифтом/номер сервисного ключа

ну и далее расписываются все поля
на деле так
Код
Array
(
[0] => 220473
[1] => 13.11.2012
[2] => 11:59:50
[3] => 128
[4] => 22 - Режим погрузки
[5] => 16
[6] => BE74C965DD4949159ADFDA2BE410CE6A
[7] => 00 00 00 00 00 00 00 00 00 03
[8] => 0
[9] => 0
[10] => 65411
[11] => 529
)

Array
(
[0] => 220469
[1] => 13.11.2012
[2] => 11:58:35
[3] => 176
[4] => Кабина стоит между этажами
[5] => 22
[6] => 004C3C2AF5D041C583E324171EE184F7
[7] => 01 00 24 01 00 00 00 00 00 03
[8] => 18
[9] => 0
[10] => 2180
[11] => 431
)


где посмотреть - как правильно?
 
Последнее редактирование модератором:
Леонид написал(а):
В документации так

ну и далее расписываются все поля
на деле так
Код
Array
(
[0] => 220473
[1] => 13.11.2012
[2] => 11:59:50
[3] => 128
[4] => 22 - Режим погрузки
[5] => 16
[6] => BE74C965DD4949159ADFDA2BE410CE6A
[7] => 00 00 00 00 00 00 00 00 00 03
[8] => 0
[9] => 0
[10] => 65411
[11] => 529
)

Array
(
[0] => 220469
[1] => 13.11.2012
[2] => 11:58:35
[3] => 176
[4] => Кабина стоит между этажами
[5] => 22
[6] => 004C3C2AF5D041C583E324171EE184F7
[7] => 01 00 24 01 00 00 00 00 00 03
[8] => 18
[9] => 0
[10] => 2180
[11] => 431
)


где посмотреть - как правильно?

В запись добавлено еще поле N 12 - "сокращенно наименование"
Или непонятно что-то другое ?
 
Андрей Ефименко написал(а):
В запись добавлено еще поле N 12 - "сокращенно наименование"
Или непонятно что-то другое ?

Теперь понятно. Благодарю за поддержку.
У меня два пульта. Логи сбрасываются в одну таблицу MySql.
В предыдущих версиях указывался номер пульта и я сразу знал какой файл (MPultPro.Xml) парсить чтобы дотянуться до лифта. Как теперь?
 
Леонид написал(а):
У меня два пульта. Логи сбрасываются в одну таблицу MySql.
В предыдущих версиях указывался номер пульта и я сразу знал какой файл (MPultPro.Xml) парсить чтобы дотянуться до лифта. Как теперь?

В процессе загрузки CSV в MySql формировать это поле самому, например.
 
Андрей Ефименко написал(а):
В процессе загрузки CSV в MySql формировать это поле самому, например.

согласен.
Еще есть вопросы.
Насколько уникально поле guid? можно ли его использовать в качестве первичного ключа?
Просьба по возможности в следующих выпусках не менять файл экспорта. или заморозить какие-то поля. например с первого по десятое. Приходится переделывать скрипт.
 
Леонид написал(а):
согласен.
Еще есть вопросы.
Насколько уникально поле guid? можно ли его использовать в качестве первичного ключа?
Просьба по возможности в следующих выпусках не менять файл экспорта. или заморозить какие-то поля. например с первого по десятое. Приходится переделывать скрипт.

Если в файл MPultPro.XML не вставлялись лифты вручную, то GUID вообще уникальный.
Проблема может быть с файлом MPultPro.XML второй диспетчерской, если он сделан из файла MPultPro.XML первой диспетчерской.


Сервер LKDSDisp (https://forum.lkds.ru/posts/10028/) ведет журнал уже в Microsoft SQL сервере.
 
Андрей Ефименко написал(а):
Если в файл MPultPro.XML не вставлялись лифты вручную, то GUID вообще уникальный.
Проблема может быть с файлом MPultPro.XML второй диспетчерской, если он сделан из файла MPultPro.XML первой диспетчерской.
Сервер LKDSDisp (https://forum.lkds.ru/posts/10028/) ведет журнал уже в Microsoft SQL сервере.

ссылку посмотрел - сервер от мелкомягких меня не устраивает.
Сервер уже поднят на Debian 6.04 и менять не буду. Далее по списку
База данных MySQL version 5.1.63,
Сервер Apache version 2.2.16
Скрипт PHP Version 5.3.3-7+squeeze14
Фреймворк yii
Железо свое, локальное - спасибо конторе.
Планирую запустить проект в январе 2013 - отпишусь
Стало быть уникальный ключ будет составной
Код
UNIQUE (
`record_id` ,
`lift_id` ,
`pult_id`
),
 
Андрей Ефименко написал(а):
Если в файл MPultPro.XML не вставлялись лифты вручную, то GUID вообще уникальный.
Проблема может быть с файлом MPultPro.XML второй диспетчерской, если он сделан из файла MPultPro.XML первой диспетчерской.
Сервер LKDSDisp (https://forum.lkds.ru/posts/10028/) ведет журнал уже в Microsoft SQL сервере.

Есть еще вопрос. Правильно ли выбрать в качестве источника событий csv файлы журнала экспорта? Есть ли другие источники? Какова их актуальность? Например, я настроил экспорт каждый час, то и актуальность данных будет соответствующая.
 
Леонид написал(а):
Правильно ли выбрать в качестве источника событий csv файлы журнала экспорта? Есть ли другие источники? Какова их актуальность? Например, я настроил экспорт каждый час, то и актуальность данных будет соответствующая.

Кроме CSV файла нет возможности читать события.
 
Как и обещал, даю первичные наработки по версии клиент-сервер. Надеюсь на поддержку.
Исходные данные:
Компьютер под управлением WindowsXP — Диспетчерский пульт №1 с локальным адресом 192.168.1.21,
Компьютер под управлением WindowsXP — Диспетчерский пульт №2 с локальным адресом 192.168.1.22.
На каждой машине имеется папка с общим доступом ”EXPORT”, куда складываются файлы логов, с интервалом в 1 час.
Компьютер под управлением Debian6.04 — сервер с установленными службами, для нас важны такие службы: mysql, samba.
Задача: Импортировать все логи от всех диспетчерских пультов в одну базу данных на сервере.
Для решения:

Монтируем папки общего доступа на сервере, для чего размещаем исполняемый скрипт в файле cat > /mnt/myfiles/lib/import.sh
Код
#! /bin/sh
#===Скрипт: Монтирование каталогов эеспорта на сервер===

SYNC_LOG="/mnt/mylog/import_mpult.log"
# Монтирование файла записи логов
[ -e "$SYNC_LOG" ] || touch $SYNC_LOG

SHARE_S="/mnt/myfiles/smb_import_mpult1"
[ -e "$SHARE_S" ] || mkdir -p $SHARE_S
MOUNT_FLAG=TRUE
if mount -t cifs -o rw,iocharset=utf8,user=,pass= //192.168.1.20/EXPORT $SHARE_S
then
echo $(date +%Y.%m.%d' '%T)' mount success://192.168.1.20/EXPORT->'$SHARE_S >> $SYNC_LOG
echo $(date +%Y.%m.%d' '%T)' BEGIN import files FROM '$SHARE_S >> $SYNC_LOG
else
echo $(date +%Y/%m/%d' '%T)' mount error: '$SHARE_S >> $SYNC_LOG
MOUNT_FLAG=FALSE
fi

SHARE_S="/mnt/myfiles/smb_import_mpult2"
[ -e "$SHARE_S" ] || mkdir -p $SHARE_S

if mount -t cifs -o rw,iocharset=utf8,user=,pass= //192.168.1.21/EXPORT $SHARE_S
then
echo $(date +%Y.%m.%d' '%T)' mount success://192.168.1.21/EXPORT->'$SHARE_S >> $SYNC_LOG
echo $(date +%Y.%m.%d' '%T)' BEGIN import files FROM '$SHARE_S >> $SYNC_LOG
else
echo $(date +%Y/%m/%d' '%T)' mount error: '$SHARE_S >> $SYNC_LOG
MOUNT_FLAG=FALSE
fi
if MOUNT_FLAG
then
/mnt/myfiles/lib/import_new.php >> $SYNC_LOG
fi
# umount -a -t cifs

exit 0

Для целей собственно импорта размещаем скрипт в файле:
cat>/mnt/myfiles/lib/import_new.php следующего содержания:
Код
#!/usr/bin/php
<?php
$db_host='localhost';//
$db_name='mlift';//
$db_user='user';//
$db_pass='8888';//
$tbl_name='mlift';
/* connect server */
$link = mysql_connect($db_host,$db_user,$db_pass) or die("Could not connect : " . mysql_error());
$sql = 'CREATE DATABASE IF NOT EXISTS '.$db_name;
mysql_query($sql) or die("Error creating database: " . mysql_error());
mysql_select_db($db_name) or die("Could not select database");
$sql="(
record_id,
act_date,
act_time,
act_code,
act_name,
mlift_id,
bit_sign,
massiv,
bit_num,
bit_num2,
table_num,
service_num,
pult_id
)
";
//Массив с примонтированными каталогами
$dir = array('1'=>'/mnt/myfiles/smb_import_mpult1/', '2'=>'/mnt/myfiles/smb_import_mpult2/');
foreach ($dir as $key => $value) {
$folder = scandir($value);
$nf = count($folder);/*получим количество файлов в каталоге*/
for ($cf=2; $cf<$nf; $cf++) {/*цикл по каталогу, начиная с 3 файла*/
$file_name = $folder[$cf];/*получим файл по индексу*/
$files = file($value . $file_name);/*полный путь к файлу-читаем содержимое файла и помещает его в массив*/
$vic=TRUE;/*флаг успешной записи файла*/
mysql_query("BEGIN");/*Начнем транзакцию в пределах всех строк файла - или все строки и удаление файла или ничего*/
foreach ($files as $file) {/*разбор массива строк файла*/
$str = iconv("windows-1251", "UTF-8//TRANSLIT", $file);/*Перекодировка содержимого*/
$str = trim($str);/*На всякий случай*/
$mydata = explode(";", $str);/*Разбиваю строку в массив*/
$mydata[1] = "STR_TO_DATE('" . $mydata[1] . "', '%d.%m.%Y')";/*Преобразую дату для вставки в таблицу*/
$mydata[2] = "STR_TO_DATE('" . $mydata[2] . "', '%H:%i:%s')";/*Преобразую время для вставки в таблицу*/
$num2 = count($mydata);/*Количество полей для вставки в таблицу*/
for ($c2=3; $c2<$num2; $c2++) {
$mydata[$c2] = "'" . $mydata[$c2] . "'";/*Обрамляю в апострофы, кроме полей кода,даты,время*/
}
$str = implode(",", $mydata);/*Собираю массив значенией в строку*/
$str .= ", '".$key."'";/*Добавляю номер диспетчерского пульта*/
$str = "(" . $str . ")";/*Обрамляю в скобки строку значений*/
$sql1 = 'INSERT INTO mlift' . $sql;/*Формирую адресную часть запроса*/
$str = $sql1 . ' VALUES' . $str . ';';/*запрос сформирован*/
// echo $str."\r\n";
$result = mysql_query($str);/*результат вставки записи*/
if (mysql_errno() == 1146) {/*вставка записи не удалась так как отсутсвует таблица*/
echo "Попытаемся создать таблицу: mlift" . "\r\n";
$sql3="CREATE TABLE IF NOT EXISTS mlift
(
enum_id int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Код операции',
record_id int NULL DEFAULT NULL COMMENT 'Код записи',
act_date DATE NULL DEFAULT NULL COMMENT 'Дата события',
act_time TIME NULL DEFAULT NULL COMMENT 'Время события',
act_code VARCHAR(100) NULL DEFAULT NULL COMMENT 'Код события',
act_name VARCHAR(100) NULL DEFAULT NULL COMMENT 'Наименование события',
mlift_id INT UNSIGNED NULL DEFAULT '0' COMMENT 'Идентификатор лифта',
bit_sign VARCHAR(50) NULL DEFAULT NULL COMMENT 'Битовые признаки',
massiv VARCHAR(50) NULL DEFAULT NULL COMMENT 'Массив сохраненного состояния',
bit_num VARCHAR(50) NULL DEFAULT NULL COMMENT 'Номер бита сохраненного состояния',
bit_num2 VARCHAR(50) NULL DEFAULT NULL COMMENT 'Неизвестное поле',
table_num VARCHAR(50) NULL DEFAULT NULL COMMENT 'Номер таблицы сообщений станции управления лифтом',
service_num VARCHAR(50) NULL DEFAULT NULL COMMENT 'Номер сообщения станции управления, номер сервисного ключа',
pult_id VARCHAR(10) NULL DEFAULT NULL COMMENT 'Номер пульта',
UNIQUE (`record_id` , `mlift_id` , `pult_id`),
PRIMARY KEY ( `enum_id` )
)
ENGINE = INNODB COMMENT='Журнал событий программно-диспетчерчкого комплекса Обь';"
;
$result = mysql_query($sql3);/*Результат создания таблицы*/
if ($result) {
echo 'Таблица: '. $tbl_name1.' создана'."\r\n";
$result = mysql_query($str);/*Результат повторной вставки записи в созданную таблицу*/
}
}/*Метка - Завершена обработка неудачной записи так как отсутсвует таблица*/
if (!$result) {/*Вставка записи завершилась с ошибкой*/
$vic=FALSE;/*Сбросим флаг операции*/
echo mysql_error().'-'.mysql_errno()."\r\n";/*запишем код ошибки*/
break;/*прервем цикл записи файла в таблицу*/
}
}/*Метка - Завершен разбор массива строк файла*/
if ($vic){/*Если флаг операции есть...*/
$trans=mysql_query("COMMIT");/*...подтвердим транзакцию*/
if ($trans) {/*После успешной транзакции...*/
if(unlink($value.$file_name)) {/*...удалим файл из примонтированного каталога...*/
echo 'the file '.$file_name.' has been deleted.'."\r\n";/*...и запишем это приятное событие в лог*/
}
}
}
else {/*Если флаг операции нет,...*/
$trans=mysql_query("ROLLBACK");/*Откатим транзакцию...*/
echo mysql_error().'-'.mysql_errno()."\r\n";/*Запишем в лог код ошибки...*/
}
}/*Метка - Завершен цикл по каталогу, начиная с 3 файла*/
}/*Метка - Завершен цикл по примонтированным каталогам*/

mysql_close($link);/*Сбросим соединение с базой данных*/
?>

делаем запись в таблице заданий crontab -e
5 * * * * /mnt/myfiles/lib/import.sh >> /mnt/mylog/import_mpult.log
чтобы скрипт запускался в пять минут каждого часа
устанавливаем ротацию логов, для чего добавляем в конфигурационный файл logrotate.conf
Код
/mnt/mylog/*.log {
missingok
create 0664 username utmp
}

Смотрим файл логов "/mnt/mylog/import_mpult.log", видим примерно такое
Код

2013.01.22 10:05:01 mount success://192.168.1.20/EXPORT->/mnt/myfiles/smb_import_mpult1
2013.01.22 10:05:01 BEGIN import files FROM /mnt/myfiles/smb_import_mpult1
2013.01.22 10:05:01 mount success://192.168.1.21/EXPORT->/mnt/myfiles/smb_import_mpult2
2013.01.22 10:05:01 BEGIN import files FROM /mnt/myfiles/smb_import_mpult2
the file P0000001.csv has been deleted.
the file P0000001.csv has been deleted.

Смотрим базу данных(phpmyadmin), наслаждаемся результатом и пытаемся ответить на вопрос: а нафига все это и что с этим делать?
А Делать еще много чего надо, чтобы вся эта беда была полезной и удобной. Интересная мысль использовать LibreOffice для генерации отчетов. Я пока работаю над веб-интерфейсом, ибо поставлена задача иметь доступ через интернет
У меня скрипт работает с 30 ноября 2012 года. Количество записей уже более одного миллиона, размер базы данных более 200 метров. Пора писать скрипт, чтобы раскидывать записи по таблицам, например 1 месяц — одна таблица.
Размещение файлов пока рабочее, также надо решать проблемы безопасности и шифрования.
Однозначно надо работать с кодом,так как напрашивается класс.
Есть желание разместить проект на git.
Пишите
 
Последнее редактирование модератором:
Леонид написал(а):
Смотрим базу данных(phpmyadmin), наслаждаемся результатом и пытаемся ответить на вопрос: а нафига все это и что с этим делать?
Действительно....
Что потом делать с этими массивами? какие отчеты? Распечатку журнала с отбором по событию?
Но это можно и с диспетчерских компов сделать, иногда, при необходимости, для анализа какой то конкретной ситуации в конкретный период. С двух компов и удаленно -с помощью любой программы удаленного рабочего стола. Распечатать в файл и забрать бинарник. Затем его распечатать на локальном принтере. В чем прикол собирания в один массив в данном случае?
Реальная необходимость, кроме печати журнала, это анализ этих данных. Вот где есть поле деятельности!
Напр. просчет простоев лифтов. Вот тут уже необходимы массивы и программы с "интелектуальными возможностями" т.к слишком много критериев. Вы не думали о таком применении?
 
revit написал(а):
Действительно....
Что потом делать с этими массивами? какие отчеты? Распечатку журнала с отбором по событию?
Но это можно и с диспетчерских компов сделать, иногда, при необходимости, для анализа какой то конкретной ситуации в конкретный период. С двух компов и удаленно -с помощью любой программы удаленного рабочего стола. Распечатать в файл и забрать бинарник. Затем его распечатать на локальном принтере. В чем прикол собирания в один массив в данном случае?
Реальная необходимость, кроме печати журнала, это анализ этих данных. Вот где есть поле деятельности!
Напр. просчет простоев лифтов. Вот тут уже необходимы массивы и программы с "интелектуальными возможностями" т.к слишком много критериев. Вы не думали о таком применении?
Действительно, не стоит дублировать возможности, которые уже реализованы. И вполне может оказаться так, что эта ветка для сообщества окажется малоэффективная или даже тупиковая - собирать массив на одну машину. О плюсах и минусах можно спорить до хрипоты. Анализ данных - это сладенький пирожок, к которому еще предстоит подбираться. Агрегатные запросы уже опробованы и решаются с приличной производительностью. Руководитель хочет видеть результат у себя на компе немедленно и в читаемом виде, а не лазить по диспетчерским. Доступ из интернета - наверное лучше к серверу, чем к диспетчерским. Ну и затрат особо не надо - шуршит сервер на линуксе и денег не просит, складирует логи.
 
Последнее редактирование модератором:
Леонид написал(а):
Как и обещал, даю первичные наработки по версии клиент-сервер. Надеюсь на поддержку.
Исходные данные:
Компьютер под управлением WindowsXP — Диспетчерский пульт №1 с локальным адресом 192.168.1.21,
Компьютер под управлением WindowsXP — Диспетчерский пульт №2 с локальным адресом 192.168.1.22.
На каждой машине имеется папка с общим доступом ”EXPORT”, куда складываются файлы логов, с интервалом в 1 час.
Компьютер под управлением Debian6.04 — сервер с установленными службами, для нас важны такие службы: mysql, samba.
Задача: Импортировать все логи от всех диспетчерских пультов в одну базу данных на сервере.
База данных сервера LKDSDisp доступна и может быть использована для анализа работы оборудования точно так же как и журналы программы MPult, причем в базе данных храниться не только журнал, но и вся структура с историей.

Ну а проблема, как уже отмечалось, в правильном анализе этих данных.
 
Последнее редактирование модератором:
Назад
Сверху