• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FTPタスクでエラーが発生した時、「実行結果」タブに表示されているエラーメッセージを取得するには?)

FTPタスクでエラーが発生した時のエラーメッセージの取得方法とは?

このQ&Aのポイント
  • Integration Servicesの「FTPタスク」を実行し、FTPサーバーに接続して対象のファイルを受信しています。対象のファイルが存在していない場合、エラーが発生し、パッケージが止まってしまいます。エラーメッセージは「実行結果」タブから確認することができます。
  • FTPタスクの「ExecValueVariable」に変数を設定すると、エラーが発生した場合に変数にエラーコードが代入されます。成功時は0、失敗時は1となります。エラーコードを取得して、スクリプトタスクで加工することができます。
  • FTPタスクを設定する際は、エラーメッセージを取得するために「実行結果」タブを確認することが重要です。また、エラーが発生した場合にエラーコードを取得できるように、変数を設定することも大切です。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

満足いく回答かわかりませんが、SSISメニューの「ログ記録」で、ログプロバイダを有効にし、FTPタスクのOn Errorイベントをトラップするように指定すればエラーメッセージを含むファイル(csv)を生成させることができます。そのファイルをFTPタスクのイベントハンドラで参照して必要な列だけ取り出せばいいかもしれません。 その場合は、ログファイルは処理中はSSISプロセスに抱えられてしまう可能性があるので、コピーしてから使う必要があるでしょうし、APPENDされるのでパッケージ開始時にファイルを削除する必要もあるでしょう。試行錯誤してみてください。

edo_1972
質問者

お礼

jamshid6さん、いつも回答していただき本当にありがとうございます。 そうですか。 せっかくアドバイスいただいたんですが今の私のレベルでは・・・ でも何とか実現したいと思っています。 こんな事を書いたら怒られるかも知れませんがお許し下さい。 「イベントハンドラ」を使うのは初めてでよく解りませんでした。 色んな事があり過ぎて混乱しています。 どのようにすればいいのでしょうか? 頼りっぱなして本当に申し訳ありませんが アドバイス宜しくお願いします。 失礼します。

その他の回答 (5)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.6

うーん、そうですか。ログファイルは起動時から抱えてしまうということですね。 ログファイル名を変更するのは実行順序から考えても難しいでしょうね。 ・パッケージ起動前にファイルを削除するようにパッケージの外で対応する(どうやって起動するかにもよりますが)。 ・SQL Serverのログプロバイダに書き込むようにする ・カスタムログプロバイダを作成する などもありますが、結局一番最後のメッセージだけ拾えばいいのではないでしょうか。

edo_1972
質問者

お礼

回答ありがとうございます。 jamshid6さんのいうように難しくて挫折しました。 別パッケージでFTPタスクのみのログファイルを削除するパッケージを作成して対応するようにしました。 本当にjamshid6さんのお陰様で作成する事ができました。 感謝します。本当にありがとうございました。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.5

たかが数十文字のメッセージが切れるのはありえないですよね? では何文字(何バイト)だったら切れないと思いますか? その長さはどこかで設定できると思いませんか? そのフラットファイルの接続マネージャの設定を隅々まで見ていただければ見つかるはずですので、探してみてください。

edo_1972
質問者

お礼

回答ありがとうございます。 「フラットファイルソース」の「詳細エディタの表示」を選択して「フラットファイルソースの詳細エディタ」の「入力プロパティと出力プロパティ」タブでmessage列のデータ型を変更したら切られないでメッセージが取得できました。 「フラットファイルソースの詳細エディタ」を知りませんでした、すみませんでした。 申し訳ありませんが最後に質問させて下さい。 jamshid6さんのお陰様でログファイル(パッケージ全体とFTPタスクのみ)を分ける事ができたんですが、1つ問題が発生してしまいました。 FTPタスクのみのログの内容に前回、前々回の古いログが残っている為、メッセージを取得する際に全てのログのメッセージを取得されます。 試しに「ファイルシステムタスク」を「制御フロー」に追加してログファイルを削除しようとしたら案の定、「プロセスが使用されているため...」とエラーになりました。 何とかパッケージを実行する際にFTPタスクのみログファイルの内容をクリアする事は可能でしょうか? 本当に質問ばかりで申し訳ありませんがアドバイス、宜しくお願いします。

