I was able to accomplish this in a few steps.
- Create a shared util in
~/shared/utils/logging.ts.
- Create a plugin that exposes the logger to be used in app land.
- Create a server util to use the logger directly in nitro land.
shared util:
import { createConsola } from 'consola';
export const createLogger = () => {
const logger = createConsola({ fancy: true, level: 5, formatOptions: { colors: true, date: true } });
if (!import.meta.dev) {
logger.setReporters([
{
log({ type, tag, args, date }) {
const newLogObj = {
level: type,
tag,
args,
date,
};
console.log(newLogObj)
},
},
]);
}
return logger;
};
plugin:
import { createLogger } from "~/shared/utils/logging";
export default defineNuxtPlugin(nuxtApp => {
const logger = createLogger();
nuxtApp.provide('logger', logger);
const customFetch = $fetch.create({
onRequest: ({ request }) => {
logger.info(import.meta.server ? "server" : "client", "fetch request", request);
},
})
nuxtApp.provide('cfetch', customFetch);
})
server/utils/logger.ts
import { createLogger } from '~/shared/utils/logging';
export const logger = createLogger();
(ssr usage)
server/plugins/logger.ts
export default defineNitroPlugin(nitroApp => {
nitroApp.hooks.hook('beforeResponse', (event) => {
const headers = getHeaders(event);
logger.log("on before response", event.path, { headers });
});
nitroApp.hooks.hook('afterResponse', (event) => {
const headers = getHeaders(event);
logger.info("on after response", event.path, { headers });
});
nitroApp.hooks.hook('request', (event) => {
logger.info("on request", event.path);
});
})