Создание БД из логов???
Добавлено: 2009-03-10 23:24:39
Кто поможет, нужно создать БД и файла логов построчно с разделителем "пробел" ... можно ли такое сделать и как?
Зарание спасибо за ответ!
Зарание спасибо за ответ!
Часто, когда ты думаешь, что выбираешь между "сделать хорошо" и "сделать плохо", ты лишь влияешь на момент, когда это будет "сделано через жопу".
https://forum.lissyara.su/
Код: Выделить всё
Дата Имя Фамилия Отчество Телефон ОтКудаЗаходил КогдаЗаходил .... и т.д
а поподробнее можно пожалуйста?ev писал(а):сделать можно - банально скриптом инсерт
Мишаня писал(а):Есть файл с логами не важно какой, например:и вот это записать в некую БД с полями разделенными пробелами построчно ...Код: Выделить всё
Дата Имя Фамилия Отчество Телефон ОтКудаЗаходил КогдаЗаходил .... и т.д
просто потом хочу с помошью PHP осушествлять поиск по определенным параметрам по этой БД в WEB интерфейсе ...
Код: Выделить всё
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...]
причём скрипт можно будет засунуть в крон чтобы он автоматически парсил логи и забивал в базуev писал(а):если на пхп, то все относительно просто
1. читаем файл (построчно)
2. дальше делаем explode (чтобы разбить строку)
3. ну и делаем инсерт в базу с полученными данными
Код: Выделить всё
1987 Misha Pypkin 2556677
Код: Выделить всё
1988 Anton Sidorov 2449908
1989 Sasha Rostov 2324345
Код: Выделить всё
LOAD DATA INFILE "/usr/home/user/users" INTO TABLE users fields terminated by ' ' lines terminated by '\n';
Код: Выделить всё
#!/usr/local/bin/perl
use Mysql;
$dbh = Mysql->connect(undef,"users","anonymous","");
$filepath = "/usr/home/user/users.txt";
opendir (DIR, "$filepath");
@userfiles = sort readdir (DIR);
closedir(DIR);
foreach $file (@userfiles)
{
open(USER,"$filepath/$file");
@userdata = <USER>;
chomp ($_) foreach (@userdata);
close (USER);
$inserth = $dbh->query("INSERT INTO users(year,name,sname,phone) VALUES ('$userdata[0]','$userdata[1]','$userdata[2]','$userdata[3]')");
$num++;
}
print "'$userdata[0]' \n";
$counth = $dbh->query("SELECT ID FROM users");
$count = $counth->numrows;
print "В таблице $count пользователей, $num из которых только что было добавленно. \n\n";
ну во-первых не надо логи в базе хранить, мускул этого не любит, а во-вторых не использовать пробел в качестве разделителя -)Мишаня писал(а):Подскажите пожалуйста что может быть не так?
только прибавь к этому ещёev писал(а):если на пхп, то все относительно просто
1. читаем файл (построчно)
2. дальше делаем explode (чтобы разбить строку)
3. ну и делаем инсерт в базу с полученными данными
1) file();Hazzard писал(а):причём скрипт можно будет засунуть в крон чтобы он автоматически парсил логи и забивал в базуev писал(а):если на пхп, то все относительно просто
1. читаем файл (построчно)
2. дальше делаем explode (чтобы разбить строку)
3. ну и делаем инсерт в базу с полученными данными
Код: Выделить всё
#!/usr/bin/perl
use DBI;
$db_type = 'mysql';
$db_host = ''localhost;
$db_name = '';
$db_user = '';
$db_pass = '';
$dbh = DBI->connect("DBI:$db_type:database=$db_name;host=$db_host", $db_user, $db_pass, {RaiseError => 1, PrintError => 1 } ) || die $DBI::errstr;
$filepath = "/usr/home/user/users.txt";
opendir (DIR, "$filepath");
@userfiles = sort readdir (DIR);
closedir(DIR);
foreach $file (@userfiles)
{
open(USER,"$filepath/$file");
@userdata = <USER>;
chomp ($_) foreach (@userdata);
close (USER);
$dbh = do(
qq{ INSERT INTO users(year,name,sname,phone)
VALUES (?,?,?,?)
}, undef, $userdata[0], $userdata[1], $userdata[2],$userdata[3] );
$num++;
}
print "'$userdata[0]' \n";
$counth = $dbh->selectrow_arrayref(qq{SELECT COUNT(*) FROM users }, undef );
print "В таблице $counth->[0] пользователей, $num из которых только что было добавленно. \n\n";
Код: Выделить всё
#!/usr/bin/perl
use DBI;
use Fcntl ':flock';
my $log = '/var/log/maillog';
open LOG, '<', $log or die "Can't open $log: $!\n";
flock(LOG,LOCK_EX);
my $pos = 0;
$pos = do {chomp; $_} while <DATA>;
seek LOG, $pos, 0 if $pos <= -s $log;
$dbh = DBI->connect("DBI:mysql:host=localhost;database=db","login","pass")
or die "Нет доступа к СУБД!";
$insert = "INSERT INTO maillog (data,text) VALUES(?,?)";
$sth = $dbh->prepare("$insert");
while ($line = <LOG>)
{
my ($month, $day, $time, $hostname, $servicename) = split / /, $line, 5;
$timedata="$month $day $time";
$text = "$hostname $servicename";
$sth->execute($timedata,$text);
}
$sth->finish;
$dbh->disconnect;
$pos = tell LOG;
flock(LOG,LOCK_UN);
close LOG;
exec qw(perl -0777 -i -pe), 's/$/\n'.$pos.'/', $0;
__DATA__
0
Мишаня писал(а):ну а если у меня логи пробелами разделены? что тогда?
логи имеют первосходное свойство - они прекрасно хранятся в файлахzg писал(а):не надо логи в базе хранить
Мне нужно выборку и поиск осудкствлятьzg писал(а):Мишаня писал(а):ну а если у меня логи пробелами разделены? что тогда?логи имеют первосходное свойство - они прекрасно хранятся в файлахzg писал(а):не надо логи в базе хранить
grepМне нужно выборку и поиск осудкствлять
греп или авк будут в данном случае делать выборку в сотни раз эффективней, хотя бы потому, что данные хранятся в разных файлах, а не в одном как в мускуле. То есть выборка будет идти по целевым данным, а не всем подряд.Мишаня писал(а):Мне нужно выборку и поиск осудкствлять
Да, вот именно поэтому я и хочу сделать потом веб интерфейс с поиском который будет заменять grep для обычного пользователя, что бы не давать ему определенных привилегий ...zg писал(а):греп или авк будут в данном случае делать выборку в сотни раз эффективней, хотя бы потому, что данные хранятся в разных файлах, а не в одном как в мускуле. То есть выборка будет идти по целевым данным, а не всем подряд.Мишаня писал(а):Мне нужно выборку и поиск осудкствлять
а что мешает парсить вывод грепа? конечно не так удобно как с мускулем, но в принципе тоже ничего сложного. В моей статистике так и сделано, никто не жаловался. К слову, логи за месяц весят пять-шесть гиг.Мишаня писал(а):который будет заменять grep для обычного пользователя
Перемести поле id в конец таблицы. Или воще его убей.Мишаня писал(а):1) Так как поиск идет по пробелу первая запись записывается в поле id, что совсем не нужно; (Исправляется установкой пробела в исходном файле в начале строки, но мне это не подходит т.к. логи все начинаются с символа);