소개
최근 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 전송이 가능합니다.