使用Log Parser将IIS日志批量插入SQL Server

时间:2017-01-26 13:14:28

标签: c# sql-server iis logparser

我有很多需要插入SQL Server数据库的IIS日志。经过一些研究后看起来像Log Parser是要走的路,但我很难弄清楚如何自动化这个过程。我们有数百个这样的文件,其中一些文件的大小高达3Gb。

用于插入文件的控制台命令是

"C:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "SELECT * INTO LogTable FROM C:\Logs\ex1234.log" -i:iisw3c -o:SQL -server:ServerName -database:DatabaseName -driver:"SQL Server" -createTable:ON

为了遍历目录和文件,我创建了一个小型控制台应用程序,其中main方法枚举目录,然后将每个文件发送到运行Log Parser的方法:

    static void RunLogParser(string fileName)
    {
        var logParserPath = @"""C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe""";

        var query = $"\"SELECT * INTO LogTable FROM {fileName}\"";            

        var startInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = logParserPath + query + "-i:iisw3c -o:SQL -server:ServerName -database:DatabaseName -driver:\"SQL Server\" -createTable:ON",
            CreateNoWindow = true,
            UseShellExecute=false
        };

        try
        {
            using (var process = Process.Start(startInfo))
            {
                process.WaitForExit();
            }
        }
        catch(Exception ex)
        {
            throw new Exception(ex.Message);
        }

        Console.ReadKey();
    }

当我跑步时,似乎没有任何事情发生。从控制台执行命令大约需要20秒才能插入测试文件,但是当我从代码中运行同样的命令时没有。

我还尝试使用Log Parser作为ProcessStartInfo中的FileName arg,但是当进程执行所有发生的事情时,命令窗口似乎显示Log Parser命令的参数并显示错误消息但是我不能窗口关闭太快,无法读取消息。

编辑:已解决

似乎我有一个错字,这让我很懊恼。我将ProcessStartInfo文件名从LogParser.exe更改为cmd.exe,在select语句后添加了一个空格,并将args更改为文字字符串并双引用了驱动程序参数。

    static void RunLogParser(string fileName)
    {
        var logParserPath = @"""C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe""";

        var query = $"\"SELECT * INTO LogTable FROM {fileName}\"";            

        var startInfo = new ProcessStartInfo
        {
            FileName = logParserPath ,
            Arguments = query + @" -i:iisw3c -o:SQL -server:ServerName -database:DatabaseName -driver:""SQL Server"" -createTable:ON",
            CreateNoWindow = true,
            UseShellExecute=false
        };

        try
        {
            using (var process = Process.Start(startInfo))
            {
                process.WaitForExit();
            }
        }
        catch(Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

0 个答案:

没有答案