Search code examples
firebasegoogle-cloud-functionsgoogle-cloud-logging

Writing logs with cloud logging


I'm having problems with using google-cloud/logging. My objective is to write to a file which is to be created weekly, and i have previously managed to do that. However since yesterday I kept getting this error:

Error: 3 INVALID_ARGUMENT: A monitored resource must be specified for each log entry.

So I updated the google-cloud/logging to the latest version(5.2.2) after reading up about a similar issue of monitored resource not being set automatically. Which did take care of that error, however the logs are not showing up in logs viewer after that change. My code for the logger utility is as follows

const { Logging } = require('@google-cloud/logging');

exports.LoggingUtil = class LoggingUtil {

constructor(context){
    var LogMetadata = {
        severity: "INFO",
        type: "gce_instance",
        labels: {
          function_name: process.env.FUNCTION_NAME,
          project: process.env.GCLOUD_PROJECT,
          region: process.env.FUNCTION_REGION
        }
      }
    this.metadata = {
        LogMetadata,
        labels: {
            execution_id: `${context.eventId}`
        }
    }
    const logging = new Logging();
    this.log = logging.log(this.getWeekStamp());  
}
getWeekStamp(){
    const environmentName = constants.environment.name;
    var d = new Date();
    var day = d.getDay(),
        diff = d.getDate() - day + (day == 0 ? -6:1); 
    date = new Date(d.setDate(diff)).toLocaleDateString('en-US', {  day: '2-digit', month: 'short', year: 'numeric'});
    date = date.replace(" ", "-");
    return `${date.replace(", ","-")}-week-${environmentName}`;
}
write(text){

    var entry = this.log.entry(this.metadata, text);   
    this.log.write(entry);
}

}

What have I done wrong with this? Any help is appreciated 🙏


Solution

  • I think that you error is related with the way to obtain the metadata variable, because is creating an malformed object that is not readable by the log viewer.

    In your method constructor you are creating a metadata object similar to this:

    { "LogMetadata":{  
      "severity":"INFO",
      "type":"gce_instance",
      "labels":{  
         "function_name":process.env.FUNCTION_NAME,
         "project":process.env.GCLOUD_PROJECT,
         "region":process.env.FUNCTION_REGION
       }
      }, 
      "labels":{  
      "execution_id":`${context.eventId}` 
      }}
    

    that is not a valid MonitoredResource, you can change your code in order to create a valid MonitoredResource for example

    var LogMetadata = {
        severity: "INFO",
        type: "gce_instance",
        labels: {
          function_name: process.env.FUNCTION_NAME,
          project: process.env.GCLOUD_PROJECT,
          region: process.env.FUNCTION_REGION
        }
      }
    this.metadata = LogMetadata
    this.metadata.labels["execution_id"] = `${context.eventId}`
    

    Example result object

    {"severity":"INFO",
     "type":"gce_instance",
     "labels":{"function_name":process.env.FUNCTION_NAME,
               "project":process.env.GCLOUD_PROJECT,
               "region": process.env.FUNCTION_REGION,
               "execution_id":`${context.eventId}`}
    }
    

    Additionally, you can check this example file as a reference to write logs using nodeJS.