API Connect の DataPower Gatwayでログ出力する

# はじめに
API Connectを利用していると、デバッグ用途や送信されるデータ項目を確認するため、Gatewayでログ出力したい場合がある。DataPower Gatewayでは、API Connectのアセンブルでログ出力を独自実装することができる。その方法を記載する。

残念ながら、Bluemix のAPI Connectでは、DataPowerのログを確認することはできません。

# 方法
## 1. XSLTを利用する場合

- アセンブルでXSLTコンポーネントを追加
![xslt.png](https://qiita-image-store.s3.amazonaws.com/0/121209/fa0d53dd-e29e-511f-9810-fb9a0c23f30f.png)




- XSLTにコード追加
XSLTでは、時間、API名、apiKey、開発者組織を出力するように設定。ログ・レベルは、"alert|critic|error|warn|notice|info|debug"　の中から指定できる。

```xml:xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:dp="http://www.datapower.com/extensions"
  xmlns:func="http://exslt.org/functions"
  xmlns:apim="http://www.ibm.com/apimanagement" extension-element-prefixes="dp func apim">
 
  <xsl:import href="local:///isp/policy/apim.custom.xsl" />
 
  <xsl:template match="/">
 <!-- コンテキスト変数から、時間、API名、apiKey、開発者組織を取得 -->
    <xsl:variable name="system-datetime" select="apim:getContext('system.datetime')" />
    <xsl:variable name="api-name" select="apim:getContext('api.name')" />
    <xsl:variable name="client-app-id" select="apim:getContext('client.app.id')" />
    <xsl:variable name="client-org-name" select="apim:getContext('client.org.name')" />

 <!-- dp:priority DataPowerのログ・レベルを指定、dp:type DataPowerのログ・カテゴリーを指定 --> 
    <xsl:message dp:priority="error" dp:type="http">

 <!-- 取得した値をコンマ区切りで出力 -->
      <xsl:value-of select="$system-datetime" /><xsl:text>,</xsl:text>
      <xsl:value-of select="$api-name" /><xsl:text>,</xsl:text>
      <xsl:value-of select="$client-app-id" /><xsl:text>,</xsl:text>
      <xsl:value-of select="$client-org-name" />
    </xsl:message>
  </xsl:template>
</xsl:stylesheet>
```

XSLTのコードについては、[Knowledge Center](https://www.ibm.com/support/knowledgecenter/SSMNED_5.0.0/com.ibm.apic.policy.doc/rapim_imp_codesnip.html)にいくつかコード・サンプルがあるので参考ください。


- DataPowerのログ出力を確認
DataPowerのログ出力を確認すると、出力されていることが確認できる。
![log.png](https://qiita-image-store.s3.amazonaws.com/0/121209/a589028a-af30-6210-01c6-58bc3f3dca42.png)


## 2. GatewayScriptを利用する場合
- アセンブルでGatewayScriptコンポーネントを追加
![gaewayscript.png](https://qiita-image-store.s3.amazonaws.com/0/121209/b19638e5-bb10-5def-36db-083aaad1a5cc.png)


- スクリプトの追加
XSLTと同様に、時間、API名、apiKey、開発者組織を出力するように設定。

```js:gatewayscript
var apic = require('./apim.custom.js');
 
console.options({'category':'http'}).error(
  apic.getContext('system.datetime') + ',' +
  apic.getContext('api.name') + ',' +
  apic.getContext('client.app.id') + ',' +
  apic.getContext('client.org.name')
);
```

# 補足
### アセンブルで取得できる項目

アセンブルでは、リクエスト・パラメーター、OAuth関連の情報、アプリ情報、API情報など様々なAPI Connectのコンテキスト変数を参照できる。コンテキスト変数については、[Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/rapim_context_var.html)に記載がある。

### DataPowerのログレベルの設定
今回、ログ出力としてエラー・レベルで出力しているが、DataPowerでログレベルを変更することができる。DataPowerのコンソールの左メニューより、[歯車マーク] - [デバッグ] - [トラブルシューティング] でロギング指定が可能。
![logLevel.png](https://qiita-image-store.s3.amazonaws.com/0/121209/0ca5880b-fd66-0a35-9d11-323b3fa4e435.png)

### DataPowerのログ・カテゴリーの作成
今回、ログ・カテゴリーは、既存に存在するカテゴリー"http"に出力しているが、ログ・カテゴリーを追加することもできる。上記画面の、[ログ・イベントの生成] - [ログ・カテゴリー] - [+]をクリックすると、ログ・カテゴリーを追加することができる。追加した名前を、ログ・カテゴリーで指定することで、カテゴリーを分けることが可能。

### DataPowerのコンソールの日本語化
DataPowerのコンソールはデフォルトでは英語で表示されるが、日本語表示することもできる。
コンソール左メニューより、[歯車マーク] - [デバイス] - [言語]を選択する。
![スクリーンショット 2017-05-24 15.09.30.png](https://qiita-image-store.s3.amazonaws.com/0/121209/6b98ce94-a900-10cc-cf2a-16828604968f.png)

[ja]をクリックし、[管理状態を有効にする]にチェックをいれ、適用する。
![ja02.png](https://qiita-image-store.s3.amazonaws.com/0/121209/6d735634-a9c4-677b-50cb-49dd751f076a.png)