Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 2.988 pregleda

Najnovija ↓

emuliranje tail komande 17.11.2010. u 10:28 · pre 194 meseca #1
Oni koji imaju iskustva sa linux administracijom znaju za tail komandu.
-f modifikator je posebno koristan za pracenje log fajlova jer vam ispisuje u konzolu sve nove logove, onako kako se log fajl puni u realnom vremenu.
Ima li neko ideju kako da se tako nesto emulira iz PHP-a?
Potpis
Beneath civilization's fragile crust, cold chaos churns...
Re: emuliranje tail komande 17.11.2010. u 10:34 · pre 194 meseca
izmenjeno 1 put, poslednji put kazil 17.11.2010. u 10:44
  1. kazil17.11.2010. u 10:44zapis iz teksta poruke
#2
Za sta ti treba? Tj. sta zelis da radis sa tim emuliranim tail-om? :)

edit:

Sad sam se setio da sam jednom pravio logovanje top komande (flegovi su za FreeBSD). Kako se top po defaultu updateuje u realnom vremenu, sa -d 1 sam dobio ispis jedne "strane", u trenutku kad se pozove (-d je isto kao -n kod gnu/linuxa).

Code:

function logTop(){
    $logFile = "/home/robert/mysql.log";
    $topOutput = null;
    $i = 0;
    while($topOutput === null or $i < 10) {
        $topOutput = shell_exec('top -d 1 -U mysql');
        $i++;
    }

    if($topOutput !== null) {
        $topOutputHeader = "top log datetime: " . date('Y-m-d H:i:s') . "\n";
        $topOutput = $topOutputHeader . $topOutput . "\n====================================\n";
        file_put_contents($logFile, $topOutput, FILE_APPEND);
    }
}


Funkciju sam pozivao na odredjenim mestima u kodu (pocetak, kraj, nakon n iteracija petlje, itd.).

Mozda ti ovo da neku ideju =)
Re: emuliranje tail komande 17.11.2010. u 11:07 · pre 194 meseca #3
Treba mi tacno ovako
- tail -f jednog log fajla.
- parsiranje svakog novog unosa, ali u realnom vremenu (zato mi treba -f)
- ubacivanje tog izparsiranog sadrzaja u bazu.

Nesto sam kontao sad ovako..
- beskonacna petlja
- prva iteracija otvorim fajl, pokazivac na kraj fajla, zapamtim poziciju i to je to
- sljedeca iteracija, odem na zapamcenu poziciju, iscitam sve do kraja, parsiranje obrada smjestanje u bazu, pokazivac na kraj, zapamtim poziciju;
- svaka nova iteracija ovo iznad
Potpis
Beneath civilization's fragile crust, cold chaos churns...
Re: emuliranje tail komande 17.11.2010. u 11:18 · pre 194 meseca #4
Pa drugo resenje bas ni ja ne vidim... Jedino sto -f neces bas moci da koristis :) A bez -f moze cak i da upali posto je po defaultu izmedju updatea sa -f 1 sekunda. Jedino obrati paznju ako dodje do rotiranja logova, da ti ne pobrljavi nesto :)

A je l' mozes da prepravis to sto loguje, da loguje odmah u bazu, ne u file?
Re: emuliranje tail komande 17.11.2010. u 11:41 · pre 194 meseca #5
Mozda sacuvati u array svaku liniju fajla za zatim uporediti sa starijim sa array_diff().

Kako ces pokretat skriptu - iz konzole ili ...?
Re: emuliranje tail komande 17.11.2010. u 11:47 · pre 194 meseca #6
Ne mogu da prepravim, to je neki sistemski log fajl i zakucan je tu gdje jeste.
Skripta ce se pokretati iz konzole.
Potpis
Beneath civilization's fragile crust, cold chaos churns...
Re: emuliranje tail komande 17.11.2010. u 12:01 · pre 194 meseca #7
Pa onda ga roknes u background job preko nohup-a i jedno while(true) i lupaj po fileu :) iskreno, mene jedino brine cimanje baze cirka svake sekunde.

Ako smem da pitam, koja je svrha prebacivanja loga u bazu i to ovakvom frekvencijom?
Re: emuliranje tail komande 17.11.2010. u 12:18 · pre 194 meseca #8
Evo ti tail f-ja koju ja koristim vec 2 godine i koju sam napisao na osnovu par slicnih koje sam nas'o na php.net-u i googlu. Tako da sad joj ti sad dodaj to sto tebi treba :)

Code:


    public function tail($file, $num_to_get = 100)
    {
        //if num_to_get is 0 returns complete file
        if($num_to_get === 0) return file_get_contents($file);

        //Opens a file
        $fp = fopen($file, 'r');

        //Determines size of file
        $position = filesize($file);

        //Takes file pointer to the end of file
        fseek($fp, $position-1);

        //Defines length of blocks we will read
        $chunklen = 4096;

        $data = "";

        mb_internal_encoding("UTF-8");
        mb_regex_encoding('UTF-8');

        //Starts reading the file until position is set to 0 or less than 0
        while($position > 0)
        {
            //Determines if position is less than chunk size that we are reading
            if($position <= $chunklen)
            {
                //Set the chunk size to the $position and set position to 0
                $chunklen = $position;
                $position = 0;
            }
            else
            {
                //Calculates next position from where we will read our file data
                $position = $position - $chunklen;
            }

            //sets file pointer to next position
            fseek($fp, $position);

            //reads data
            $data = fread($fp, $chunklen). $data;

            //test if we have enough lines
            $num_of_new_lines = mb_substr_count($data, "\n");

            if ($num_of_new_lines >= $num_to_get + 1)
            {
                //Finds excess num of new lines
                $temp = $num_of_new_lines - $num_to_get;

                //take only the specified number of lines from our data
                return preg_replace("/^(.*\n){".($temp)."}/", "", $data, 1);
            }
        }

        //closing file
        fclose($fp);

        //returning data if we didn't have enough lines to display
        return $data;
    } 


Potpis
...
Re: emuliranje tail komande 18.11.2010. u 10:00 · pre 194 meseca #9
Sredio sam. Uglavnom :) ima jos par sitnica koje nisu problem.
Kombinacija svega ovdje recenog. Hvala.

@kazil
ovo je potrebno zbog nekog panela koji mora da prikazuje podatke koji se nalaze samo u logovima. A smjestam u bazu jer je tako lakse za kasniju manipulaciju, pregled, koriscenje...
Potpis
Beneath civilization's fragile crust, cold chaos churns...
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme