[ Nickix9001 @ 02.09.2013. 22:40 ] @
Ovo je tutorijal: kako mikrotik logove centralizovati na jednom syslog serveru.

CLS tj. centralizovani logging sistem je veoma bitan mreznim administratorima. Kao dugogodisnji clan ovog foruma zelim da vam "poklonim" skriptu za laksi pregled svih logova. Ova skripta je radjena u PHP-u i sluzi za pregled logova svih mikrotikova u mrezi.

Potrebno je (ja koristim:)):
Linux Ubuntu 12.10 - i na njemu podignut webserver. Na mojoj masini je trenutno RADIUS, webserver, FTP server, Mail server.
Mikrotik RouterOS.

Prvo je potrebno instalirati syslog-ng paket sto mozete uraditi komandom:
Code:
sudo apt-get install syslog-ng

Ukoliko vam izbaci gresku "Unable to locate..." proverite da li vam je sve stiklirano u Dash/Software Sources i uradite komandu:
Code:
sudo apt-get update

pa onda
Code:
sudo apt-get install syslog-ng

nakon sto je instaliran paket syslog-ng morate da ga konfigurisete kako bi primao logove od vasih mikrotikova.
Prvo konfigurisite fajl /etc/syslog-ng/syslog-ng.conf. Na kraju svih source-eva dodajte:
Code:
source s_net { udp (); };

Dalje na dole docice te odeljaka Destination, Filter, i log. Dodajte ove linije:
Code:
filter f_mikrotik { host( "10.12.12.*" ); };
destination df_mikrotik{ file("/var/log/mikrotik.log"); };
log { source ( s_net ); filter( f_mikrotik ); destination ( df_mikrotik ); };

Vidite u filteru da sam stavio host 10.12.12.*, to je zato jer su ip adrese mojih mikrotikova iz opsega 10.12.12.0/24. Zavisno od vasih ip adresa stavite 192.168.*.* za opseg 192.168.0.0/16 ili koje su vam vec ip adrese.
Destination je fajl u kome ce se upisivati logovi.

U fajlu /etc/logrotate.d/syslog-ng za pisanje i upisite:
Code:
/var/log/mikrotik.log {
   rotate 7
   weekly
   missingok
   notifempty
   compress
}

Na kraju nam ostaje jos da restartujemo syslog-ng komandom:
Code:
sudo /etc/init.d/syslog-ng restart

Time smo zavrsili podesavanje log servera. Ostaje nam da nastelujemo mikrotikove.
Code:
/system logging action
set remote  name=remote remote=(vasa ip adresa syslog servera) remote-port=514 src-address=0.0.0.0
/system logging 
add action=remote disabled=no prefix="" topics=info
add action=remote disabled=no prefix="" topics=error
add action=remote disabled=no prefix="" topics=critical
add action=remote disabled=no prefix="" topics=warning

Ovime smo sve standardne logove koji se vide u mikrotikovom logu poslali na nas syslog server. Ovu akciju ponovite na svim mikrotikovima koji trebaju da salju svoj log syslog serveru.

Da proverite da li sve radi na vasem syslog serveru(Ubuntu) ukucajte komandu:
Code:
tail -f /var/log/mikrotik.log

i videcete logove u realnom vremenu.

Ovo je ono osnovno sto vam treba a sada sledi moj "dodatak".
Napravio sam PHP skriptu koja ce procitati fajl mikrotik.log, ili kako god vam se zove log fajl, i ispisati u pretrazivacu i nastaviti da ispisuje logove kako se prave, kao tail komanda. Meni se syslog server nalazi na webserveru tako da mogu preko interneta bilo kada da vidim logove u realnom vremenu.

Fajl koji otvarate u pretrazivacu je mikrotik.php. Evo njegovog koda:
Code:

<?php
include 'logging.php';
header('Content-Type: text/html; charset=utf-8');
echo "<!DOCTYPE html >
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<meta http-equiv='Content-Type' content='text/html' charset=utf-8' />
<title>Logovi mikrotikova</title>
<link href='izgled3.css' rel='stylesheet' type='text/css' />
<script type='text/javascript' src='jquery/jquery.js'></script>
<script type='text/javascript'>
lastSize = 0;
documentHeight = 0;
scrollPosition = 0; 

