本篇文章是Integration Services系列的第十一篇,详细内容请参考原文


简介
在前一篇,我们讨论了事件行为。我们分享了操纵事件冒泡默认行为的方法,介绍了父子模式。
在这一篇,我们会配置SSIS内置日志记录。我们会演示简单和高级日志配置,保存和查看日志配置,生成自定义日志消息。
SSIS任务事件
打开Precedence.dtsx包。你的控制流面板应该如图11.1所示:

图11.1
在第九篇和第十篇,我们关注在序列容器1.我们在Script Task 4和序列容器1上创建了OnError事件处理程序——我们描述为事件"监听器"。在第十篇,我们为Precedence.dtsx包添加一个OnError事件处理程序扩展了这个模式。对于每一个OnError事件处理程序,我们添加一个脚本任务来显示包含下面SSIS变量的消息对话框:
->System::ErrorCode
->System::ErrorDescription
->System::SourceName
在我们开始测试前,让我们验证和/或修改之前的Precedence.dtsx包的某些设置。首先,点击Precedence.dtsx包控制流的空白区并按F4显示属性。修改DisableEventHandlers属性为False,如图11.2所示:

图11.2
在我们做更多修改前,通过按F5在BIDS调试器下执行Precedence.dtsx包。对于"Succeed Script Task 2?"的选择不会影响演示的目的,但是现在以及这篇文章剩余部分我们会选择"是"按钮(图11.3)引起 Script Task 2成功。

图11.3
当提示"Succeed Script Task 4?"时,选择否按钮从Script Task 4引起一个错误事件:

图11.4
当Script Task 4产生一个错误事件,在第九篇中配置的OnError事件处理程序监听错误事件,然后执行,显示类似图11.5所示的消息对话框:

图11.5
但是错误事件并不会在这里停止,它会继续向上层冒泡,将执行结果传送到下一级:序列容器1,它包含Script Task 4.我们可以从序列容器1配置的OnError事件处理程序上看到类似图11.6的消息对话框:

图11.6
同样,错误继续冒泡到下一级:Precedence.dtsx,它包含序列容器1.我们可以从Precedence包配置的OnError事件处理程序上看到类似图11.7的消息对话框:

图11.7
一旦我们接受这个消息对话框,另一个显示Script Task 3完成的对话框会出现。接受Script Task 3的消息,让Precedence.dtsx包完成执行,最终如图10.8所示:

图10.8
事件监听者
SSIS中的任务、容器以及SSIS包对象被当作可执行文件。可执行文件产生/引起事件。SSIS事件处理程序监听并响应由任务和容器引起的事件。
SSIS事件以消息形式在可执行文件中传送。这些消息按照规则传送。其中一条规则是:消息从低级传送到高级。
SSIS日志也是监听者。
配置SSIS日志记录
为了配置SSIS日志记录,点击SSIS,在下拉菜单上选择日志记录,如图11.9所示:

图11.9
配置SSIS日志窗口显示如图11.10所示:

图11.10
可用的日志提供程序类型有:
->用于Windows事件日志的SSIS日志提供程序
->用于文本文件的SSIS日志提供程序
->用于XML文件的SSIS日志提供程序
->用于SQL Server的SSIS日志提供程序
->用于SQL Server Profiler的SSIS日志提供程序
选择文本文件提供程序,如图11.11所示:

图11.11
一旦选择"用于文本文件的SSIS日志提供程序",点击添加按钮为Precedence.dtsx包添加一个文件文件日志,如图11.12所示:

图11.12
在配置SSIS日志窗口底部有一条重要的提示。它告诉我们接下来需要做什么,如图11.13所示:

图11.13
正如图11.13显示的消息说明,下一步是在容器树视图中选择复选框启用日志记录。为Precedence包启用SSIS日志记录功能,如图11.14所示:

图11.14
现在我们可以配置日志本身了。第一件我们要做的是为包(在容器树视图选择的)分配日志。我们通过日志前的复选框分配日志,如图11.15所示:

图11.15
一旦日志复制框勾选,就可以编辑名称和说明属性。配置属性是必须的。点击配置列的下拉菜单,选择"新建连接…",如图11.16所示:

图11.16
连接管理器会创建一个新的文件连接管理器,并打开文件连接管理器编辑器,如图11.17所示:

图11.17
这个文件连接管理器用于配置文本文件日志的文件。在使用类型下拉列表选择"创建文件"。日志文件并不是每次SSIS包执行都会创建,只有当它不存在时才会创建。如果日志文件存在,日志数据会追加到后面。
当选择文件窗口出现,导航到My_First_SSIS_Project解决方案文件夹并创建一个名为"log"的新文件夹,如图11.18所示:

图11.18
打开新文件夹,键入文件名称MyLog.csv,如图11.19所示:

图11.19
点击"打开"按钮完成文件配置,如图11.20所示:

图11.20
点击确定按钮完成文件连接管理器配置。你的连接管理器页签应该如图11.21所示:

