tcp.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. /* eslint no-cond-assign:0 */
  17. while ((evt = buffer.shift())) {
  18. write(evt);
  19. }
  20. }
  21. function createSocket() {
  22. debug(`appender creating socket to ${config.host || 'localhost'}:${config.port || 5000}`);
  23. endMsg = `${config.endMsg || '__LOG4JS__'}`;
  24. socket = net.createConnection(config.port || 5000, config.host || 'localhost');
  25. socket.on('connect', () => {
  26. debug('socket connected');
  27. emptyBuffer();
  28. canWrite = true;
  29. });
  30. socket.on('drain', () => {
  31. debug('drain event received, emptying buffer');
  32. canWrite = true;
  33. emptyBuffer();
  34. });
  35. socket.on('timeout', socket.end.bind(socket));
  36. socket.on('error', (e) => {
  37. debug('connection error', e);
  38. canWrite = false;
  39. emptyBuffer();
  40. });
  41. socket.on('close', createSocket);
  42. }
  43. createSocket();
  44. function log(loggingEvent) {
  45. if (canWrite) {
  46. write(loggingEvent);
  47. } else {
  48. debug('buffering log event because it cannot write at the moment');
  49. buffer.push(loggingEvent);
  50. }
  51. }
  52. log.shutdown = function (cb) {
  53. debug('shutdown called');
  54. if (buffer.length && shutdownAttempts) {
  55. debug('buffer has items, waiting 100ms to empty');
  56. shutdownAttempts -= 1;
  57. setTimeout(() => {
  58. log.shutdown(cb);
  59. }, 100);
  60. } else {
  61. socket.removeAllListeners('close');
  62. socket.end(cb);
  63. }
  64. };
  65. return log;
  66. }
  67. function configure(config, layouts) {
  68. debug(`configure with config = ${config}`);
  69. let layout = function (loggingEvent) {
  70. return loggingEvent.serialise();
  71. };
  72. if (config.layout) {
  73. layout = layouts.layout(config.layout.type, config.layout);
  74. }
  75. return appender(config, layout);
  76. }
  77. module.exports.configure = configure;