我有很多需要插入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);
}
}