logger.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { type DiagLogger, diag } from '@opentelemetry/api';
  2. import loggerFactory from '~/utils/logger';
  3. const logger = loggerFactory('growi:opentelemetry:diag');
  4. class DiagLoggerPinoAdapter implements DiagLogger {
  5. private parseMessage(
  6. message: string,
  7. args: unknown[],
  8. ): [logMessage: string, data: object] {
  9. let logMessage = message;
  10. let data = {};
  11. // check whether the message is a JSON string
  12. try {
  13. const parsedMessage = JSON.parse(message);
  14. if (typeof parsedMessage === 'object' && parsedMessage !== null) {
  15. data = parsedMessage;
  16. // if parsed successfully, use 'message' property as log message
  17. logMessage =
  18. 'message' in data && typeof data.message === 'string'
  19. ? data.message
  20. : message;
  21. }
  22. } catch (_e) {
  23. // do nothing if the message is not a JSON string
  24. }
  25. // merge additional data
  26. if (args.length > 0) {
  27. const argsData = (args as any).reduce((acc, arg) => {
  28. if (typeof arg === 'string') {
  29. try {
  30. const parsed = JSON.parse(arg);
  31. return { ...acc, ...parsed };
  32. } catch (_e) {
  33. return { ...acc, additionalInfo: arg };
  34. }
  35. }
  36. return { ...acc, ...arg };
  37. }, {});
  38. data = { ...data, ...argsData };
  39. }
  40. return [logMessage, data];
  41. }
  42. error(message: string, ...args): void {
  43. const [msg, data] = this.parseMessage(message, args);
  44. logger.error(data, msg);
  45. }
  46. warn(message: string, ...args): void {
  47. const [msg, data] = this.parseMessage(message, args);
  48. logger.warn(data, msg);
  49. }
  50. info(message: string, ...args): void {
  51. const [msg, data] = this.parseMessage(message, args);
  52. logger.info(data, msg);
  53. }
  54. debug(message: string, ...args): void {
  55. const [msg, data] = this.parseMessage(message, args);
  56. logger.debug(data, msg);
  57. }
  58. verbose(message: string, ...args): void {
  59. const [msg, data] = this.parseMessage(message, args);
  60. logger.trace(data, msg);
  61. }
  62. }
  63. export const initLogger = (): void => {
  64. // Enable global logger for OpenTelemetry
  65. diag.setLogger(new DiagLoggerPinoAdapter());
  66. };