我正在使用 App Engine 标准和 Nodejs 做我的第一个 App Engine 项目。我喜欢这种体验,但我现在在错误记录方面遇到问题。
App 引擎似乎会自动记录每个应用程序错误,严重程度为“错误”。它使用一个“ERROR”日志条目来记录错误,并为每一行使用许多“INFO”条目来记录结构化日志 JSON 的每一行:
在此屏幕截图中,您可以看到 App Engine 自动创建的第一个日志,严重性为“错误”。然后许多“INFO”日志显示同一错误的 json 有效负载。黄色警告日志是我使用 App Engine 中的 @google-cloud/logging Nodejs 包创建的日志,该日志具有“警告”严重性的相同错误。
有没有办法阻止 App Engine 标准自动记录应用程序中的中间件捕获的应用程序错误?或者有没有一种方法可以在不使用许多“INFO”日志的情况下以更好的方式记录错误,以便日志以良好的 json 格式构建?
我还意识到,我使用 App Engine 标准中的 @google-cloud/logging Nodejs 包记录的错误不会添加到错误报告中。仅由 App Engine 自动记录的错误。有没有办法将这些日志添加到错误报告中?
谢谢!
这里有一些代码片段,如果它可以帮助您回答或讨论这个主题:
throw new AppCustomError({isPublic:"public",logSeverity:"WARNING",statusCode:403,errorCode:10010,dataToLog:req.dataToLog,
message:"GETtextsData - User is not logged in."});
class AppCustomError extends Error{ //appCustomError is a custom Error class
constructor(errorObject){
super();
this.message=errorObject.message;
this.errorCode=errorObject.errorCode;
this.statusCode=errorObject.statusCode;
this.status=errorObject.statusCode >= 400 && errorObject.statusCode < 500 ? "fail" : "error";
this.logSeverity=errorObject.logSeverity;
this.dataToLog=errorObject.dataToLog;
if(errorObject.isPublic==="public"){
this.isPublic=true;
}else{
this.isPublic=false;
}
Error.captureStackTrace(this,this.connector);
}}export default AppCustomError;
使用 logSync() 方法创建日志的位置:
if(process.env.GAE_APPLICATION){
env="gae";
logPayload.LOGGERenv=env;
log=logging.logSync(logName); //Using logsync will use a logging agent and stdout the log. Parameters will be set automatically. This is best for serverless applications like GAE. https://cloud.google.com/nodejs/docs/reference/logging/latest#writing-to-stdout
metadata.GAE_deployment_id=process.env.GAE_DEPLOYMENT_ID,
metadata.GAE_instance_id=process.env.GAE_INSTANCE,
metadata.GAE_runtime=process.env.GAE_RUNTIME}
App Engine 自动记录错误: 您无法阻止这种情况,但您可以控制自定义错误日志记录。
您可以尝试以下步骤:
使用
@google-cloud/logging
进行结构化日志:创建清晰的消息、严重性级别和相关数据。
可选的错误报告集成:使用
@google-cloud/error-reporting
明确报告错误以进行集中管理。
//JavaScript Example:
const { Reporting } = require('@google-cloud/error-reporting');
const errorsClient = new Reporting({
projectId: 'your-project-id',
// Other client options
});
// ... (Your application logic)
try {
// Your code
} catch (error) {
errorsClient.reportError(error);
throw error; // Re-throw to trigger App Engine's automatic logging
}
参考文档: