アプリケーション ログの表示
項目一覧
アプリ サービス UI
App Services UI では、アプリケーションのログを表示、フィルタリング、検索、ダウンロードできます。 アプリのログを表示するには、左側のナビゲーション メニューで [ Logsをクリックします。
フィルター ログ
ドロップダウン メニューにより、ログ エントリの事前定義されたタイプ、エントリのステータスによるフィルタリングが有効になります。 また、日付範囲を指定したり、ユーザー ID でフィルタリングして、特定のリクエスト ID に関連付けられたエントリのみを表示したりすることもできます。
ログ エントリ数の制限
プレースホルダー テキストMax # of Logsが含まれるテキスト フィールドに、ページに表示する結果の最大数を入力します。 制限を超えるレコードがある場合は、ログ エントリのリストの下部に [ Load More ] ボタンが表示されます。
ログのダウンロード
[ Applyボタンの右側にあるダウンロード ボタンをクリックして、フィルタ条件を満たすログ エントリ(またはフィルタを指定していない場合はすべてのログ エントリ)をダウンロードします。 このボタンをクリックすると、適用されるフィルターを確認するダイアログが表示され、(任意)結果数を制限するよう求められます。 ログ エントリの結果として得られるコレクションは、.zip ファイルに 単一の JSON ファイルを含む ファイル。
Atlas App Services CLI
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
管理 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 件のエントリの次のページを取得するために指定できる追加のパラメーターを含めます。
注意
ページに分けた応答
ページ割りされた応答は次のドキュメントのようになります。ここでは、 nextEndDate
とnextSkip
は任意です。
{ 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; } }