Docs Menu
Docs Home
/ /
Atlas App Services
/

애플리케이션 로그 보기

이 페이지의 내용

  • App Services UI
  • 로그 필터링
  • 로그 항목 수 제한
  • 로그 다운로드
  • 앱 서비스 CLI
  • 최근 로그 보기
  • 실시간 테일 로그
  • 오류 로그 보기
  • 유형별 로그 필터링
  • 날짜 범위에 대한 로그 보기
  • App Services API
  • 최근 로그 가져오기
  • 날짜 범위에 대한 로그 가져오기
  • 페이지가 매겨진 로그 가져오기

App Services UI에서는 애플리케이션의 로그를 보고, 필터링하고, 검색하고, 다운로드할 수 있습니다. 앱 로그를 보려면 왼쪽 탐색 메뉴에서 Logs 을(를) 클릭합니다.

App Services UI에서 로그 보기

드롭다운 메뉴를 사용하면 사전 정의된 유형의 로그 항목과 항목 상태를 기준으로 필터링할 수 있습니다. 날짜 범위를 지정하고, 사용자 ID로 필터링하고, 특정 요청 ID와 연결된 항목만 표시할 수도 있습니다.

자리 표시자 텍스트 Max # of Logs 가 있는 텍스트 필드에 페이지에 표시할 최대 결과 수를 입력합니다. 한도를 초과하는 기록이 더 많은 경우 로그 항목 목록 하단에 Load More 버튼이 표시됩니다.

Apply 버튼 오른쪽에 있는 다운로드 버튼을 클릭하여 필터 기준을 충족하는 로그 항목(또는 필터를 지정하지 않은 경우 모든 로그 항목)을 다운로드합니다. 이 버튼을 클릭하면 적용할 필터를 확인하고 결과 수를 제한(선택 사항)할 수 있는 대화 상자가 나타납니다. 결과 로그 항목 collection은 .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

--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"

관리자 API 로그 엔드포인트를 호출하여 HTTPS를 통해 애플리케이션의 로그에 액세스 할 수 있습니다.

관리자 API를 사용하려면 프로젝트 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개를 반환하려면 추가 매개변수 없이 로깅 엔드포인트를 호출합니다.

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;
}
}

돌아가기

앱 활동 모니터링