edo_1972
質問者

補足

お世話になっています。 FTPタスクのみのログファイルの作成する際にファイル名に実行日時を付ければ何とかできるのではないかと思い、これからできるかやってみます。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

>「サンプリングされたデータの最終行が不完全です。」 読み込んでいるのがログファイルなので、そのエラーメッセージは想定内です。 そのファイルからメッセージを取り出すのに支障はないはずです。 また、パッケージとFTPタスクで別のファイル接続マネージャを割り当てればそれぞれでログを書くことができます。 メニュー自体の動きは確かに怪しい部分があるのですが、何度か切り替えればちゃんと設定できるはずです。

edo_1972
質問者

お礼

いつもありがとうございます。 本当に感謝します。 ログファイルのmessage列の文字が長すぎて「フラットファイルソース」でエラーが発生したので「フラットファイルソースエディタ」を開いて「エラー出力」を選択し、「エラー」と「切り捨て」のコンボボックスを「エラーを無視する」を選んで実行したら正常にパッケージが動きましたが・・・ 一応、何とかエラーログから内容を取得する事ができました。 でもログの文字列が切られてしまいます。 どのようにすれば切られないで文字列を取得する事ができますか? 大変申し訳ありませんがアドバイス宜しくお願いします。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

・デバッグは普通に実行するだけでも結構です(「デバッグ」メニューで「デバッグ開始」をイメージしてはいましたが) ・イベントハンドラのステップに入った時点でログにはエラーメッセージが書き出されていますので、 普通にやればそのエラーメッセージを含んだ状態でファイルをコピーすることができるはずです。 (試しにやってみましたが、取れます)  もし取れないとしたら、ログの設定が誤っているはずです。ログのコンテナがFTPタスクではなく、1階層上のパッケージになっているのではないですか? ○コンテナがFTPタスクの場合  FTPタスクエラー発生→エラーログ記録→イベントハンドラ開始→ファイルコピー ○コンテナがパッケージの場合  FTPタスクエラー発生→イベントハンドラ開始→ファイルコピー→パッケージエラー発生→エラーログ記録

edo_1972
質問者

お礼

回答ありがとうございます。 返事が遅くなってすみません。 指摘される前の「SSIS ログの構成」のコンテナは以下のように設定していました。 [-][V]パッケージ名    [V]FTPタスク    [V]スクリプトタスク      ↓ [-][ ]パッケージ名    [V]FTPタスク    [ ]スクリプトタスク 上記の設定に変えてパッケージを実行したらログが出力されましたが・・・ 「イベントハンドラ」タブに「フラットファイルソース」を追加してました。 「フラットファイル接続マネージャ」の[新規作成]ボタンを押下してました。 「ファイル名」の[参照]ボタンを押下してコピーしたログファイルを設定して「列」を選択したら以下のメッセージボックスが表示されました。 「サンプリングされたデータの最終行が不完全です。  列または行の区切り記号が見つからないか、テキストが正しく修飾されていない可能性があります。」 コピーしたファイルをエディタで開いて、最終行(空白行)を削除して再度、設定したらメッセージボックスが表示されませんでした。 またパッケージ全体のログとFTPタスクのみのログを出力する事はできますか? 試しに「ログ記録」に新たに「テキストファイルのSSISログプロバイダ」を追加しましたが個々の設定ができませんでした。 聞いてばかりで本当に申し訳ありませんがアドバイスいただけませんでしょうか? 宜しくお願いします。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

