【ABAP】システムログ（SM21）の出力方法（サンプルあり）

<!-- wp:paragraph -->アドオンプログラム実行時にシステムログを残したい場合の手順を説明します。

## システムログ用メッセージの登録

システムログ専用のメッセージを登録します。

### SE92を実行

トランザクションコード：SE92で登録できます。

今回はテスト用にメッセージを登録しますが、標準で用意されているメッセージを使うこともできます。

#### Messageボタン押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/a87f4448-8441-dae9-5e90-9680f091a179.png)

#### メッセージ情報を入力

**①システムログ番号の決定**

メッセージエリア2桁と連番1桁がキー項目になり、エリアの先頭文字はYかZである必要があります。

2桁目、3桁目には0-9の10個の数値とA-Zの26個のアルファベットを入力できますが、通常のメッセージに比べて登録できるシステムログメッセージの数が少ないので使い方に注意してください。

**②メッセージ決定**

「Text」欄に定義してください。引数の指定については後述します。

**③重要度の決定**

メッセージの重要度やログ照会時に信号アイコンで表示するかを決定します。

ここで重要度を設定しておくと、SM21での照会時に重要度の高いログだけ表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/9c29035e-ea80-09e5-d06a-3d96f34e39b8.png)
＜参考＞

SAPの名称領域（1桁目がY、Z以外）で登録しようとすると、オブジェクトキーの入力を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/e13af2e2-0541-4b2f-029d-19c558662fd0.png)

#### 保存

保存してパッケージを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/f4dc349f-69ba-0908-32dd-5b685db216cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/b0ad7577-5cdc-9d63-a615-c903503b5651.png)

#### 文書ボタンを押下してエラーの詳細な内容説明を入力（必要な場合のみ）

画面下の大きな枠の中にフリーの入力欄があるので、必要に応じて入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/e9663397-7529-4045-9205-677d181a0106.png)
ワード形式の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/17f5e77b-8d45-8e83-6639-d3ebb1c45e9a.png)

#### 内容説明を入力して有効化

入力が完了したら有効化ボタンを押して完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/b38ae9ee-af4b-0185-9a27-af6079c4c9e8.png)

## プログラムでの実装方法

システムログ出力用のクラスが標準で用意されています。

「WRITE_ENTRY」メソッドでシステムログ出力ができます。

```
  CALL METHOD cl_syslog_writer=>write_entry
    EXPORTING
      iv_message_id = 'Y10'
      iv_param_a    = '引数a'
      iv_param_b    = '引数b'
*      iv_param_c    =
*      iv_param_d    =
*      iv_param_e    =
*      iv_param_f    =
*      iv_param_g    =
*      iv_param_h    =
*      iv_param_i    =
      .
```

SM21で見るとこんな感じです。

一覧画面でログの概要、詳細画面で詳細テキストまで確認できます。

＜一覧＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/0fb3e127-d110-8f0e-37e3-2169d861f9fb.png)

＜詳細＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/6ab7cd4d-6b6b-33ef-56b2-8efdcd58a271.png)
## 補足 － メッセージの引数について

### 大文字/小文字の違い

この2つのメッセージの違いを見ていきましょう。

違いは引数の大文字/小文字だけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/25fb551f-aa93-075f-3f66-70a3380854d5.png)
上のサンプルでは小文字の方を出力したので、こちらでは大文字の方を同じやり方で出してみます。

```
  CALL METHOD cl_syslog_writer=>write_entry
    EXPORTING
      iv_message_id = 'Y00'
      iv_param_a    = '引数A'
      iv_param_b    = '引数B'
*     iv_param_c    =
*     iv_param_d    =
*     iv_param_e    =
*     iv_param_f    =
*     iv_param_g    =
*     iv_param_h    =
*     iv_param_i    =
    .
```

SM21で見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712997/5c5c0125-0aad-3c23-70e1-0e22db75d3d7.png)
引数が表示されませんね。

上で紹介したメソッドでは大文字の引数は表示されないのです。

大文字の引数を表示するためには別のメソッドを使用します。

```
  CALL METHOD cl_syslog_writer=>write_entry_with_words
    EXPORTING
      iv_message_id = 'Y00'
      iv_word1      = '引数A'
      iv_word2      = '引数B'
*      iv_word3      =
*      iv_word4      =
*      iv_word5      =
      .
```

上で紹介したクラスの別メソッド「WRITE_ENTRY_WITH_WORDS」を使えば大文字の引数を表示できます。

### 引数を指定できる数

2つのメソッドのパラメータを見れば気づくかもしれませんが、

- WRITE_ENTRY（小文字引数用）・・・最大9個
- WRITE_ENTRY_WITH_WORDS（大文字引数用）・・・最大5個

までが指定可能となります。

使い分けの基準はメソッドのパラメータ名から判断すると、

小文字引数の方はキー項目やエラー情報に必要なコード値を指定する、

大文字引数の方テキストを指定する、という具合になるでしょうか。

上記は一例ですが、プロジェクトでルールを決めて運用することが大切です。

## まとめ

- アドオンで登録できるシステムメッセージの数は多くはない
- システムログを出力する部品は標準で用意されている
- 引数は通常のメッセージより多く指定できる

システムログに出力する機会はそんなに多くないので、プロジェクト内に知っているメンバーが少なく、いざ使いたい場合に困ることがあります。

そんなときのお役に立てれば幸いです。