2010-03-15 4 views
2

Selon cet article MSDN:analyse IIS journal - comment récupérer referer informations

W3C Extended Log File Format (IIS 6.0)

Il dit cs(Referrer) contient les informations Referer qui peuvent être lues à partir des fichiers journaux IIS.

Je suis en train d'afficher les informations de journal à l'aide d'un contrôle ASP.NET répéteur:

<asp:Repeater ID="rptlIISLogEntries" runat="server"> 
... 
... 
    <ItemTemplate> 
     <tr> 
      <td><%# Eval("time")%></td> 
      <td><%# Eval("cs(Referrer)")%></td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 

La ligne à Eval("cs(Referrer)" déclenche une exception:

DataBinding:'System.Data.DataRowView' does not contain a property with the name 'cs'.

Ma question est, comment puis-je afficher les informations REFERER dans le répéteur?

Le code pour analyser le fichier journal et de se lier au répéteur est comme suit:

string theDate =txtDate.Text; 
     string FILE_NAME = @"\\" +txtMachine.Text + 
      @"\C$\WINNT\System32\LogFiles\" + 
      drpSiteBox.SelectedItem.Text + @"\ex" + theDate + ".log"; 
     FileStream fs = new FileStream(FILE_NAME, FileMode.Open, 
          FileAccess.Read,FileShare.ReadWrite); 
     StreamReader sr = new StreamReader(fs); 
     string strResult = sr.ReadToEnd(); 
     sr.Close(); 
     fs.Close(); 
     sr=null; 
     fs=null; 

     string[] arLogLines = strResult.Split(Convert.ToChar("\n")); 
     dt = new DataTable("log"); 
     string revisedColmNames=arLogLines[3].Replace("#Fields: ",""); 
     string[] arColm=revisedColmNames.Split(Convert.ToChar(" ")); 
for(int j=0;j<arColm.Length;j++) 
{ 
    dt.Columns.Add(arColm[j]); 
    Debug.WriteLine(arColm[j]); 
} 
for (i =arLogLines.Length-1; i>3;i--) 
{ 
    // need this because some logs get additional data appended 
    // aren't unhandled exceptions great? The CLR just loves 'em... 
    try 
    { 
     dt.Rows.Add(arLogLines[i].Split(Convert.ToChar(" "))); 
    } 
    catch {} 

} 
DataGrid1.DataSource=dt; 
DataGrid1.DataBind(); 

Note: ceci est le même code que dans http://www.eggheadcafe.com/articles/20021203.asp

+0

Consignez-vous cette information? Comment l'enregistrez-vous, et comment le récupérez-vous? – Oded

+0

J'enregistrer les demandes en cochant la case Activer la journalisation dans la console inetmgr la case à cocher propriétés étendues est également vérifié Pour récupérer J'utilise Filestream pour analyser le fichier journal et puis afficher à l'aide répéteur asp.net – balalakshmi

Répondre

1

Le problème est de faire ici avec le manière que le classeur de données fonctionne sur la table de données et gère les noms de colonne/propriété. Eval utilise la réflexion et les caractères entre parenthèses dans les noms des colonnes provoquent l'échec (j'ai besoin de me souvenir de la façon dont tout cela fonctionne à nouveau, ça fait longtemps).

Juste jeté le Container.DataItem sous-jacente du type qu'il est (un DataRowView), puis choisissez la colonne:

<%# ((System.Data.DataRowView)Container.DataItem)["cs(Referer)"]%> 

Ceci est également plus rapide parce que la réflexion n'est pas utilisé qui est lent.

Aussi, je remarque que vous avez mal orthographié 'Referer' (vous avez deux 'r'), donc faites attention à cela aussi.

Pour que cela fonctionne en utilisant Eval() à la place, vous devez faire un peu plus de travail. Changer ceci:

for(int j=0;j<arColm.Length;j++) 
{ 
    dt.Columns.Add(arColm[j]); 
    Debug.WriteLine(arColm[j]); 
} 

à ceci:

for (int j = 0; j < arColm.Length; j++) 
{ 
    string colName = arColm[j].Replace("(", "_").Replace(")", ""); 
    dt.Columns.Add(colName); 
    Debug.WriteLine(colName); 
} 

Dans l'expression de liant de données Eval changer une colonne avec des parenthèses au nom de:

Eval("cs(Referer)") 

à:

Eval("cs_Referer") 

Mais je g o Avec la première méthode, c'est moins intrusif et beaucoup plus rapide.

+0

Oui, il a essayé en Il a fonctionné dans un environnement local (où j'ai le droit d'installer logparser) mais n'a pas fonctionné dans le serveur de déploiement où je n'ai pas le droit d'installer Logparser. – balalakshmi

+0

@balalakshmi - ah ok, dans ce cas, vous devez nous montrer votre script qui ouvre un lit les fichiers journaux et comment vous liez ces données au contrôle Repeater. – Kev

+0

Kev: J'ai mis à jour la question avec le code – balalakshmi

Questions connexes