查看应用程序日志
在此页面上
App Services 用户界面
您可以在 App Services 用户界面中查看、筛选、搜索和下载应用程序的日志。 要查看应用程序的日志,请单击左侧导航菜单中的 Logs 。
筛选日志
下拉菜单可按预定义的日志条目类型和条目状态进行筛选。 您还可以指定日期范围、按用户 ID 筛选以及仅显示与特定请求 ID 关联的条目。
限制日志条目的数量
在带有占位符文本Max # of Logs的文本字段中,输入要在页面上显示的最大结果数。 如果记录数量超出限制,您将在日志条目列表底部看到一个Load More按钮。
下载日志
单击Apply按钮右侧的下载按钮,下载符合筛选条件的日志条目(如果未指定任何筛选器,则下载所有日志条目)。 单击此按钮时,将出现一个对话框,确认将应用的筛选器并提示您(可选)限制结果数量。 生成的日志条目collection位于 .zip 包含单个 JSON 文件的文件。
App Services CLI
您可以在终端或使用 App Services CLI 的 Shell 脚本中访问应用程序的日志。
查看最近的日志
要返回应用程序的 100 个最新日志条目,请运行 appservices
logs list
。
appservices logs list
实时跟踪日志
您可以使用--tail
标志打开一个流,显示传入的应用程序日志。
appservices logs list --tail
查看错误日志
您可以使用--errors
标志仅查看错误日志。 如果不指定该标志,该命令将同时返回错误日志和常规日志。
appservices logs list --errors
按类型筛选日志
您可以使用--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 字符串,您可以单独或一起使用它们。
appservices logs list --start="2021-01-01T00:00:00.000+0000" --end="2021-02-01T00:00:00.000+0000"
App Services API
您可以调用 Admin API日志端点,通过 HTTPS访问权限应用程序的日志。
要使用 Admin API,您需要项目 ID、应用 ID 和身份验证档案。 要了解如何查找这些令牌,请参阅项目和应用程序 ID以及获取身份验证令牌。
本节中的示例在 Function 中使用了以下辅助函数:
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 个最新日志条目,请调用不带其他参数的日志记录端点:
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
字段中的一个或全部调用日志记录端点:
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; } }