logger.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const fs = require('fs');
  2. const path = require('path');
  3. const LOG_FILE = path.join(process.cwd(), 'application.log');
  4. /**
  5. * Format log entry dengan timestamp dan metadata
  6. */
  7. const formatLog = (level, context, message, meta = {}) => {
  8. const timestamp = new Date().toISOString();
  9. const metaStr = Object.keys(meta).length ? ` | ${JSON.stringify(meta)}` : '';
  10. return `[${timestamp}] [${level}] [${context}] ${message}${metaStr}\n`;
  11. };
  12. /**
  13. * Write ke file synchronously (simple, no dependencies)
  14. * ponytail: pakai sync untuk guarantee write, upgrade to stream jika high volume
  15. */
  16. const writeLog = (entry) => {
  17. try {
  18. fs.appendFileSync(LOG_FILE, entry, 'utf8');
  19. } catch (err) {
  20. console.error('[Logger] Failed to write log file:', err.message);
  21. }
  22. };
  23. module.exports = {
  24. logInfo: (context, message, meta = {}) => {
  25. const entry = formatLog('INFO', context, message, meta);
  26. console.log(entry.trim());
  27. writeLog(entry);
  28. },
  29. logError: (context, message, meta = {}) => {
  30. const entry = formatLog('ERROR', context, message, meta);
  31. console.error(entry.trim());
  32. writeLog(entry);
  33. },
  34. logWarn: (context, message, meta = {}) => {
  35. const entry = formatLog('WARN', context, message, meta);
  36. console.warn(entry.trim());
  37. writeLog(entry);
  38. },
  39. };