Docs 菜单
Docs 主页
/ /
Atlas App Services
/

查看应用程序日志

在此页面上

  • App Services 用户界面
  • 筛选日志
  • 限制日志条目的数量
  • 下载日志
  • App Services CLI
  • 查看最近的日志
  • 实时跟踪日志
  • 查看错误日志
  • 按类型筛选日志
  • 查看日期范围内的日志
  • App Services API
  • 获取最近的日志
  • 获取日期范围内的日志
  • 获取分页日志

您可以在 App Services 用户界面中查看、筛选、搜索和下载应用程序的日志。 要查看应用程序的日志,请单击左侧导航菜单中的 Logs

在 App Services 用户界面中查看日志

下拉菜单可按预定义的日志条目类型和条目状态进行筛选。 您还可以指定日期范围、按用户 ID 筛选以及仅显示与特定请求 ID 关联的条目。

在带有占位符文本Max # of Logs的文本字段中,输入要在页面上显示的最大结果数。 如果记录数量超出限制,您将在日志条目列表底部看到一个Load More按钮。

单击Apply按钮右侧的下载按钮,下载符合筛选条件的日志条目(如果未指定任何筛选器,则下载所有日志条目)。 单击此按钮时,将出现一个对话框,确认将应用的筛选器并提示您(可选)限制结果数量。 生成的日志条目collection位于 .zip 包含单个 JSON 文件的文件。

在 App Services 用户界面中下载日志

您可以在终端或使用 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"

您可以调用 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_dateend_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;
}
}

后退

监控应用活动