sql server - que - Exportación de archivos de registro de uso de SharePoint a una base de datos usando LogParser
powerapps caracteristicas (5)
Básicamente, tenemos muchos archivos de registro de uso de SharePoint generados por nuestro sitio de SharePoint 2007 y nos gustaría darles un sentido. Para eso estamos pensando en leer los archivos de registro y volcar en una base de datos con las columnas apropiadas y todo. Ahora iba a hacer un paquete de SSIS para leer todos los archivos de texto y extraer los datos cuando me encontré con LogParser. ¿Hay alguna forma de utilizar LogParser para volcar datos en una base de datos de Servidor Sql o la forma de SSIS es mejor? ¿O hay alguna otra forma mejor de usar los registros de uso de SharePoint?
Deberá escribir un plugin para logparser. Aquí esta lo que hice:
[Guid("1CC338B9-4F5F-4bf2-86AE-55C865CF7159")] public class SPUsageLogParserPlugin : ILogParserInputContext { private FileStream stream = null; private BinaryReader br = null; private object[] currentEntry = null;
public SPUsageLogParserPlugin() { }
#region LogParser
protected const int GENERAL_HEADER_LENGTH = 300;
protected const int ENTRY_HEADER_LENGTH = 50;
protected string[] columns = {"TimeStamp",
"SiteGUID",
"SiteUrl",
"WebUrl",
"Document",
"User",
"QueryString",
"Referral",
"UserAgent",
"Command"};
protected string ReadString(BinaryReader br)
{
StringBuilder buffer = new StringBuilder();
char c = br.ReadChar();
while (c != 0) {
buffer.Append(c);
c = br.ReadChar();
}
return buffer.ToString();
}
#endregion
#region ILogParserInputContext Members
enum FieldType
{
Integer = 1,
Real = 2,
String = 3,
Timestamp = 4
}
public void OpenInput(string from)
{
stream = File.OpenRead(from);
br = new BinaryReader(stream);
br.ReadBytes(GENERAL_HEADER_LENGTH);
}
public int GetFieldCount()
{
return columns.Length;
}
public string GetFieldName(int index)
{
return columns[index];
}
public int GetFieldType(int index)
{
if (index == 0) {
// TimeStamp
return (int)FieldType.Timestamp;
} else {
// Other fields
return (int)FieldType.String;
}
}
public bool ReadRecord()
{
if (stream.Position < stream.Length) {
br.ReadBytes(ENTRY_HEADER_LENGTH); // Entry Header
string webappguid = ReadString(br);
DateTime timestamp = DateTime.ParseExact(ReadString(br), "HH:mm:ss", null);
string siteUrl = ReadString(br);
string webUrl = ReadString(br);
string document = ReadString(br);
string user = ReadString(br);
string query = ReadString(br);
string referral = ReadString(br);
string userAgent = ReadString(br);
string guid = ReadString(br);
string command = ReadString(br);
currentEntry = new object[] { timestamp, webappguid, siteUrl, webUrl, document, user, query, referral, userAgent, command };
return true;
} else {
currentEntry = new object[] { };
return false;
}
}
public object GetValue(int index)
{
return currentEntry[index];
}
public void CloseInput(bool abort)
{
br.Close();
stream.Dispose();
stream = null;
br = null;
}
#endregion
}
Esta es la secuencia de comandos que utilizamos para cargar los archivos de registro de IIS en una base de datos de SQL Server:
LogParser "SELECT * INTO <TABLENAME> FROM <LogFileName>" -o:SQL -server:<servername> -database:<databasename> -driver:"SQL Server" -username:sa -password:xxxxx -createTable:ON
El <tablename>, <logfilename>, <servername>, <databasename>
y sa password deben cambiarse de acuerdo con sus especificaciones.
Desde mi experiencia, LogParser funciona muy bien para cargar datos de los registros de IIS a SQL Server, por lo que un enfoque mixto es el mejor:
- Cargue datos sin procesar desde el registro de IIS a SQL Server utilizando LogParser
- Use SSIS para extraer y manipular datos de la tabla temporal que contiene los datos brutos en la tabla final que usará para generar informes.
Lamento haber descubierto que los registros de Sharepoint no son lo mismo que los registros de IIS. Ellos son diferentes. ¿Cómo podemos analizarlos?
Si desea informes más detallados y tener el efectivo y la potencia de la computadora, puede consultar los informes de Nintex . He visto una demostración de esto y es muy completo, sin embargo, debe ejecutarse continuamente en su sistema. Se ve genial sin embargo.
Esta es la publicación del blog que utilicé para obtener toda la información necesaria. No es necesario ir a la longitud del código personalizado.
En resumen, crea una secuencia de comandos de tabla:
CREATE TABLE [dbo].[STSlog](
[application] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[date] [datetime] NULL,
[time] [datetime] NULL,
[username] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[computername] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[method] [varchar](16) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[siteURL] [varchar](2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[webURL] [varchar](2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[docName] [varchar](2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[bytes] [int] NULL,
[queryString] [varchar](2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[userAgent] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[referer] [varchar](2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[bitFlags] [smallint] NULL,
[status] [smallint] NULL,
[siteGuid] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
Llamar para que la carga del analizador de registro en los datos de un archivo
"C:/projects/STSLogParser/STSLogParser.exe" 2005-01-01 "c:/projects/STSlog/2005-01-01/00.log" c:/projects/logparsertmp/stslog.csv
"C:/Program Files/Log Parser 2.2/logparser.exe" "SELECT ''SharePointPortal'' as application, TO_DATE(TO_UTCTIME(TO_TIMESTAMP(TO_TIMESTAMP(date, ''yyyy-MM-dd''), TO_TIMESTAMP(time, ''hh:mm:ss'')))) AS date, TO_TIME( TO_UTCTIME( TO_TIMESTAMP(TO_TIMESTAMP(date, ''yyyy-MM-dd''), TO_TIMESTAMP(time, ''hh:mm:ss'')))), UserName as username, ''SERVERNAME'' as computername, ''GET'' as method, SiteURL as siteURL, WebURL as webURL, DocName as docName, cBytes as bytes, QueryString as queryString, UserAgent as userAgent, RefURL as referer, TO_INT(bitFlags) as bitFlags, TO_INT(HttpStatus) as status, TO_STRING(SiteGuid) as siteGuid INTO STSlog FROM c:/projects/logparsertmp/stslog.csv WHERE (username IS NOT NULL) AND (TO_LOWERCASE(username) NOT IN (domain/serviceaccount))" -i:CSV -headerRow:ON -o:SQL -server:localhost -database:SharePoint_SA_IN -clearTable:ON