そんなに難しくはありません。 1)「SSIS」メニューにある「ログ記録」で、「テキストファイルのログプロバイダ」を追加して、構成列にファイル接続マネージャを割り当てます。  対象タスクと対象イベントを指定できるので、FTPタスクとOnErrorをチェックします。  (この画面は変な動きをするので、なかなか思ったようにチェックさせてくれませんが、いろいろやってるとできるはずです) 2)ここで一回デバッグして、ログファイルを吐き出してみてください。  MESSAGE列にメッセージが入っていると思います。 3)あとは「イベントハンドラ」タブで「FTPタスク」の「OnError」のところに、普通にタスクを置いていくだけです。  イベントハンドラタブの内容はそのイベントが起きたときに実行されるものです。  ログファイルにこの時点でログが書かれていますが、ファイルはSSISが抱えているので、そのままではデータソースには使えません。  なので、ファイルシステムタスクを置いて、その時点のファイルをコピーして、コピーした方を使います。  フラットファイルとして読み込んで、MESSAGE列の内容を取り出せばいいでしょう。 ログは他の場所にも書き出せますから、本当はSQL Serverに書き出して使うのが一番ですが、上記のとおりにすればファイルでもいいかと。

edo_1972
質問者

お礼

jamshid6さん、いつも回答いただき、本当にありがとうございます。 > 1)「SSIS」メニューにある「ログ記録」で... 1-1.「ファイル接続マネージャ」を追加して「使用法の種類」を「既存のファイル」に設定し、「ファイル」を下記のように入力しました。 ・C\log\ftp_log.log 1-2.アドバイスいただいたように設定しました。 > 2)ここで一回デバッグして、ログファイル... デバッグの仕方がわからなかったのでデバッグ無しでパッケージを実行してログファイルを開いて内容を確認したらエラーメッセージが出力されました。 「スクリプトタスク」のソースコードでブレークポイントを貼る方法はわかるんですが・・・ 的外れな事を書いていたらすみません、どのようにデバッグするのでしょうか? ※現在は「制御フロー」タブに「スクリプトタスク」と「FTPタスク」を追加しています。 フローの順番は下記の通りです。 「スクリプトタスク」    ↓ 「FTPタスク」 > 3)あとは「イベントハンドラ」タブで... 現在、「イベントハンドラ」タブに下記の手順でタスクを追加しています。 3-1.ファイルコピー用に「ファイル接続マネージャ」を追加して「使用法の種類」を「ファイルの作成」に設定し、プロパティから「Expressions」で「ConnectionString」に作成した変数を指定しました。 3-2.「スクリプトタスク」を追加して、3-1で作成したファイルコピー用の「ファイル接続マネージャ」の「ConnectionString」に指定した変数にパス名を格納しました。 3-3.「ファイルシステムタスク」を追加して下記のように設定しました。 ・「SourceConnection」→ 1-1で追加した「ファイル接続マネージャ」 ・「Operation」→「ファイルのコピー」 ・「DestinationConnection」→ 3-1で追加した「ファイル接続マネージャ」 フローの順番は下記の通りです。 「スクリプトタスク」   ↓ 「ファイルシステムタスク」 ログファイルのコピーはできたんですが、コピー元のログファイルの内容とコピー先のログファイルの内容が異なってしまいました。 コピー元のログファイルの内容には「FTPタスク」で発生したエラーメッセージが出力されていますがコピー先のログファイルの内容にはパッケージの開始までのログが出力されていました。 申し訳ありませんが再度、アドバイス宜しくお願いします。

edo_1972
質問者

補足

度々、申し訳ありません。 「この回答へのお礼」の最後に記述したコピー元のログファイルの内容とコピー先のログファイルの内容が異なる件ですが私の勘違いかもしれません。 エラー時にコピーされているからコピー先とコピー元の内容が異なるのは当たり前ですよね。

関連するQ&A