scroll = true;
function loadLog(){
$.ajax({
url: 'read_log.php',
dataType: 'json',
async: false,
data: {lastsize : lastSize}}).
success(function(data) {
lastSize = data.size;
$.each(data.data, function(key, value) {
$('#wrapper').append('<div id="logovi">' + value + '</div><br/>');
});
if(scroll) {
scrollToBottom()}
});

function scrollToBottom() {
    $('html, body').scrollTop($(document).height());
                        
    }
$(document).ready(function(){
    
    $(window).scroll(function(){
    documentHeight = $(document).height(); 
    scrollPosition = $(window).height() + $(window).scrollTop(); 
    if(documentHeight <= scrollPosition) {
            scroll = true;
    }
    else {
            scroll = false; 
    }
    });
    
    
    setInterval (loadLog, 2500);    //Reload file every 2.5 seconds
    });
    </script>
</head><body>
<div class='head'>
<div class='mikrotikovi'>
<div class='boja ".$l['1']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['1']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['2']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['2']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['3']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['3']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['4']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['4']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['5']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['5']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['6']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['6']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['7']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['7']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['8']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['8']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['9']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['9']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['10']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['10']['name']."</div>
</div>
<div class='mikrotikovi'>
<div class='boja ".$l['11']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['11']['name']."</div>
</div>
//Odavde sve treba da kopirate ako dodajete jos neki mikrotik
<div class='mikrotikovi'>
<div class='boja ".$l['12']['boja']."Poz'></div>
<div class='crta'>|</div>
<div class='ipadresa'>".$l['12']['name']."</div>
</div>
//Do ovde
</div>

<div id='wrapper' class='wrapper'>";
//^^U wrapper-u se upisuju logovi. 

echo "</div></body></html>";
?>

Evo i css koda za izgled3.css
Code:

@charset "utf-8";
/* CSS Document */
.head {
position:fixed;
height: 50px;
width:100%;
top:0px;
left:0px;
margin:0;
padding:0;
background:#eeeeec;
}
.wrapper{
margin-top:30px;
padding:0;
}
#logovi{
margin:0;
padding:0;

width:100%;
}
.mikrotikovi {
float:left;
display:block;
text-align:center;
margin:0;
padding:0;
height:30px;
width:60px;
}
.boja{
padding:0;
margin:0;
height:10px;
}
.crta{
height:10px;
margin:0;
padding:0;
}
.ipadresa{
height:30px;
margin-top:8px;
padding:0;
}
/*Boje ip adresa*/
.plava{
color:#336699;
}
.plavaPoz{
background:#336699;
}
.oranz{
color:#FF6600;
}    
.oranzPoz{
background:#FF6600;
}
.oranz2{
color:#ffa366;
}
.oranz2Poz{
background:#ffa366;
}
.zuta{
color:#FFCC00;
}
.zutaPoz{
background:#FFCC00
}
.plava1{
color:#003366;
}
.plava1Poz{
background:#003366;
}
.roza1{
color:#ff6760;
}
.roza1Poz{
background:#ff6760;
}
.roza2{
color:#cc0066;
}
.roza2Poz{
background:#cc0066;
}
.bez{
color:#ab9a61;
}
.bezPoz{
background:#ab9a61;
}
.bez2{
color:#999933;
}
.bez2Poz{
background:#999933;
}
.braon{
color:#993300;
}
.braonPoz{
background:#993300;
}
.ljubicasta{
color:#634673;
}
.ljubicastaPoz{
background:#634673;
}
.zelena2{
color:#4f9b7a;
}
.zelena2Poz{
background:#4f9b7a;
}
.zelena{
color:green;
}
.crvena{
color:red;
}
.crna{
color: black;
}
/*Kraj boja*/
.datum{
float:left;
margin:0;
padding:0;
}
.ip{
float:left;
margin-left:2px;
padding:0;
}
.log{
float:left;
margin-left:2px;
padding:0;
}

