utils/logging.js (29 lines of code) (raw):
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import Pino from 'pino';
import PinoHttp from 'pino-http';
/**
* Set project Id for log correlation in request-based logger
* @param {string} projectId - Google Cloud Platform Project Id
*/
let project;
export const initLogCorrelation = (projectId) => {
project = projectId;
};
/**
* Create a custom formatter to set the "severity" property in the JSON payload
* to the log level to be automatically parsed
* https://github.com/winstonjs/winston#creating-custom-formats
* https://cloud.google.com/run/docs/logging#special-fields
* https://getpino.io/#/docs/api?id=formatters-object
*/
const formatters = {
level(label) {
return { severity: label };
},
};
/**
* Initialize pino logger
*/
export const logger = Pino({
formatters,
// Set log message property name to "message" for automatic parsing
messageKey: 'message',
});
/**
* Create request-based logger with trace ID field for logging correlation
* For more info, see https://cloud.google.com/run/docs/logging#correlate-logs
*/
export const pinoHttp = PinoHttp({
logger,
reqCustomProps: function (req) {
const traceHeader = req.header('X-Cloud-Trace-Context');
let trace;
if (traceHeader) {
const [traceId] = traceHeader.split('/');
trace = `projects/${project}/traces/${traceId}`;
}
return {
'logging.googleapis.com/trace': trace,
};
},
});