彼の人生のすべてのプログラマーは、少なくとも一度は自分のロガーを書くべきです。今日は、開発中にアプリケーションログを使用する方法を説明し、コミュニティに、もう少し快適に過ごせるように設計された別の自転車を提供したいと思います。
人気のことわざ
そのため、
SLG0
および
SLG1
としても知られるアプリケーションログ...
SAP標準
アプリケーションログは、新しい開発、特にWebDynproテクノロジーを使用したバックグラウンドタスク、Webサービス、およびインターフェースのデバッグとサポートに非常に役立ちます。つまり、デバッガーを使用することが常に不可能または単に不便な場合です。 マガジンはSAPの標準機能であるため、いつでも利用できます。
トランザクション
SLG1
ログを表示できます。
上部には指定期間のログが表示され、下部には選択したジャーナルに記録されたメッセージが表示されます。
ロギング
各ログには、オブジェクトとサブオブジェクト という 2つの主な属性があります 。 これにより、システムで作成されたマガジン全体を開発エリアおよび特定のアプリケーション(たとえば、為替レートを受け取るサービスの
Z_WEB_SERVICES
オブジェクトと
EXCHANGE_RATE
サブオブジェクト)
Z_WEB_SERVICES
に分離できます。
オブジェクトとサブオブジェクトを維持するには、トランザクションSLG0が使用されます。
手順1.レコードは2つの手順で追加されます。最初の画面で、オブジェクトの名前が決定されます。
ステップ2.次に、新しいオブジェクトに対して、左側のツリーで「サブオブジェクト」が選択され、サブオブジェクトが作成されます。

ステップ2.次に、新しいオブジェクトに対して、左側のツリーで「サブオブジェクト」が選択され、サブオブジェクトが作成されます。
使い方
アプリケーションにログサポートを追加するには、次の機能モジュールを使用するだけで十分です。
-
BAL_LOG_CREATE
新しいジャーナルを作成し、その識別子を返します -
BAL_LOG_MSG_ADD
メッセージを識別子でログに追加します -
BAL_DB_SAVE
データベースに指定された識別子でログを保存します
ところで、
BAL_DB_SAVE
は入力として識別子のリストを受け入れ、一度に複数のログを保存できます。
SLG1のサンプルコードと結果(ログの表示)
メッセージの詳細
前の例では、ログは単純なテキストファイルと大差ありません。 ただし、SAPログでは、メッセージには日付とテキストよりも大きなプロパティセットがあり、それぞれを使用して、ジャーナルを表示するときにレコードをフィルタリングおよびグループ化できます。その一部を図に示します。

- メッセージの種類 -ログを表示するときのアイコンの色は、このパラメーターに依存します
- 重大度レベル -エントリはこの属性によって自動的に分類されます
- ソート基準-3文字の単語、メッセージをグループ化およびソートするための記号
- 詳細レベル -1から9までの数値(フィルターに参加可能)
- 追加情報 -任意のパラメーターセットと、機能モジュールまたはそれを表示するための手順へのリンク。 たとえば、サーバーのHTTP応答ヘッダーをデータ転送エラーメッセージに添付したり、パラメーターを使用してトランザクションを呼び出したりするために使用できます。
表示すると、次のようになります

別のロガー
使用されるメッセージプロパティが多いほど、ロギングコードが大きくなります。これは本質的に二次的なものです。 この問題を解決するために、また便宜上、開発者は多くの場合、別々のインクルードで補助ルーチンを作成するか、機能モジュールとクラスを作成します。
自転車を設計するとき、機能と利便性の最適な組み合わせを見つけようとしました。 実装することが判明しました:
- クラスからのメッセージと文字列からのテキストの作成
- 重要度、詳細レベル、ソート基準の指定による分離
- ログに記録する前に 、指定された詳細レベルでメッセージをフィルタリングする
- メッセージの詳細を表示するための独自のロジックを定義する簡単な方法
使用する
最初に、静的な
INSTANTIATE
メソッドを使用してオブジェクトのインスタンスを取得する必要があります 。
引数-オブジェクト、サブオブジェクト、外部識別子:
CALL METHOD zbc_cl_log=>instantiate EXPORTING iv_object = gc_object iv_subobject = gc_subobject iv_external_id = gc_external_id RECEIVING ro_log = go_log.
外部識別子パラメーターは 、雑誌のリストの別の列にテキストとして表示され、目で正しいものを見つけるのに役立ちます。
ロギングは、
WRITE
メソッドを使用して行われます。
CALL METHOD go_log->write EXPORTING iv_type = zbc_cl_log=>info iv_text = 'Document Source (XML)' iv_class = zbc_cl_log=>class_additional_information iv_level = zbc_cl_log=>level_info iv_sort = 'XML' iv_details = gv_xml_b iv_viewer = 'ZBC_LOG_VIEWER_XML_XSTRING'.
ログに書き込む前のメッセージフィルターのレベルは、
THRESHOLD
メソッドを使用して決定されます。このメソッドのパラメーターは、定義済みの
LEVEL_*
または
LEVEL_NO_THRESHOLD
から任意の値を取ることができます。この場合、すべてのメッセージが記録されます。 私の観察によれば、作成されている雑誌は常に多くあり、遅かれ早かれ、それらの質量がシステム全体のパフォーマンスに影響を与える瞬間があります。 レベルフィルタを使用すると、現時点で「余分な」パーツの記録を無効にできます。
IV_DETAILS
メッセージの
IV_DETAILS
を送信するために使用され、オンデマンドでこのデータを表示する責任がある汎用モジュールの名前は
IV_VIEWER
です。
WRITE
メソッド内で、
IV_DETAILS TYPE ANY
転送されたデータは
ID
変換を使用してXMLにシリアル化され、表示中にアクセスすると、データが解凍され、指定された汎用モジュールに転送されます。
このアプローチは、いくつかの機能をもたらします。
-
WRITE
メソッドに提供される値は、辞書型または基本型でなければなりません。 - 表示機能モジュールは、同じタイプのパラメーターを宣言する必要があります。
- このパラメーターは
I_DATA
と呼ばれI_DATA
。
例
のタイプがXStringの場合、汎用モジュールのインターフェースは次のようになります。
GV_XML_B
のタイプがXStringの場合、汎用モジュールのインターフェースは次のようになります。
FUNCTION zbc_log_viewer_xml_xstring . *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" REFERENCE(I_DATA) TYPE XSTRING *"---------------------------------------------------------------------- CALL FUNCTION 'DISPLAY_XML_STRING' EXPORTING xml_string = i_data EXCEPTIONS OTHERS = 0. ENDFUNCTION.
結論の代わりに
これまでのところ、私は自分のプロジェクトでこのソリューションを試す必要はありませんでしたが、ほぼ間違いなく、まだ気づいていないバグ、欠点、エラーさえあります。開発コードと設計に関するコメントに感謝します。 ソースは、NuggetおよびSlinkeeファイルの形式でGitHubで入手できます。ABAPコード交換ツールであるSAPlinkを使用して、自分でインストールできます。
GitHubリポジトリ: https : //github.com/yaruson/ZBC_LOG_UTILS
SAPlinkホームページ: https ://www.assembla.com/spaces/saplink/wiki