Docs Menu
Docs Home
/ /
Atlas App Services
/

アプリケーション ログの表示

項目一覧

  • アプリ サービス UI
  • フィルター ログ
  • ログ エントリ数の制限
  • ログのダウンロード
  • Atlas App Services CLI
  • 最近のログを表示
  • リアルタイムのログの記録
  • エラー ログの表示
  • タイプによるログのフィルタリング
  • 日付範囲のログの表示
  • アプリ サービス API
  • 最近のログを取得
  • 日付範囲のログを取得
  • ページ分割されたログの取得

App Services UI では、アプリケーションのログを表示、フィルタリング、検索、ダウンロードできます。 アプリのログを表示するには、左側のナビゲーション メニューで [ Logsをクリックします。

App Services UI でのログの表示

ドロップダウン メニューにより、ログ エントリの事前定義されたタイプ、エントリのステータスによるフィルタリングが有効になります。 また、日付範囲を指定したり、ユーザー ID でフィルタリングして、特定のリクエスト ID に関連付けられたエントリのみを表示したりすることもできます。

プレースホルダー テキストMax # of Logsが含まれるテキスト フィールドに、ページに表示する結果の最大数を入力します。 制限を超えるレコードがある場合は、ログ エントリのリストの下部に [ Load More ] ボタンが表示されます。

[ Applyボタンの右側にあるダウンロード ボタンをクリックして、フィルタ条件を満たすログ エントリ(またはフィルタを指定していない場合はすべてのログ エントリ)をダウンロードします。 このボタンをクリックすると、適用されるフィルターを確認するダイアログが表示され、(任意)結果数を制限するよう求められます。 ログ エントリの結果として得られるコレクションは、.zip ファイルに 単一の JSON ファイルを含む ファイル。

App Services UI でのログのダウンロード

App Services CLI を使用して、ターミナルまたは shell スクリプトからアプリケーションのログにアクセスできます。

アプリケーションの最新のログ エントリ 100 件を返すには、 appservices logs listを実行します。

appservices logs list

--tailフラグを使用して、アプリケーション ログを受信時に表示するストリームを開くことができます。

appservices logs list --tail

エラー ログのみを表示するには、 --errorsフラグを使用します。 フラグを指定しない場合、 コマンドはエラー ログと通常のログの両方を返します。

appservices logs list --errors

1 つ以上の特定のタイプのログを表示するには、 --typeフラグを使用します。 タイプを指定しない場合、コマンドはすべてのタイプのログを返します。

次のタイプが有効です。

  • auth

  • function

  • push

  • service

  • trigger

  • graphql

  • sync

  • schema

  • trigger_error_handler

  • log_forwarder

  • endpoint

appservices logs list --type=function --type=trigger

一定の日付範囲のログを表示するには、 --start--endフラグを使用します。 フラグは ISODate string を受け入れ、個別に使用することも併用することもできます。

appservices logs list --start="2021-01-01T00:00:00.000+0000" --end="2021-02-01T00:00:00.000+0000"

管理 API ログ エンドポイントを呼び出すと、HTTPS 経由でアプリケーションのログにアクセスできます。

Admin API を使用するには、プロジェクト ID、アプリ ID、および認証情報が必要です。 これらを見つける方法については、「プロジェクト ID とアプリケーション ID 」および「 認証トークンを取得する 」を参照してください。

このセクションの例では、 関数 で次のヘルパー関数を使用します

async function authenticate(publicApiKey, privateApiKey) {
const result = await context.http.post({
url: `${ADMIN_API_BASE_URL}/auth/providers/mongodb-cloud/login`,
headers: {
"Content-Type": ["application/json"],
"Accept": ["application/json"],
},
body: {
"username": publicApiKey,
"apiKey": privateApiKey,
},
encodeBodyAsJSON: true
})
return EJSON.parse(result.body.text());
}
function formatQueryString(queryParams) {
const params = Object.entries(queryParams);
return params.length > 0
? "?" + params.map(([a, b]) => `${a}=${b}`).join("&")
: ""
}

アプリケーションの最新の 100 件のログ エントリを返すには、追加のパラメータなしで Logging エンドポイントを呼び出します。

const ADMIN_API_BASE_URL = "https://services.cloud.mongodb.com/api/admin/v3.0";
exports = async function() {
// Get values that you need for requests
const projectId = "<Atlas Project ID>";
const appId = "<App ID>";
const publicApiKey = "<Atlas Public API Key>";
const privateApiKey = "<Atlas Private API Key>";
// Authenticate with the Atlas API Key
const { access_token } = await authenticate(publicApiKey, privateApiKey);
// Get logs for your App
const logsEndpoint = `${ADMIN_API_BASE_URL}/groups/${projectId}/apps/${appId}/logs`;
const request = {
"url": logsEndpoint,
"headers": {
"Authorization": [`Bearer ${access_token}`]
}
};
const result = await context.http.get(request);
const logs = EJSON.parse(result.body.text());
return logs;
}

特定の日付範囲のログエントリを返すには、start_date フィールドとend_date フィールドのいずれかまたは両方を使用してログエンドポイントを呼び出します。

注意

結果のページ分割

指定した日付範囲に100を超えるログ エントリが含まれる場合、すべてのエントリにアクセスするには複数のクエリを実行する必要があります。 方法については、 「 ページ分割されたログを取得する 」を参照してください。

const ADMIN_API_BASE_URL = "https://services.cloud.mongodb.com/api/admin/v3.0";
exports = async function() {
// Get values that you need for requests
const projectId = "<Atlas Project ID>";
const appId = "<App ID>";
const publicApiKey = "<Atlas Public API Key>";
const privateApiKey = "<Atlas Private API Key>";
// Authenticate with the Atlas API Key
const { access_token } = await authenticate(publicApiKey, privateApiKey);
// Get logs for your App
const logsEndpoint = `${ADMIN_API_BASE_URL}/groups/${projectId}/apps/${appId}/logs`;
const request = {
"url": logsEndpoint + formatQueryString({
start_date: "2019-07-01",
end_date: "2019-07-31",
}),
"headers": {
"Authorization": [`Bearer ${access_token}`]
}
};
const result = await context.http.get(request);
const logs = EJSON.parse(result.body.text());
return logs;
}

App Services は、リクエストごとに最大 100 個のログ エントリを返します。 クエリが 100 を超えるログエントリに一致する場合、API は 100 件の結果の最初の「ページ」を返し、最大 100 件のエントリの次のページを取得するために指定できる追加のパラメーターを含めます。

注意

ページに分けた応答

ページ割りされた応答は次のドキュメントのようになります。ここでは、 nextEndDatenextSkipは任意です。

{
logs: [<Log Entry>, ...],
nextEndDate: "<End date of the next page>",
nextSkip: <Offset of the next page>,
}
const ADMIN_API_BASE_URL = "https://services.cloud.mongodb.com/api/admin/v3.0";
exports = async function() {
// Get values that you need for requests
const projectId = "<Atlas Project ID>";
const appId = "<App ID>";
const publicApiKey = "<Atlas Public API Key>";
const privateApiKey = "<Atlas Private API Key>";
// Authenticate with the Atlas API Key
const { access_token } = await authenticate(publicApiKey, privateApiKey);
// Get logs for your App
const pager = new LogPager(projectId, appId, access_token);
const firstPage = await pager.getNextPage();
const secondPage = await pager.getNextPage(firstPage);
const thirdPage = await pager.getNextPage(secondPage);
const allLogs = await pager.getAllLogs();
}
class LogPager {
constructor(projectId, appId, access_token, queryParams={}) {
this.logsEndpoint = `${ADMIN_API_BASE_URL}/groups/${projectId}/apps/${appId}/logs`;
this.queryParams = queryParams;
this.authHeaders = { Authorization: [`Bearer ${access_token}`] }
}
async getNextPage(prevPage) {
const { nextEndDate, nextSkip } = prevPage || {};
if(prevPage && !nextEndDate) {
throw new Error("Paginated API does not have any more pages.")
}
const request = {
"headers": this.authHeaders,
"url": this.logsEndpoint + formatQueryString({
...this.queryParams,
end_date: nextEndDate,
skip: nextSkip,
}),
}
const result = await context.http.get(request);
const nextPage = EJSON.parse(result.body.text());
return nextPage
}
async getAllLogs() {
// Note: If your query parameters match too many logs this might time out
let logs = []
let hasNext = true;
let prevPage = null
while(hasNext) {
const page = await getNextPage(prevPage);
logs = logs.concat(page.logs);
hasNext = page.nextEndDate
prevPage = page
}
return logs;
}
}

戻る

アプリのアクティビティの監視