/**
* Wrapper for the StartQueryCommand. Uses a static query string
* for consistency.
* @param {[Date, Date]}dateRange
* @param {number}maxLogs
* @returns {Promise<{ queryId: string }>}
*/async_startQuery([startDate, endDate], maxLogs = 10000){try{returnawaitthis.client.send(
new StartQueryCommand({logGroupNames: this.logGroupNames,
queryString: "fields @timestamp, @message | sort @timestamp asc",
startTime: startDate.valueOf(),
endTime: endDate.valueOf(),
limit: maxLogs,
}),
);
} catch (err) {/** @type {string}*/const message = err.message;
if (message.startsWith("Query's end date and time")) {// This error indicates that the query's start or end date occur// before the log group was created.thrownew DateOutOfBoundsError(message);
}
throw err;
}
}
如需 API 詳細資訊,請參閱 AWS SDK for JavaScript API 參考中的 StartQuery。
defperform_query(self, date_range):"""
Performs the actual CloudWatch log query.
:param date_range: A tuple representing the start and end datetime for the query.
:type date_range: tuple
:return: A list containing the query results.
:rtype: list
"""
client = boto3.client("logs")
try:
try:
start_time = round(
self.date_utilities.convert_iso8601_to_unix_timestamp(date_range[0])
)
end_time = round(
self.date_utilities.convert_iso8601_to_unix_timestamp(date_range[1])
)
response = client.start_query(
logGroupName=self.log_group,
startTime=start_time,
endTime=end_time,
queryString=self.query_string,
limit=self.limit,
)
query_id = response["queryId"]
except client.exceptions.ResourceNotFoundException as e:
raise DateOutOfBoundsError(f"Resource not found: {e}")
whileTrue:
time.sleep(1)
results = client.get_query_results(queryId=query_id)
if results["status"] in [
"Complete",
"Failed",
"Cancelled",
"Timeout",
"Unknown",
]:
return results.get("results", [])
except DateOutOfBoundsError:
return []
def_initiate_query(self, client, date_range, max_logs):"""
Initiates the CloudWatch logs query.
:param date_range: A tuple representing the start and end datetime for the query.
:type date_range: tuple
:param max_logs: The maximum number of logs to retrieve.
:type max_logs: int
:return: The query ID as a string.
:rtype: str
"""try:
start_time = round(
self.date_utilities.convert_iso8601_to_unix_timestamp(date_range[0])
)
end_time = round(
self.date_utilities.convert_iso8601_to_unix_timestamp(date_range[1])
)
response = client.start_query(
logGroupName=self.log_group,
startTime=start_time,
endTime=end_time,
queryString=self.query_string,
limit=max_logs,
)
return response["queryId"]
except client.exceptions.ResourceNotFoundException as e:
raise DateOutOfBoundsError(f"Resource not found: {e}")
如需 API 詳細資訊,請參閱 SDK AWS for Python (Boto3) API 參考中的 StartQuery。
/**
* Wrapper for the StartQueryCommand. Uses a static query string
* for consistency.
* @param {[Date, Date]}dateRange
* @param {number}maxLogs
* @returns {Promise<{ queryId: string }>}
*/async_startQuery([startDate, endDate], maxLogs = 10000){try{returnawaitthis.client.send(
new StartQueryCommand({logGroupNames: this.logGroupNames,
queryString: "fields @timestamp, @message | sort @timestamp asc",
startTime: startDate.valueOf(),
endTime: endDate.valueOf(),
limit: maxLogs,
}),
);
} catch (err) {/** @type {string}*/const message = err.message;
if (message.startsWith("Query's end date and time")) {// This error indicates that the query's start or end date occur// before the log group was created.thrownew DateOutOfBoundsError(message);
}
throw err;
}
}
如需 API 詳細資訊,請參閱 AWS SDK for JavaScript API 參考中的 StartQuery。