locked
Aide requete log iis avec log parser RRS feed

  • Question

  • Bonjour à tous,

    Je souhaite analyser l'activité  de plusieurs serveurs web dans le temps.

    Pour cela je cherche à réaliser une requête qui me compile le top10  des pages les plus lente indépendamment du serveur web et ceux tous les jours (1 top 10 par jour).

    J'ai réalisé cette requête simple, mais cela ne m'affiche que le top 10 indépendamment du jour et limité à 10 :

    SELECT TOP 10
        To_String(To_timestamp(date, time), 'MM-dd') As Day,
        s-computername as Server,
        cs-uri-stem as URL,
        count(cs-uri-stem) as Count, 
        MAX(DIV(time-taken,1000)) As Max,  
        MIN(DIV(time-taken,1000)) As Min(sec),  
        Avg(DIV(time-taken,1000)) As Average(sec)  
        FROM '[LOGFILEPATH]' 
    GROUP BY DAY,Server, URL
    ORDER BY Average(sec)  DESC

    en fait il faut que j'arrive à compiler  j'ai 10 enregistrement fois le nombre de jour  de logs.

    Pensez-vous que cela soit faisable ? Peut être quelques pistes ? Thx

    Pour info j'utilise logparser avec logparser studio.

    Merci à tous.

    mardi 6 août 2013 10:32

Réponses

  • Bonjour Stéphane ...

    Pour moi,le plus simple serait de passer par un SQL Server (tu en as ...) dans lequel tu mets ces données "brutes". Ensuite, tu peux appeler MIN, MAX et AVG  au travers de la fonction OVER (PARTITION BY DAY, Server, URL ORDER BY [Average(sec)]).

    Si tu ajoutes un chanmp row_number avec la même fenetre de données, et en limitant ton rid < 10, ca devrait le faire ...

    SELECT Day, Server, URL, Count, Max, Min(sec), Average(sec)
    FROM
     ( SELECT
       Day,
       Server,
       URL,
       count(cs-uri-stem) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)])as Count,
       MAX(time-taken) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)]) As Max, 
       MIN(time-taken) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)])As Min(sec), 
       Avg(time-taken) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)])As Average(sec),
          ROW_NUMBER() OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)]) as RID     
       FROM
      ( SELECT To_String(To_timestamp(date, time), 'MM-dd') As Day,
        s-computername as Server,
        cs-uri-stem as URL,
        cs-uri-stem),
        time-taken / 1000 as time-taken
        FROM '[LOGFILEPATH]'
      )
     )
    WHERE RID <= 10

    Je te laisse corriger les noms de fonction spour que ce soit du SQL et non pas du LogParser ...


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    mercredi 7 août 2013 16:02

Toutes les réponses

  • Bonjour Stéphane ...

    Pour moi,le plus simple serait de passer par un SQL Server (tu en as ...) dans lequel tu mets ces données "brutes". Ensuite, tu peux appeler MIN, MAX et AVG  au travers de la fonction OVER (PARTITION BY DAY, Server, URL ORDER BY [Average(sec)]).

    Si tu ajoutes un chanmp row_number avec la même fenetre de données, et en limitant ton rid < 10, ca devrait le faire ...

    SELECT Day, Server, URL, Count, Max, Min(sec), Average(sec)
    FROM
     ( SELECT
       Day,
       Server,
       URL,
       count(cs-uri-stem) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)])as Count,
       MAX(time-taken) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)]) As Max, 
       MIN(time-taken) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)])As Min(sec), 
       Avg(time-taken) OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)])As Average(sec),
          ROW_NUMBER() OVER (PARTITION BY DAY,Server, URL ORDER BY [Average(sec)]) as RID     
       FROM
      ( SELECT To_String(To_timestamp(date, time), 'MM-dd') As Day,
        s-computername as Server,
        cs-uri-stem as URL,
        cs-uri-stem),
        time-taken / 1000 as time-taken
        FROM '[LOGFILEPATH]'
      )
     )
    WHERE RID <= 10

    Je te laisse corriger les noms de fonction spour que ce soit du SQL et non pas du LogParser ...


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    mercredi 7 août 2013 16:02
  • Bonjour Christophe !

    Tu vois je fais mes devoir de vacances.

    Merci de ta réponse, je vais voir ça ;) .

    Je fais un retour ASAP

    lundi 12 août 2013 07:07
  • ok

    lundi 12 août 2013 07:09
  • Bonjour à tous,

    Comme convenu me revoici pour un retour(je précise que je suis au niveau en dessous de 0 sur sql server).

    J'ai installé la version SQL express de 2012 pour requêter les logs, je me suis inspiré d'un script PS pour injecter mes 7Go de log IIS vers sql (toujours avec logparser), ça fonctionne mais c'est très long...

    Concernant la requête pour arriver au résultat, j'ai repris les indications de Christophe que j'ai modifié en essayant un peu de comprendre et en utilisant son article http://conseilit.wordpress.com/2011/07/15/denali-ctp3-clause-over-tendue/  (l'aide en ligne ai un peu trop dense pour moi :p ) :

    	SELECT * 
    
    	FROM (
    		SELECT 
    		*,
    		ROW_NUMBER() OVER (PARTITION BY Jour   ORDER BY total_time_cost DESC ) as rid
    
    		FROM
    		(
    
    		SELECT 
    			CONVERT(date, EntryTime , 23) as Jour,
    			ServerName,
    			UriStem as url,
    			AVG(Time_Sec) as moy,
    			Max(Time_Sec) as max,
    			min(Time_Sec) as min,
    			count(UriStem) as Loaded,
    			SUM(Time_sec) as total_time_cost
    
    			--UriQuery as req,
    			--Time_Sec
    		FROM dbo.vue_TimeTaken_sup_5000
    		GROUP BY CONVERT(date, EntryTime , 23) ,ServerName, UriStem
    		
    		) AS first
    	)as second
    	WHERE rid <= 10
    	ORDER BY Jour, total_time_cost DESC
    	;

    C'est certainement pas au top mais ça à l'air de faire le job,

    Pour info je vais faire plusieurs requêtes identique pour avoir le top du max, de la moyenne, et du temps total.

    Merci à tous et particulièrement à  Christophe pour son aide.

    vendredi 23 août 2013 14:31
  • Hello

    Quelques index bien placés devraient améliorer les perfs ....

    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    lundi 26 août 2013 06:40
  • Salut Christophe !

    En fait le nombre de ligne des logs iis est monstrueux, je m'attendais pas à ça. J'ai passé toute la journée à injecter 1 semaine de log pour 1 total de plus de 5M de lignes (il va me falloir 1 mois pour intégrer 1 an de log)... Je trouve ça louche quand même...

    J'ai fait une requete pour quantifier tout ça et supprimer les pages affichés en moins d'une seconde,  pour un total restant d'environ 300K lignes. Car mon pauvre SQL express faisait un peu la tronche ! Bref heureusement que j'y suis allé tranquillement...

    A+


    lundi 26 août 2013 16:56