sql server extract_token LogParserを使用してSharePoint使用状況ログファイルをデータベースにエクスポートする




log parser サンプル (4)

より詳細なレポートを希望し、現金とコンピュータのパワーを持っているなら、 Nintex Reportingを見ることができます。 私はそれのデモを見てきましたが、それは非常に徹底していますが、あなたのシステムで継続的に実行する必要があります。 しかし、クールに見えます。

したがって、基本的には、SharePoint 2007サイトによって生成された多くのSharePoint使用状況ログファイルがあり、われわれはそれを理解したいと考えています。 そのためには、ログファイルを読み込み、適切な列とすべてを使ってデータベースにダンプすることを考えています。 今度は、LogParserに出会ったときに、すべてのテキストファイルを読み込んでデータを抽出するためのSSISパッケージを作成しようとしていました。 LogParserを使用してSQL Serverデータベースにデータをダンプする方法、またはSSIS方法が優れている方法はありますか? または、SharePointの使用状況ログを使用する他の方法がありますか?


Answer #1

あなたは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
}

Answer #2

申し訳ありませんが、SharePointログがIISログと同じではないことがわかりました。 それらは違う。 どうすればそれらを解析できますか?


Answer #3

これは私が必要とするすべての情報を得るために使用したブログ投稿です。 カスタムコードの長さに行く必要はありません。

簡単に言うと、テーブルスクリプトを作成します。

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




logparser