logger.ts 2.0 KB

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