lunes, 4 de abril de 2011

LogParser 2.2

Como tengo que estudiar el uso que hacen los usuarios de mi aplicación creo que ha llegado el momento de utilizar el log de IIS, y lo cierto es que abrirlo con el notepad y ponerme a puntear todos las entradas se me antoja un poco inviable.

Aunque hay disponibles herramientas de análisis de log de IIS con interfaz gráfica, me gusta especialmente LogParser que permite importar el log de IIS en una base de datos de SQL y después ya somos nosotros mismos quienes a través de consultas SQL tenemos que explotar los datos.

LogParser 2.2 se puede descargar desde http://www.iis.net/community/default.aspx?tabid=34&g=6&i=1976 y también desde
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en

Un buen artículo que habla sobre el programa lo puedes encontrar en http://technet.microsoft.com/en-us/library/bb878032.aspx

Otros enlaces de interés que muestran el uso del programa, http://www.msexchange.org/tutorials/Using-Logparser-Utility-Analyze-ExchangeIIS-Logs.html y http://labloguera.net/blogs/gcarreras/archive/2009/04/30/an-lisis-de-logs-de-iis-utilizando-log-parser.aspx

Lo primero que haremos será ejecutar LogParser.exe con el siguiente comando que nos devolverá el esquema del log de tipo IISW3C que podemos obtener.

LogParser -h -i:IISW3C

En este listado:

  • S es String
  • T es Time
  • I es Integer
  • R es Real

LogFilename (S)

LogRow (I)

date (T)

time (T)

c-ip (S)

cs-username (S)

s-sitename (S)

s-computername (S)

s-ip (S)

s-port (I)

cs-method (S)

cs-uri-stem (S)

cs-uri-query (S)

sc-status (I)

sc-substatus (I)

sc-win32-status (I)

sc-bytes (I)

cs-bytes (I)

time-taken (I)

cs-version (S)

cs-host (S)

cs(User-Agent) (S)

cs(Cookie) (S)

cs(Referer) (S)

s-event (S)

s-process-type (S)

s-user-time (R)

s-kernel-time (R)

s-page-faults (I)

s-total-procs (I)

s-active-procs (I)

s-stopped-procs (I)

 

 

De este modo, crearemos una tabla en nuestro servidor a partir de la información anterior para albergar los datos que queremos importar.

CREATE TABLE [dbo].[IISW3C](

            [LogFileName] [nvarchar](500) NULL,

            [LogRow] [int] NULL,

            [Date] [datetime] NULL,

            [Time] [datetime] NULL,

            [ClientIPAddress] [nvarchar](500) NULL,

            [UserName] [nvarchar](500) NULL,

            [ServiceName] [nvarchar](500) NULL,

            [ServerName] [nvarchar](500) NULL,

            [ServerIPAddress] [nvarchar](500) NULL,

            [ServerPort] [int] NULL,

            [Method] [nvarchar](500) NULL,

            [URIStem] [nvarchar](500) NULL,

            [URIQuery] [nvarchar](500) NULL,

            [HTTPStatus] [int] NULL,

            [HTTPSubstatus] [int] NULL,

            [Win32Status] [int] NULL,

            [BytesSent] [int] NULL,

            [BytesRecivied] [int] NULL,

            [TimeTaken] [int] NULL,

            [ProtocolVersion] [nvarchar](500) NULL,

            [Host] [nvarchar](500) NULL,

            [UserAgent] [nvarchar](500) NULL,

            [Cookie] [nvarchar](500) NULL,

            [Referrer] [nvarchar](500) NULL,

            [s-event] [nvarchar](500) NULL,

            [s-process-type] [nvarchar](500) NULL,

            [s-user-time] [real] NULL,

            [s-kernel-time] [real] NULL,

            [s-page-faults] [int] NULL,

            [s-total-procs] [int] NULL,

            [s-active-procs] [int] NULL,

            [s-stopped-procs] [int] NULL

) ON [PRIMARY]

 

Ahora que ya sabemos el formato de log y tenemos una tabla donde guardar los registros, sólo queda ejecutar el comando preciso para importar los datos en nuestra tabla.

LogParser "SELECT * INTO IISW3C FROM C:\WINDOWS\system32\LogFiles\W3SVC1\ex*.log"
/o:SQL -server:NombreServidor
/driver:"SQL Server"
/database:NombreBaseDatos
/username:NombreUsuario
/password:Password
/iCheckpoint:MyChekPoint.lpc
/i:IISW3C

·         "SELECT * INTO IISW3C FROM
C:\WINDOWS\system32\LogFiles\W3SVC1\ex*.log"
es una consulta que devuelve todos los registros del log del tipo IISW3C para el IIS consultado.

·         /o:SQL –server:NombreServidor /driver:”SQL Server” /database:NombreBaseDatos /username:NombreUsuario y /password:Password son argumentos para la cadena de conexión que utilizará LogParser.

·         /iCheckpoint:MiFichero.lpc es importantísimo, porque permite que sucesivas llamadas a este mismo comando sólo importen los nuevos registros. De hecho, después de esta primera llamada veremos cómo se crea este fichero en el directorio de LogParser (por el tamaño de este fichero no te preocupes, porque ocupa poco).

·         /i:IISW3C especifica el formato de log a importar.

Después de esto, ya podremos poner en juego todo nuestro conocimiento de Sql para consultar nuestra tabla con todos los registros de log.

Sí no queremos importar todo el log de nuestro IIS y queremos filtrar a algún directorio o aplicación en particular, la única solución que he encontrado es agregar una WHERE a la consulta de selección. Por ejemplo:

SELECT * INTO IISW3C FROM C:\WINDOWS\system32\LogFiles\W3SVC1\ex*.log WHERE cs-uri-stem LIKE ‘%%/MiAplicación/%%’

Es interesante ver que hay que poner 2 porcentajes en vez de 1, porque sino LogParser interpreta una variable de reemplazo en vez de un literal porcentaje. Puedes ver más información en http://forums.iis.net/t/1145741.aspx

Si te sirve como referencia, hace poco tiré este script en un servidor en producción y los resultados fueron estos:

image

Es decir, casi 10 millones de filas importadas en 1 hora y media, y la base de datos creció hasta los 3 GB el fichero .mdf y 10 GB el fichero .ldf. Sin embargo, el directorio C:\WINDOWS\system32\LogFiles\W3SVC1 sólo ocupada 1 GB. Está claro que IIS necesita menos espacios para guardar los registros que SQL.

Un saludo!.

2 comentarios:

  1. Por cierto, la ruta donde normalmente están los logs de IIS es C:\WINDOWS\system32\LogFiles\W3SVC1

    ResponderEliminar
    Respuestas
    1. También se pueden encontrar los ficheros de log en C:\inetpub\logs\LogFiles\W3SVC2. En realidad, lo más seguro es ir a la consola de administración de IIS y ver donde guarda los ficheros porque depende de la versión de IIS los dejará en un lugar o en otro.

      Eliminar