Анализатор log

ecspl01t

Новичок
Доброго времени суток!
Вот пишу код, Анализатор log, скорее всего питаюсь его написать...
Начну с того как он должен работать:
1) Есть логи типо L0330003.log (логи кс 1.6), в них хранятся: игроки которые подключаются, время подключения, ip-адрес, STEAM_ID, Имя ну т.д., мне нужно только только то, что я перечислил (time,login,ip,steam) то есть те кто подключились к серверу.
имеет вид:
PHP:
L 03/30/2013 - 19:33:52: "cheburek<45><STEAM_0:0:54344926><>" connected, address "44.55.66.77:41165"
2) Теперь нужно кто использовал RCON, есть не большой нюанс, когда кто-то использует rcon в логах видно только ip-адрес того кто использовал, почему это не большая проблема я дальше опишу..
имеет вид:
PHP:
L 03/30/2013 - 19:34:11: Rcon: "rcon 1560014502 "пароль от rcon" status" from "44.55.66.77:41165"
3) В БД хранятся список STEAM_ID игроков (steam_id), которые могут использовать RCON.
имеет вид:

Вот в чем проблема с вторым пунктом, так как в базе только STEAM_ID, а те кто юзает rcon, в логах видно IP, но тот кто зашел на сервер имеет и IP, и STEAM_ID...
"L 03/30/2013 - 19:33:52: "cheburek<45><STEAM_0:0:54344926><>" connected, address "44.55.66.77:41165""

4) Далее, заключается задача в том, чтобы вытянуть всех connected Players связать их кто использовал RCON сделать проверну с БД там где STEAM_ID и всех кого нету в списке добавить в другую бд.

PHP:
//Читаем лог
$array_rcon=array();
$array_conects=array();

$handle = @fopen("./L0330003.log", "r");
if ($handle) {
	while (($log_line = fgets($handle, 4096)) !== false) {

		$conects_Value = array();
		$rcon_Value = array();
		$rez_con=0;
		$rez_rcon=0;
		//выбираем конекты с лога
		$rez_con = preg_match('!^(.* connect.*)$!m', $log_line, $conects_Value);
		//выбирае Rcon записи
		$rez_rcon = preg_match('!^(.*Rcon.*)$!m', $log_line, $rcon_Value);


		//разбираем строки конектов

		if ($rez_con > 0) {
				$returnValue = preg_match('!^L ([0-9/ -:]*):.*"(.*)<[0-9]{1,4}><(.*)><>.*"([0-9\\\\.]*):.*$!m', $conects_Value[1], $matches);
				$array_connects[] = array(
							"time" => $matches[1],
							"login" => $matches[2],
							"STEAM" => $matches[3],
							"ip" => $matches[4]
							);
		}

		//разбираем строки Ркон
		if ($rez_rcon > 0) {
				$returnValue = preg_match('!^L ([0-9/ -:]*):.* "([a-zA-Z]*)" ([a-z _\*\# 0-9]*)".*"([0-9\\.]*):.*$!m', $rcon_Value[1], $matches);
				$array_rcon[] = array(
							"time" => $matches[1],
							"password" => $matches[2],
							"command" => $matches[3],
							"ip" => $matches[4]
							);
		}
	}
}
echo "<PRE>";
echo var_dump($array_connects,$array_rcon);
echo "</PRE>";

$db_steamID = mysql_query ("SELECT * FROM db_steam_id");$rsteamID = mysql_fetch_array($db_steamID);   //список стим_ИД

do {$array_steam_db[]=$rsteamID['steam_id'];
}while ($rsteamID = mysql_fetch_array($db_steamID));// закинул его в массив но дальше не знаю что делать с ним..
помогите написать 4-й пункт, тупо соображалки нету дальше писать...сижу как пень перед компом и ничего не могу написать...

