如何在SSIS任务脚本中使用FireError进行调试?
SSIS脚本组件中使用FireError/FireInformation调试指南
一、核心方法基础用法
SSIS脚本组件中,ComponentMetaData对象提供的FireInformation和FireError方法,可直接向SSIS运行时日志输出调试信息或错误详情,是排查部署后问题的关键手段:
FireInformation(输出调试信息,不中断执行)
ComponentMetaData.FireInformation( 自定义信息代码, // 如10、20,用于区分不同日志节点 "子组件名称", // 如"VariableCheck"、"ApiCall",标记日志来源 "要输出的具体信息",// 比如变量值、API响应状态等 "", // 帮助文件路径,留空即可 0, // 帮助上下文ID,设为0即可 ref fireAgain // 保持true,允许后续继续输出日志 );
FireError(输出错误信息,可中断任务)
ComponentMetaData.FireError( 自定义错误代码, // 如1001、1002,用于区分错误类型 "子组件名称", // 标记错误来源 "错误详情描述", // 比如异常信息、API失败原因 "", // 帮助文件路径,留空即可 0, // 帮助上下文ID,设为0即可 ref cancel // 设为true则中断任务,false则继续执行 );
二、针对你的脚本的具体修改示例
以下是基于你提供的脚本,添加调试日志的关键修改点:
1. 提前声明类级变量(方便跨方法访问)
在ScriptMain类顶部添加变量,让PostExecute也能访问循环和标记信息:
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { // 类级变量,用于跨方法传递调试数据 private string CurrentMaxMarker; private int LoopIteration; private bool fireAgain = true; // 原有PreExecute、PostExecute等方法... }
2. 变量初始化阶段添加日志(验证服务器变量配置)
在CreateNewOutputRows方法的变量赋值后,添加日志确认服务器上的变量是否正确:
string baseurl = Convert.ToString(Variables.strHPBaseUrl); string startMarker = Convert.ToString(Variables.intMaxMarker); string secret = Convert.ToString(Variables.strHPSecret); string key = Convert.ToString(Variables.strHPKey); string limit = Convert.ToString(Variables.intLimit); int maxLoopIterations = Variables.intMaxLoopIterations; // 输出变量配置,确认服务器环境与本地一致 ComponentMetaData.FireInformation(20, "VariableCheck", $"BaseUrl: {baseurl}", "", 0, ref fireAgain); ComponentMetaData.FireInformation(20, "VariableCheck", $"StartMarker: {startMarker}, Limit: {limit}", "", 0, ref fireAgain); ComponentMetaData.FireInformation(20, "VariableCheck", $"MaxLoopIterations: {maxLoopIterations}", "", 0, ref fireAgain); // 初始化类级变量 LoopIteration = 0; CurrentMaxMarker = startMarker;
3. API调用与数据解析阶段添加日志
在API响应成功后,添加日志确认数据接收和解析情况:
if (response.IsSuccessStatusCode) { ComponentMetaData.FireInformation(30, "ApiResponse", $"API调用成功,状态码:{(int)response.StatusCode}", "", 0, ref fireAgain); Stream a = response.Content.ReadAsStreamAsync().Result; StreamReader Reader = new StreamReader(a, Encoding.Default); string Html = Reader.ReadToEnd(); a.Close(); ComponentMetaData.FireInformation(30, "ApiResponse", $"返回原始数据长度:{Html.Length}字符", "", 0, ref fireAgain); JavaScriptSerializer js = new JavaScriptSerializer(); List<JobContext> Jobs = js.Deserialize<List<JobContext>>(Html); ComponentMetaData.FireInformation(30, "DataParsing", $"解析出{Jobs.Count}条Job记录", "", 0, ref fireAgain); // 原有循环处理Job的代码... }
4. 错误分支添加FireError
在API响应失败和全局异常捕获分支,添加错误日志:
else // API响应失败 { bool cancel = false; // 设为true会中断任务,根据需求调整 ComponentMetaData.FireError(1001, "ApiError", $"API调用失败:状态码{(int)response.StatusCode},原因:{response.ReasonPhrase}", "", 0, ref cancel); ErrorBuffer.AddRow(); ErrorBuffer.ErrorMessage = "Status code is unsuccessful"; ErrorBuffer.ErrorMessageStacktrace = SubstringStringByLength(response.ReasonPhrase, 4000); }
catch (Exception e) // 全局异常捕获 { bool cancel = false; ComponentMetaData.FireError(1002, "GeneralError", $"执行出错:{e.Message}", "", 0, ref cancel); ComponentMetaData.FireError(1003, "GeneralError", $"堆栈信息:{e.StackTrace}", "", 0, ref cancel); ErrorBuffer.AddRow(); ErrorBuffer.ErrorMessage = SubstringStringByLength(e.Message.ToString(), 950); ErrorBuffer.ErrorMessageStacktrace = SubstringStringByLength(e.StackTrace.ToString(), 4000); }
5. PostExecute阶段输出最终统计
修改PostExecute方法,输出任务完成后的关键信息:
public override void PostExecute() { base.PostExecute(); ComponentMetaData.FireInformation(50, "PostExecute", $"任务执行完成,最终Marker:{CurrentMaxMarker},循环次数:{LoopIteration}", "", 0, ref fireAgain); }
三、查看服务器上的调试日志
部署后需确保SSIS包的日志配置正确:
- 打开SSIS包的日志配置,选择
SQL Server或文件作为日志提供方 - 勾选
OnInformation和OnError事件 - 运行包后,查看对应日志存储位置:
- 若选SQL Server,日志默认存在
msdb.dbo.sysssislog表 - 若选文件,查看指定的日志文件路径
- 若选SQL Server,日志默认存在
四、常见部署问题排查方向
结合调试日志重点排查:
- 服务器上的SSIS变量值是否与本地一致(如API地址、密钥)
- 服务器是否能访问目标API(防火墙、代理、网络权限)
- 服务器.NET环境是否支持TLS1.2(你的脚本已设置,但需确认环境兼容性)
- 脚本组件是否有数据库写入权限、API访问权限
内容的提问来源于stack exchange,提问作者MSH
相关产品推荐
相关产品推荐

