3

所以基本上我们有很多由我们的 SharePoint 2007 站点生成的 SharePoint 使用日志文件,我们希望了解它们。为此,我们正在考虑读取日志文件并将其转储到具有适当列和所有列的数据库中。现在我打算制作一个 SSIS 包来读取所有文本文件并在遇到 LogParser 时提取数据。有没有办法使用 LogParser 将数据转储到 Sql Server 数据库或 SSIS 方式更好?或者还有其他更好的方法来使用 SharePoint 使用日志吗?

4

5 回答 5

2

您必须为 logparser 编写一个插件。这是我所做的:

[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
}
于 2008-10-08T11:58:54.847 回答
2

这是我用来获取所有所需信息的博客文章。没有必要去定制代码的长度。

简而言之,创建表脚本:

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]

调用以使日志解析器加载文件的数据

"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
于 2008-10-21T02:19:53.250 回答
2

这是我们用来在 SQL Server 数据库中加载 IIS 日志文件的脚本:

LogParser "SELECT * INTO <TABLENAME> FROM <LogFileName>" -o:SQL -server:<servername> -database:<databasename> -driver:"SQL Server" -username:sa -password:xxxxx -createTable:ON

<tablename>, <logfilename>, <servername>, <databasename>sa 密码需要根据您的规格进行更改。

根据我的经验,LogParser 非常适合将数据从 IIS 日志加载到 SQL Server,因此最好采用混合方法:

  • 使用 LogParser 将原始数据从 IIS 日志加载到 SQL Server
  • 使用 SSIS 从包含您将用于报告的最终表中的原始数据的临时表中提取和操作数据。
于 2008-10-08T08:05:08.690 回答
2

如果您想要更深入的报告并拥有现金和计算机能力,您可以查看Nintex 报告。我看过它的演示,它非常全面,但是它需要在您的系统上持续运行。不过看起来很酷。

于 2008-10-16T08:05:14.007 回答
1

抱歉,我发现 Sharepoint 日志与 IIS 日志不同。它们不一样。我们如何解析它们?

于 2008-10-08T08:27:53.963 回答