node.js syslog client 구현

소개

최근 AWS Lambda를 이용하여 AWS에서 발생되는 각종 로그들을 Syslog Format 으로 전송하고 통합하기 위해 Syslog Client 를 구현하고 있습니다. 이에 사전에 분석해본 Syslog Format 을 기반으로 Node.js를 통한 Syslog Client를 구현해 보았습니다.

Syslog Format

Syslog Client 구현을 위해 사용한 Syslog Format은 RFC5424 에 명시되어있는 포맷을 이용 하였습니다.

<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8

# <priority>VERSION ISOTIMESTAMP HOSTNAME APPLICATION PID MESSAGEID STRUCTURED-DATA MSG

Node.js 로 Syslog Client 구현

Syslog 는 UDP 혹은 TCP 로 전송할 수 있는데, 아래 코드는 전송에 대한 신뢰성을 보장하고자 TCP 를 이용하여 전송하도록 하였습니다.

그리고 json log 를 받아 전송한다는 가정하에 JSON.stringify 를 통해 파라메터로 받은 jsonEvent 를 변형하여 전송하도록 하였습니다.

const net = require('net');

// Send syslog
const sendSyslog = async (jsonEvent) => {
  const date = new Date();
  const isotimestamp = date.toISOString();
  const host = '10.1.1.10';    // host ip 변경 가능
  const port = 514;            // port 변경 가능
  const syslogFormat = {       // syslog format 에 따라 별도의 설정 가능
    priority: 134,
    version: 1,
    isotimestamp,
    hostname: 'syslog-client',
  };
  const eventMsg = JSON.stringify(jsonEvent);
  // <priority>VERSION ISOTIMESTAMP HOSTNAME APPLICATION PID MESSAGEID STRUCTURED-DATA MSG
  const cvtMsg = `<${syslogFormat.priority}>${syslogFormat.version} ${syslogFormat.isotimestamp} ${syslogFormat.hostname} ${eventMsg}\n`;

  const client = new net.Socket();
  client.connect(port, host, () => {
    console.log('Connected');
    client.write(cvtMsg);
    console.log(cvtMsg);
    client.end();
  });

  client.on('close', () => {
    console.log('Connection closed');
  });

  client.on('error', (e) => {
    console.log(e);
  });
};

// syslog 로 보낼 test용 json 로그
const jsonlog = {
  logkey1: '1',
  logkey2: '/Applications/license/',
  logkey3: '123d123-123cc-123aa-234oo',
};

// sendSyslog 함수 실행
syslogClient(jsonlog);

host, port, priority, version, hostname 등은 syslog format 에 맞게 커스컴하면 원하는 syslog 전송이 가능합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Back To Top