tcp.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const debug = require('debug')('log4js:tcp');
  2. const net = require('net');
  3. function appender(config, layout) {
  4. let canWrite = false;
  5. const buffer = [];
  6. let socket;
  7. let shutdownAttempts = 3;
  8. let endMsg = '__LOG4JS__';
  9. function write(loggingEvent) {
  10. debug('Writing log event to socket');
  11. canWrite = socket.write(`${layout(loggingEvent)}${endMsg}`, 'utf8');
  12. }
  13. function emptyBuffer() {
  14. let evt;
  15. debug('emptying buffer');
  16. while ((evt = buffer.shift())) {
  17. write(evt);
  18. }
  19. }
  20. function createSocket() {
  21. debug(
  22. `appender creating socket to ${config.host || 'localhost'}:${
  23. config.port || 5000
  24. }`
  25. );
  26. endMsg = `${config.endMsg || '__LOG4JS__'}`;
  27. socket = net.createConnection(
  28. config.port || 5000,
  29. config.host || 'localhost'
  30. );
  31. socket.on('connect', () => {
  32. debug('socket connected');
  33. emptyBuffer();
  34. canWrite = true;
  35. });
  36. socket.on('drain', () => {
  37. debug('drain event received, emptying buffer');
  38. canWrite = true;
  39. emptyBuffer();
  40. });
  41. socket.on('timeout', socket.end.bind(socket));
  42. socket.on('error', (e) => {
  43. debug('connection error', e);
  44. canWrite = false;
  45. emptyBuffer();
  46. });
  47. socket.on('close', createSocket);
  48. }
  49. createSocket();
  50. function log(loggingEvent) {
  51. if (canWrite) {
  52. write(loggingEvent);
  53. } else {
  54. debug('buffering log event because it cannot write at the moment');
  55. buffer.push(loggingEvent);
  56. }
  57. }
  58. log.shutdown = function (cb) {
  59. debug('shutdown called');
  60. if (buffer.length && shutdownAttempts) {
  61. debug('buffer has items, waiting 100ms to empty');
  62. shutdownAttempts -= 1;
  63. setTimeout(() => {
  64. log.shutdown(cb);
  65. }, 100);
  66. } else {
  67. socket.removeAllListeners('close');
  68. socket.end(cb);
  69. }
  70. };
  71. return log;
  72. }
  73. function configure(config, layouts) {
  74. debug(`configure with config = ${config}`);
  75. let layout = function (loggingEvent) {
  76. return loggingEvent.serialise();
  77. };
  78. if (config.layout) {
  79. layout = layouts.layout(config.layout.type, config.layout);
  80. }
  81. return appender(config, layout);
  82. }
  83. module.exports.configure = configure;