トラブルシューティングのヒント - ビジネスルールをデバッグして StackTrace を出力するIssue ServiceNow プラットフォームは、さまざまなビジネスルール、スクリプトインクルード、および内部コードで構成されています。場合によっては、特定の値がどのように挿入、更新、または削除されているかを把握して、これらがどのように発生するかを理解し、トラブルシューティングを絞り込む必要があります。 この記事では、条件が満たされたときに StackTrace を出力するデバッグビジネスルールについて説明します。 前提条件 トラブルシューティングのビジネスルールを効果的に行うには、キャプチャする内容についての仮説を立てる必要があります。すべてを出力すると、処理が遅くなり、役に立たないログが多くなります。そのため、適切に制限された一連の条件が適切なデバッグビジネスルールとなります。 例: ユーザー Abel Tuter が [u_test] テーブルに多数の新規レコードを作成した場合、テーブル [u_test] の「insert」、「created by」が Abel Tuter、それ以外は何もないデバッグビジネスルールを作成します。 David Loo が [u_test] テーブルの多数のレコードを更新した場合、テーブル [u_test] の「insert」、「updated by」が David Loo、それ以外は何もないデバッグビジネスルールを作成します。 [u_test] テーブルで ABCDE という名前を含む多数のレコードを作成した場合、テーブル [u_test] の「insert」、「name」が ABCDE、それ以外は何もないデバッグビジネスルールを作成します。 デバッグビジネスルールのスクリプト デバッグビジネスルールのサンプルスクリプトは次のとおりです。状況に応じて詳細をカスタマイズできますが、これは現状のグローバルなスコープでのみ機能することに注意してください。 (function executeRule(current, previous /*null when async*/) {// ここにコードを追加gs.log('***** DEBUG - op:'+ current.operation() + ", sess:" + gs.getSessionID() + ", time:" + new Date().getTime() + ', sys_id:' + current.sys_id + ' - \n' + GlideLog.getStackTrace(new Packages.java.lang.Throwable()), 'Stacktrace Debug');})(current, previous); ログに記録される情報: operationinsert、update、deletesessionIDトランザクションログ、ノードログの検索時に役立つtimeBR が呼び出された時刻sys_idシステムログの BR 出力の検索時に役立つstack trace logBR が呼び出されたときのスタックトレース ログ 「ソース」が「Stacktrace Debug」(gs.log の 2 番目のパラメーター) である [syslog] テーブルで、デバッグビジネスルールのログを確認できます。例:https://<instance-name>.service-now.com/syslog_list.do?sysparm_query=source%3DStacktrace%20Debugまた、レコードに対してスタックトレースが実行されたため、メッセージにレコードの sys_id が含まれているログを検索することもできます。ただし、削除されたレコードのスタックトレースを見つけようとする場合は、レコードを削除する前に sys_id を保存しておく必要があります。sys_id によるシステムログの検索は、複数のスタックトレースが記録されていて、特定のスタックトレースを見つけようとしている場合にも役に立ちます。 スコープ対象のアプリケーションにおけるスタックトレースの出力 上記のビジネスルールはスコープ対象のアプリケーション内でパッケージ呼び出しとして機能しません (可能な場合は実際に回避する必要があります)。そのため、これはスコープ対象のアプリケーションでは使用できません。これに対処するには、スタックトレースを取得するためのグローバルスクリプトインクルードが必要です。これはスコープ対象のビジネスルールから呼び出されます。 スクリプトインクルード「StackTrace」では、[アクセス可能 (Accessible From)] オプションを [すべてのスコープから (From all scopes)] に設定する必要があります。 var StackTrace = Class.create();StackTrace.get = function() { return GlideLog.getStackTrace(new Packages.java.lang.Throwable());}; ビジネスルールは次のように変更されます。gs.log から、すべてのスコープから使用できる gs.info (これもグローバルのみ) を使用するように変更されていることに注意してください。 (function executeRule(current, previous /*null when async*/) {// ここにコードを追加gs.info('***** DEBUG - op:'+ current.operation() + ", sess:" + gs.getSessionID() + ", time:" + new Date().getTime() + ', sys_id:' + current.sys_id + ' - \n' + global.StackTrace.get(), 'Stacktrace Debug');})(current, previous);