Ovo je fajl koji radi sav posao, zove se read_log.php:
Code:
<?php
include 'logging.php';
function splitString($oldString){
include 'logging.php';
$today = date("j");
if ($today >=1 && $today <=9) $strLen = 15; else $strLen = 16;
$datum = substr($oldString, 0 , $strLen);
$drugiDeo = substr($oldString, $strLen);
$niz = explode(" ",$drugiDeo, 2);
$ip = $niz[0];
if(!isset($niz[1])) $niz[1]='<hr>';
$log = $niz[1];
$error = strpos($log, "error");
if($error != false){
$class = $l['boja']['error'];
$a = "<div class='datum $class'>".$datum."</div>";
$b = "<div class='ip $class'><b>".$ip."</b></div>";
$c = "<div class='log $class'>".$log."</div>";
}
else{
$a = colorizeString($datum,'datum');
$b = colorizeString($ip,'ip');
$c = colorizeString($log,'log');
}
$newString = $a."<b>".$b."</b>".$c;
return $newString;
}
function colorizeString($str,$case){
    include 'logging.php';
    if ($case == 'ip'){
    switch ($str){
        //Boje ip adresa
        case $l['ip']['1']: $class = $l['1']['boja'];
            break;
        case $l['ip']['2']: $class = $l['2']['boja'];
            break;
        case $l['ip']['3']: $class = $l['3']['boja'];
            break;
        case $l['ip']['4']: $class = $l['4']['boja'];
            break;
        case $l['ip']['5']: $class = $l['5']['boja'];
            break;
        case $l['ip']['6']: $class = $l['6']['boja'];
            break;
        case $l['ip']['7']: $class = $l['7']['boja'];
            break;
        case $l['ip']['8']: $class = $l['8']['boja'];
            break;
        case $l['ip']['9']: $class = $l['9']['boja'];
            break;
        case $l['ip']['10']: $class = $l['10']['boja'];
            break;
        case $l['ip']['11']: $class = $l['11']['boja'];
            break;
        case $l['ip']['12']: $class = $l['12']['boja'];
            break;
        default: $class = $l['boja']['log'];
    }
    }
    else {
    switch($case){
        case 'datum': $class = $l['boja']['datum'];
            break;
        case 'log': $class = $l['boja']['log'];
            break;
    }
    }
    $noviString = "<div class='$case $class'>".$str."</div>";
    return $noviString;
}
//END OF FUNCTIONS
$logfile = $l['fajl']['logfajl'];

//MAIN FUNCTION
$lastFetchedSize = $_GET['lastsize'];
clearstatcache();
$fsize = filesize($logfile);
$maxLength = ($fsize - $lastFetchedSize);
$data = array();
        if($maxLength > 0) {
            
            $fp = fopen($logfile, 'r');
            fseek($fp, -$maxLength , SEEK_END); 
            $data = explode("\n", fread($fp, $maxLength));
            fclose($fp);
        }
foreach ($data as &$logs){
    $logs = splitString($logs);
}
echo json_encode(array("size" => $fsize, "data" => $data));
?>

I na kraju ovo je fajl u kome podesavate imena vasih mikrotikova i njihovih ip adresa.
fajl logging.php
Code:
<?php
//************************************************
//*                Log konfiguracija                 *
//*            Podesi boje, ip adrese, nazive       *
//*                     Autor: Rodja                 *  
//*                  Verzija: 0.0.1                 *
//************************************************
$l['fajl']['logfajl'] = '/var/log/mikrotik.log';
$l['boja']['error'] = 'crvena';
$l['boja']['log'] = 'crna';
$l['boja']['datum'] = 'zelena';
//*************************
$l['ip']['1'] = '10.12.12.1'; // ip adresa mikrotika
$l['1']['name'] = 'Tik-0';    // Skraceni naziv mikrotika
$l['1']['boja'] = 'plava';    // ime klase iz CSS fajla, mozete dodati drugu boju ali morate imati i klasu u css fajlu!
//************************
$l['ip']['2'] = '10.12.12.2';
$l['2']['name'] = 'Tik-1';
$l['2']['boja'] = 'oranz';
$l['ip']['3'] = '10.12.12.3';
$l['3']['name'] = 'Tik-2';
$l['3']['boja'] = 'zuta';
$l['ip']['4'] = '10.12.12.4';
$l['4']['name'] = 'Tik-3';
$l['4']['boja'] = 'plava1';
$l['ip']['5'] = '10.12.12.5';
$l['5']['name'] = 'Tik-4';
$l['5']['boja'] = 'roza1';
$l['ip']['6'] = '10.12.12.6';
$l['6']['name'] = 'Tik-5';
$l['6']['boja'] = 'bez';
$l['ip']['7'] = '10.12.12.7';
$l['7']['name'] = 'Tik-6';
$l['7']['boja'] = 'ljubicasta';
$l['ip']['8'] = '10.12.12.8';
$l['8']['name'] = 'Tik-7';
$l['8']['boja'] = 'roza2';
$l['ip']['9'] = '10.12.12.9';
$l['9']['name'] = 'Tik-8';
$l['9']['boja'] = 'zelena2';
$l['ip']['10'] = '10.12.12.10';
$l['10']['name'] = 'Tik-9';
$l['10']['boja'] = 'oranz2';
$l['ip']['11'] = '10.12.12.12';
$l['11']['name'] = 'Tik-10';
$l['11']['boja'] = 'bez2';
//Odavde
$l['ip']['12'] = '10.12.12.12';
$l['12']['name'] = 'Tik-11';
$l['12']['boja'] = 'braon';
//Do ovde