图11.21
我们已经为Precedence.dtsx包配置了一个文本文件日志。在BIDS调试器下执行包,然后用记录本打开MyLog.csv
记住,SSIS日志是能够监听事件的监听者。默认,日志监听者监听PackageStart和PackageEnd事件,如图11.22所示:

图11.22
添加事件
点击SSIS,在下拉菜单选择日志记录。当打开配置SSIS日志窗口,点击详细信息页签。这个列表看起来很熟悉。它就是我们在第九篇遇到的事件列表(图9.16)。如果你记得的话,所有的可执行文件引发事件。监听者——SSIS事件处理程序和SSIS日志记录,访问SSIS包中可执行文件收集的事件。如果我们往SSIS控制流添加不同的任务,我们就会在这个列表及事件处理程序列表看到额外的事件。
选择OnError和OnInformation事件,如图11.23所示:

图11.23
在BIDS调试器下执行Precedence.dtsx,Script Task 2成功,Script Task 4失败。打开MyLog.csv查看内容,如图11.24所示:

图11.24
跟随在最初PackageEnd事件之后的第一个条目是PackageStart事件,证明了日志文件不存在时创建,存在时追加。接下来三行是OnError事件。这里我们看到另一个事件冒泡现象,第一条OnError事件记录由Script Task 4引发,接着是序列容器1的OnError事件,然后是Precedence.dtsx包的OnError事件。最后事件记录是另一个PackageEnd事件。
高级日志配置
打开Precedence.dtsx包的配置日志窗口,点击详细信息页签。在详细信息页签的底部有三个按钮:高级、加载和保存,如图11.25所示:

图11.25
点击高级按钮显示SSIS日志记录信息/领域。图11.26显示了我们之前选择的OnError和OnInformation事件的所有信息/领域。

图11.26
让我们做些修改。去掉OnError和OnInformation事件的ExecutionID列。去掉OnError事件的DataBytes列,OnInformation事件的SourceID列。你的日志记录配置高级页面应该如图11.27所示:

图11.27
在我们离开高级页面前,点击保存按钮。当显示另存为对话框时,在文件名文本框中键入MyLogConfig,如图11.28所示:

图11.28
点击保存按钮将日志记录高级配置存储到XML文件中。为了演示它如何工作,清除日志记录高级配置如图11.29所示:

图11.29
点击加载按钮。当显示打开对话框,选择MyLogConfig文件并点击打开按钮,如图11.30所示:

图11.30
注意日志记录高级配置恢复为选择保存时的样子(图11.26)。You can use this functionality to encourage developers in an enterprise to collect similar logging fields from SSIS’ built-in logging.
点击确定按钮关闭配置SSIS日志窗口。
Raising Custom Events On-Demand, Part 1
SSIS自动产生的日志记录消息非常少。但是你可以手动增加被日志监听的事件,也就是生成自定义日志消息。
为了演示,打开Script Task 3的编辑器点击编辑脚本按钮。Public Sub Main()中的代码应该类似于代码11.1:

    Public Sub Main()
Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString
MsgBox(sTaskName & " completed.")
Dts.TaskResult = ScriptResults.Success
End Sub

代码11.1
用代码11.2编辑代码:

    Public Sub Main()
Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString
Dim sMsg As String = sTaskName & " completed." Dts.Events.FireInformation(, sTaskName, sMsg, "", , True)
MsgBox(sMsg) Dts.TaskResult = ScriptResults.Success
End Sub

代码11.2
首先,我们添加一个名为sMsg字符串类型的变量,并将它的值分配为sTaskName & " completed.然后,我们添加代码手动引发一个Information事件:Dts.Events.FireInformation(101,sTaskName,sMsg,"",0,True)。Dts.Events对象能够引发很多不同类型的事件,包括我们当前日志配置在监听的Error和Information事件。FireInformation有六个参数:informationCode (Integer),subComponent(String),description(String),helpFile(String),helpContext (Integer),and fireAgain(Boolean).InformationCode用于分组信息。我使用子组件来识别/区分任务事件。Description是我们想要记录的信息。HelpFile和helpContext用于链接到帮助主题。我从来不配置这些主题,因此我也不知道它们如何/是否工作。目前我所知道的是,FireAgain已被弃用——我把它设置为默认值True.脚本中的最后一处修改是用sMsg变量代替MsgBox语句。
关闭ssisscript编辑器,点击确定按钮关闭脚本任务编辑器。在BIDS调试器下执行Precedence.dtsx包,Script Task 2成功,Script Task 4失败。接受Script Task 3的完成消息框。
打开日志文件检查最新的消息记录,如图11.31所示:

