This project is based on Pino Gelf
GELF transformer is a tool which receives json formatted logs from the stdin and transforms them into GELF format GELF It can also use a custom mapping schema to fill the output log with more data.
npm i -g gelf-transformer
If your application is pushing logs to the standard output then pipe them to gelf transformer.
node your-app.js | gelf-transformer log <options>
gelf-transformer log --help
| Switch | Description | Default | Notes | 
|---|---|---|---|
| -h | Host | 127.0.0.1 | Graylog server host | 
| -p | Port | 12201 | Graylog server port | 
| -m | Maximum Chunk Size | 1420 | |
| -c | Custom schema | false | You can provide a schema which will define which information from your original logs will be visible in the graylog formatted log | 
| -v | Verbose mode | false | Output GELF to console | 
| -t | Start sending logs to Graylog | false | It will start to send logs to the defined graylog server | 
Given the log message (formatted as JSON for readability):
{
  "pid":16699,
  "hostname":"han",
  "name":"gelf-test-app",
  "level":30,
  "time":1481840140708,
  "msg":"request completed",
  "customField":"test",
  "res":{"statusCode":304},
  "responseTime":8,
  "req":{
    "method":"GET",
    "headers":{
      "host":"localhost:3000",
      "user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14"}
    },
  "v":1
}
Given custom schema json file (my_custom_schema.json):
{
  "title": "GELF Schema",
  "type": "object",
  "properties": {
    "_status_code": {
      "type": "integer",
      "source": "res.statusCode"
    },
    "_user_agent": {
      "type": "string",
      "source": "req.headers.user-agent"
    },
    "customField": {
      "type": "string"
    }
  }
}
And the usage:
node server.js | gelf-transformer log -v -c my_custom_schema.json
Gelf Transformer will show the following message to your Graylog server (formatted here as JSON for readability):
{
  "version":"1.1",
  "host":"han",
  "short_message":"request completed",
  "full_message":"request completed",
  "timestamp":1481840140.708,
  "level":6,
  "facility":"gelf-test-app",
  "_status_code":304,
  "_user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
  "customField":"test"
}
Right now automatic mapping of fields is done as follows:
| Output GELF | Input log | Notes | 
|---|---|---|
| version | - | Hardcoded to 1.1 per GELF docs | 
| host | hostname | |
| short_message | msg | This message is truncated to 64 characters | 
| full_message | msg | msg is not truncated | 
| timestamp | time | |
| level | level | Default level codes from Pino are mapped to SysLog levels1 | 
| facility | name | deprecated | 
By default Gelf Transfomer will log level from a Pino format to syslog format:
| Pino Log Level Value | Pino Log Level Name | SysLog Level | 
|---|---|---|
| 10 | Trace | Debug | 
| 20 | Debug | Debug | 
| 30 | Info | Info | 
| 40 | Warn | Warning | 
| 50 | Error | Error | 
| 60 | Fatal | Critical | 
Note: A log messages without a level map to SysLog Critical
TBD
The implementation of Pino GELF is based in large part on pino-syslog and gelf-node.