?>

Ovo je skripta za 12 mikrotikova. Ukoliko imate manje nije nikakav problem. Podesite koliko vama treba. Ukoliko imate vise od 12 morate 3 fajla promeniti.
Prvo dodajte u fajlu logging.php prekopirajte obelezeno komentarima samo ne zaboravite da promenite brojeve npr. u komentaru je br 12 ako kopirate taj deo onda promenite 12 u 13,14,...,105... zavisi koliko mikrotikova imate. Za svaki mikrotik potrebna su vam po ta tri reda koda.
Ukoliko dodajete novu boju ne zaboravite da dodate u css fajlu klasu .nazivBoje i klasu .nazivBojePoz za pozadinu legende.
U fajlu mikrotik.php imate komentar sta trebate iskopirati i dodati ispod komentara a iznad poslednjeg </div>-a. Ne zaboravite da promenite brojeve $l promenljive da odgovaraju brojevima iz logging.php fajla.
U fajlu read_log.php dodajte 'case' izraze za vase nove mikrotikove. Ukoliko ih ne dodate nije velika greska samo ce vam ip adresa biti ispisana crno a ne u boji.

Evo kako to sve izgleda:



Sta je jos potrebno da znate?
Ova skripta prvo procita ceo log (zavisno od log-a moze trajati i do 1min.) i ispise ga a zatim kako mikrotik izbaca logove tako ih ispisuje. Ako vam je skrol da dnu strane onda ce se strana sama skrolovati, ukoliko nije, znaci da neki log gledate, nece se sama skrolovati. Kada ponovo skrolujete na dno strane pocece automatski da se skroluje.

Ovo je bila moja sveta duznost da podelim sa vama, kao dugogodisnji clan ovog foruma.

[ Aleksandar Đokić @ 02.09.2013. 22:58 ] @
Svidja mi se. Mozes da dodas i neke evente, npr. ako se u logu pojavi "nesto" da se posalje mejl itd.
[ Nickix9001 @ 02.09.2013. 23:00 ] @
Dodao sam samo ako izbaci error da ta cela linija bude crvene boje(datum,ip,log).
Videcemo, ipak je ovo verzija 0.0.1 hahahaha.
[ yolja624 @ 03.09.2013. 17:44 ] @
Ovo je za svaku pohvalu! Bravo!
[ zivanicd @ 03.09.2013. 20:59 ] @
... Mi imamo 52 Mikrotika. Vec logujemo kao ti u remote syslog :)

Dopada mi se ovaj php, probacu da vidim kako reaguje na velike log fajlove...

Ako ne, morace logrotate da radi daily :)
[ Nickix9001 @ 03.09.2013. 21:59 ] @
@zivanicd
Wow. Pa prvo ces se malo nacekati dok ocita a posle ce izbacati odmah. A mozes da promenis da u mikrotik.php da kada dodeljuje lastSize promeljnivu umesto = 0 da stavis =".<?php echo filesize($l['fajl']['logfajl'])?>." i tada ce raditi kao tail -f.