файл L0330003.log:
PHP:
L 03/30/2013 - 19:33:52: "cheburek<45><STEAM_0:0:54344926><>" connected, address "44.55.66.77:41165"
L 03/30/2013 - 19:34:11: Rcon: "rcon 1560014502 "password" status" from "44.55.66.77:41165"
L 03/30/2013 - 19:35:52: "asdasdasfasf<55><STEAM_0:0:54344935><>" connected, address "111.122.33.11:41165"
L 03/30/2013 - 19:35:11: Rcon: "rcon 1560014502 "password" status" from "111.122.33.11:41165"
L 04/26/2013 - 18:07:54: Rcon: "rcon 409277296 "password" kick #4" from "123.123.123.123:27005"
L 04/29/2013 - 11:46:22: "slavka #altme<2><STEAM_0:1:31881798><>" connected, address "123.123.123.123:27005"
L 04/29/2013 - 11:46:36: Rcon: "rcon 566836387 "password" tuscan" from "123.123.123.123:27005"
задавайте вопросы кто что не понял..
 

sens_f1y

Новичок
самая главная проверка здесь будет по времени я так понял
 

sens_f1y

Новичок
Для началя мне интересно, это работает?

$rsteamID = mysql_fetch_array($db_steamID);

думаю так лучше

while ( $rsteamID [ ] = mysql_fetch_assoc ( $db_steamID ) ) ;
 

sens_f1y

Новичок
в общем берёшь первый элемент из массива $array_rcon и начинаешь
сравнивать с каждым элементом массива $array_connects на соответсвие ip, только с учётом времени
 

sens_f1y

Новичок
L 03/30/2013 - 19:33:52:
L 03/30/2013 - 19:34:11:
L 03/30/2013 - 19:35:52:
L 03/30/2013 - 19:35:11:

Вопрос. Почему здесь в последней строчке 19:35:11 ?
 

ecspl01t

Новичок
это не важно я взял разные строчки с других логов...те что нужны для анализа..
 

sens_f1y

Новичок
после твоего кода
//разбираем строки Ркон
if ($rez_rcon > 0) {
$returnValue = preg_match('!^L ([0-9/ -:]*):.* "([a-zA-Z]*)" ([a-z _\*\# 0-9]*)".*"([0-9\\.]*):.*$!m', $rcon_Value[1], $matches);
$array_rcon[] = array(
"time" => $matches[1],
"password" => $matches[2],
"command" => $matches[3],
"ip" => $matches[4]
);
}
}
}
echo "<PRE>";
echo var_dump($array_connects,$array_rcon);
echo "</PRE>";





я вижу всё так:
................................................................................................................................................................................................................................................................
$db_steamID = mysql_query ( "SELECT * FROM db_steam_id" ) or die ( 'Invalid query: ' . mysql_error ( ) ) ;
while ( $rsteamID [ ] = mysql_fetch_assoc ( $db_steamID ) ) ; //список стим_ИД

foreach ( $array_rcon as $line2 )
{
if ( is_array ( $line2 ) )
{
foreach ( $array_connects as $line1 )
{
if ( is_array ( $line1 ) )
{
if ( $line2 [ 'ip' ] == $line1 [ 'ip' ] && substr ( $line2 ['time'] , 0 , 15 ) == substr ( $line1 ['time'] , 0 , 15 ) )
{
$k= 0; $l = 0 ;
foreach ( $rsteamID as $line3 )
{
if (!$k==1 && !$l==1 )
{
if ( is_array ( $line3 ) )
{
if ( !($line1 [ 'STEAM' ] == $line3 [ 'steam_id' ]) )
{
echo 'нет в безе данных ' . $line1 ['STEAM'];
echo '</br>' ;
$k=1;
// здесь заносишь новый steam_id в новую таблицу
}
else
{
$l = 1 ;
}

}
}
}
}
}
}
}

}
 

ecspl01t

Новичок
sens_f1y
...вот закрыл сессию начел дальше заниматься... большое Вам спасибо, вроде то что нужно!
 

ecspl01t

Новичок
есть нюанс с вашим кодом, выкидывает steam_id когда тот находится самый первый в бд.


как на скринах видно, в базе есть STEAM_0:0:54344926 но в коде все равно пишет что нету его в базе..
 
Сверху