前段时间我需要解析一堆Serve-U FTP日志文件并将它们存储在数据库中,以便人们可以报告它们。我最终开发了一个小型C#应用程序来执行以下操作:
查找目录中尚未加载到db中的所有文件(存在以前加载的文件的表)。
打开文件并将所有行加载到列表中。
循环遍历该列表并使用RegEx识别行的类型(CONNECT,LOGIN,DISCONNECT,UPLOAD,DOWNLOAD等),将其解析为与行类型对应的特定类型的对象并添加该行obj到另一个列表。
循环遍历每个不同的对象列表,并将每个列表写入关联的数据库表。
记录文件已成功导入。
洗净,冲洗,重复。
这很难看,但是我们已经完成了截止日期的工作。
问题是我处于DBA角色,我不满意运行已编译的应用程序作为此问题的解决方案。我更喜欢更开放,更注重DBA的东西。
我可以在PowerShell中重写它,但我更愿意开发一个SSIS包。第一次在SSIS中找不到基于RegEx分割输入的好方法,我对SSIS不够熟悉。我现在正在深入研究SSIS,但仍然没有找到我需要的东西。
有人对我如何在SSIS中进行重写提出任何建议吗?
答案 0 :(得分:1)
我必须使用Exchange日志执行类似的操作。我还没有找到一个使用全SSIS解决方案的简单解决方案。话虽如此,这就是我所做的:
首先,我使用Microsoft的logparser和sql2005的批量复制功能
我将日志文件复制到我可以使用它们的目录中。
我创建了一个解析日志的sql文件。它看起来与此相似:
SELECT TO_Timestamp(REPLACE_STR(STRCAT(STRCAT(date,' '), time),' GMT',''),'yyyy-M-d h:m:s') as DateTime, [client-ip], [Client-hostname], [Partner-name], [Server-hostname], [server-IP], [Recipient-Address], [Event-ID], [MSGID], [Priority], [Recipient-Report-Status], [total-bytes], [Number-Recipients], TO_Timestamp(REPLACE_STR([Origination-time], ' GMT',''),'yyyy-M-d h:m:s') as [Origination Time], Encryption, [service-Version], [Linked-MSGID], [Message-Subject], [Sender-Address] INTO '%outfile%' FROM '%infile%' WHERE [Event-ID] IN (1027;1028)
然后我使用logparser运行以前的sql:
logparser.exe file:c:\exchange\info\name_of_file_goes_here.sql?infile=c:\exchange\info\logs\*.log+outfile=c:\exchange\info\logs\name_of_file_goes_here.bcp -i:W3C -o:TSV
哪个输出bcp文件。
然后我使用以下命令将该bcp文件批量复制到SQL Server中的预制数据库表中:
bcp databasename.dbo.table in c:\exchange\info\logs\name_of_file_goes_here.bcp -c -t"\t" -T -F 2 -S server\instance -U userid -P password
然后我对表运行查询。如果你能弄清楚如何使用SSIS自动化这个,我很高兴听到你做了什么。