图11.31
注意OnInformation事件也会冒泡,从Script Task 3到序列容器1,然后到Precedence.dtsx包。Script Task 3的OnInformation事件日志条目的完整文本如下:
OnInformation,WORK,WORK\Administrator,Script Task 3,,,2015/10/16 12:20:20,2015/10/16 12:20:20,101,0x,Script Task 3 completed.
Raising Custom Events On-Demand, Part 2
如果我们检查日志文件中的所有Error消息,我们看到类似下面的消息:
OnError,WORK,WORK\Administrator,Script Task 4,{223ec2c7-6a62-4faf-8069-48202668655c},,2015/10/16 12:20:18,2015/10/16 12:20:18,-1001,0x,Script Task 4 failed!
和Information事件相似,我们可以增加自定义Error事件。为了演示,打开Script Task 4的编辑器并点击编辑脚本按钮。我们看到这个操作已经在Script Task 4的Public Sub Main()代码中,如代码11.3所示:

    Public Sub Main()

        Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString

        Dim iResponse As Integer
iResponse = MsgBox("Succeed " & sTaskName & "?", _
MsgBoxStyle.YesNo + MsgBoxStyle.Question, _
sTaskName & " Success Question")
If iResponse = vbYes Then
Dts.TaskResult = ScriptResults.Success
Else
'Dts.TaskResult = ScriptResults.Failure
Dts.Events.FireError(-, "Script Task 4", _
"Script Task 4 failed!", "", )
End If End Sub

代码11.3
日志文件中的OnError消息就是由代码11.3中的Dts.Events.FireError方法产生的。
总结
在这一篇,我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息。

第十一篇 Integration Services:日志记录的更多相关文章

  1. 【译】第十一篇 Integration Services:日志记录

    本篇文章是Integration Services系列的第十一篇,详细内容请参考原文. 简介在前一篇,我们讨论了事件行为.我们分享了操纵事件冒泡默认行为的方法,介绍了父子模式.在这一篇,我们会配置SS ...

  2. 第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  3. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  4. 第十三篇 Integration Services:SSIS变量

    本篇文章是Integration Services系列的第十三篇,详细内容请参考原文. 简介在前一篇我们结合了之前所学的冒泡.日志记录.父子模式创建一个自定义的SSIS包日志记录模式.在这一篇,我们将 ...

  5. 【译】第十三篇 Integration Services:SSIS变量

    本篇文章是Integration Services系列的第十三篇,详细内容请参考原文. 简介在前一篇我们结合了之前所学的冒泡.日志记录.父子模式创建一个自定义的SSIS包日志记录模式.在这一篇,我们将 ...

  6. 第五篇 Integration Services:增量加载-Deleting Rows

    本篇文章是Integration Services系列的第五篇,详细内容请参考原文. 在上一篇你学习了如何将更新从源传送到目标.你同样学习了使用基于集合的更新优化这项功能.回顾增量加载记住,在SSIS ...

  7. 第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  8. 第三篇 Integration Services:增量加载-Adding Rows

    本篇文章是Integration Services系列的第三篇,详细内容请参考原文. 增量加载是什么增量加载仅加载与先前加载差异的.差异包括:->新增的行->更新的行->删除的行通过 ...

  9. 【译】第五篇 Integration Services:增量加载-Deleting Rows

    本篇文章是Integration Services系列的第五篇,详细内容请参考原文. 在上一篇你学习了如何将更新从源传送到目标.你同样学习了使用基于集合的更新优化这项功能.回顾增量加载记住,在SSIS ...

随机推荐

  1. 对于PKI(公钥基础结构)及证书服务的通俗理解

    对于PKI及证书服务的这些概念,相信初学者会有许多迷惑的地方,那是因为其中的某些关键概念没有理解清楚,我力争以通俗易懂的方式给初学者一些启示,也给以后自己忘了的时候一个参考:) ! 参考资料:http ...

  2. [排错] Status error 2850

    前几天重新搭建了APAC的Netbackup, 终于可以备份成功了, 但是今天在做还原的时候遇到了些小问题,记录下来. 1. 在CNHZSRV04BPO上执行还原的时候报下面的错误. 2. 经过检查发 ...

  3. HDU 5521 Meeting(虚拟节点+最短路)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  4. FZU 1025 状压dp 摆砖块

    云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ...

  5. A trip through the Graphics Pipeline 2011_03

    At this point, we’ve sent draw calls down from our app all the way through various driver layers and ...

  6. typecho流程原理和插件机制浅析(第二弹)

    typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...

  7. PHP实现远程下载文件到本地

    PHP实现远程下载文件到本地 投稿:hebedich 字体:[增加 减小] 类型:转载   经常写采集器发布接口需要使用到远程附件的功能,所以自己写了一个PHP远程下载文件到本地的函数,一般情况下已经 ...

  8. P1091 合唱队形

    水题 #include <bits/stdc++.h> using namespace std; const int maxn = 105; int main(int argc, char ...

  9. php + ajax + html 简单跨域问题

    XMLHttpRequest cannot load http://localhost:8080/abc/index.php. No 'Access-Control-Allow-Origin' hea ...

  10. java endorsed

    endorsed目录,充许你将一些特殊的类库放到其中以供项目使用. 官方说明:    Specifying the -Djava.endorsed.dirs=lib/endorsed system p ...