FluentLogger: fluent-logger-mbed A structured logger for Fluentd (mbed)

Dependents:   FluentLogger_Hello SNIC-FluentLogger-example

FluentLogger

Fluentd Logo

What is this ?

You can logging to Fluentd server.
This library included subset of MassagePack library.

Supported MessagePack formats(encode only)

format namefirst byte (in hex)
positive fixint0x00 - 0x7f
fixmap0x80 - 0x8f
fixarray0x90 - 0x9f
fixstr0xa0 - 0xbf
nil0xc0
false0xc2
true0xc3
float 320xca
float 640xcb
uint 80xcc
uint 160xcd
uint 320xce
uint 640xcf
int 80xd0
int 160xd1
int 320xd2
int 640xd3
str 80xd9
negative fixint0xe0 - 0xff

これは何?

Fluentd サーバにログを送信するためのライブラリです。
サブセット版のMassagePackライブラリも同梱しています。

サーバ側ダウン時の再接続機能は限定的に実装されています。 現時点での実装は送信時に切断を検知し、次回送信時に再接続する仕様です。

Committer:
YuuichiAkagawa
Date:
Mon Dec 15 15:37:23 2014 +0000
Revision:
1:6b1268731465
Parent:
0:b4815a079a4b
rename uMP functions(set_array->start_array, set_map->start_map); add uMP map functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YuuichiAkagawa 0:b4815a079a4b 1 /* fluent-logger-mbed
YuuichiAkagawa 0:b4815a079a4b 2 * Copyright (c) 2014 Yuuichi Akagawa
YuuichiAkagawa 0:b4815a079a4b 3 *
YuuichiAkagawa 0:b4815a079a4b 4 * Licensed under the Apache License, Version 2.0 (the "License");
YuuichiAkagawa 0:b4815a079a4b 5 * you may not use this file except in compliance with the License.
YuuichiAkagawa 0:b4815a079a4b 6 * You may obtain a copy of the License at
YuuichiAkagawa 0:b4815a079a4b 7 *
YuuichiAkagawa 0:b4815a079a4b 8 * http://www.apache.org/licenses/LICENSE-2.0
YuuichiAkagawa 0:b4815a079a4b 9 *
YuuichiAkagawa 0:b4815a079a4b 10 * Unless required by applicable law or agreed to in writing, software
YuuichiAkagawa 0:b4815a079a4b 11 * distributed under the License is distributed on an "AS IS" BASIS,
YuuichiAkagawa 0:b4815a079a4b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
YuuichiAkagawa 0:b4815a079a4b 13 * See the License for the specific language governing permissions and
YuuichiAkagawa 0:b4815a079a4b 14 * limitations under the License.
YuuichiAkagawa 0:b4815a079a4b 15 */
YuuichiAkagawa 0:b4815a079a4b 16
YuuichiAkagawa 0:b4815a079a4b 17 #include "FluentLogger.h"
YuuichiAkagawa 0:b4815a079a4b 18 #ifdef USE_NTP
YuuichiAkagawa 0:b4815a079a4b 19 #include <time.h>
YuuichiAkagawa 0:b4815a079a4b 20 #endif
YuuichiAkagawa 0:b4815a079a4b 21
YuuichiAkagawa 0:b4815a079a4b 22 FluentLogger::FluentLogger(const char *host, const int port, uint32_t bufsize) :
YuuichiAkagawa 0:b4815a079a4b 23 _sock(), _host(host), _port(port), _timeout(1000)
YuuichiAkagawa 0:b4815a079a4b 24 {
YuuichiAkagawa 0:b4815a079a4b 25 _mp = new uMP(bufsize);
YuuichiAkagawa 0:b4815a079a4b 26 _sock = NULL;
YuuichiAkagawa 0:b4815a079a4b 27 }
YuuichiAkagawa 0:b4815a079a4b 28
YuuichiAkagawa 0:b4815a079a4b 29 int FluentLogger::open()
YuuichiAkagawa 0:b4815a079a4b 30 {
YuuichiAkagawa 0:b4815a079a4b 31 if ( _sock != NULL ) {
YuuichiAkagawa 0:b4815a079a4b 32 return 0;
YuuichiAkagawa 0:b4815a079a4b 33 }
YuuichiAkagawa 0:b4815a079a4b 34 _sock = new TCPSocketConnection();
YuuichiAkagawa 0:b4815a079a4b 35 int ret = _sock->connect(_host, _port);
YuuichiAkagawa 0:b4815a079a4b 36 if (ret < 0)
YuuichiAkagawa 0:b4815a079a4b 37 {
YuuichiAkagawa 0:b4815a079a4b 38 _sock->close();
YuuichiAkagawa 0:b4815a079a4b 39 return -1;
YuuichiAkagawa 0:b4815a079a4b 40 }
YuuichiAkagawa 0:b4815a079a4b 41 return 0;
YuuichiAkagawa 0:b4815a079a4b 42 }
YuuichiAkagawa 0:b4815a079a4b 43
YuuichiAkagawa 0:b4815a079a4b 44 int FluentLogger::close()
YuuichiAkagawa 0:b4815a079a4b 45 {
YuuichiAkagawa 0:b4815a079a4b 46 if (_sock->is_connected()) {
YuuichiAkagawa 0:b4815a079a4b 47 _sock->close();
YuuichiAkagawa 0:b4815a079a4b 48 }
YuuichiAkagawa 0:b4815a079a4b 49 delete _sock;
YuuichiAkagawa 0:b4815a079a4b 50 _sock = NULL;
YuuichiAkagawa 0:b4815a079a4b 51 return 0;
YuuichiAkagawa 0:b4815a079a4b 52 }
YuuichiAkagawa 0:b4815a079a4b 53
YuuichiAkagawa 0:b4815a079a4b 54 int FluentLogger::log(const char *tag, const char *msg)
YuuichiAkagawa 0:b4815a079a4b 55 {
YuuichiAkagawa 0:b4815a079a4b 56 if (_sock == NULL || !_sock->is_connected()) {
YuuichiAkagawa 0:b4815a079a4b 57 if (open() < 0) {
YuuichiAkagawa 0:b4815a079a4b 58 return -1;
YuuichiAkagawa 0:b4815a079a4b 59 }
YuuichiAkagawa 0:b4815a079a4b 60 }
YuuichiAkagawa 0:b4815a079a4b 61 _mp->init();
YuuichiAkagawa 0:b4815a079a4b 62
YuuichiAkagawa 0:b4815a079a4b 63 // tag, timestamp, message
YuuichiAkagawa 1:6b1268731465 64 if (!_mp->start_array(3)) {
YuuichiAkagawa 0:b4815a079a4b 65 return -1;
YuuichiAkagawa 0:b4815a079a4b 66 }
YuuichiAkagawa 0:b4815a079a4b 67 if (!_mp->set_str(tag, strlen(tag))) {
YuuichiAkagawa 0:b4815a079a4b 68 return -1;
YuuichiAkagawa 0:b4815a079a4b 69 }
YuuichiAkagawa 0:b4815a079a4b 70 #ifdef USE_NTP
YuuichiAkagawa 0:b4815a079a4b 71 if (!_mp->set_u32(time(NULL))) {
YuuichiAkagawa 0:b4815a079a4b 72 return -1;
YuuichiAkagawa 0:b4815a079a4b 73 }
YuuichiAkagawa 0:b4815a079a4b 74 #else
YuuichiAkagawa 0:b4815a079a4b 75 if (!_mp->set_u32(0)) {
YuuichiAkagawa 0:b4815a079a4b 76 return -1;
YuuichiAkagawa 0:b4815a079a4b 77 }
YuuichiAkagawa 0:b4815a079a4b 78 #endif
YuuichiAkagawa 0:b4815a079a4b 79 if (!_mp->set_str(msg, strlen(msg))) {
YuuichiAkagawa 0:b4815a079a4b 80 return -1;
YuuichiAkagawa 0:b4815a079a4b 81 }
YuuichiAkagawa 0:b4815a079a4b 82 return(send());
YuuichiAkagawa 0:b4815a079a4b 83 }
YuuichiAkagawa 0:b4815a079a4b 84
YuuichiAkagawa 0:b4815a079a4b 85 int FluentLogger::log(const char *tag, uMP &mpmsg)
YuuichiAkagawa 0:b4815a079a4b 86 {
YuuichiAkagawa 1:6b1268731465 87 if (_sock == NULL || !_sock->is_connected()) {
YuuichiAkagawa 0:b4815a079a4b 88 if (open() < 0) {
YuuichiAkagawa 0:b4815a079a4b 89 return -1;
YuuichiAkagawa 0:b4815a079a4b 90 }
YuuichiAkagawa 0:b4815a079a4b 91 }
YuuichiAkagawa 0:b4815a079a4b 92 _mp->init();
YuuichiAkagawa 0:b4815a079a4b 93
YuuichiAkagawa 0:b4815a079a4b 94 // tag, timestamp, message
YuuichiAkagawa 1:6b1268731465 95 if (!_mp->start_array(3)) {
YuuichiAkagawa 0:b4815a079a4b 96 return -1;
YuuichiAkagawa 0:b4815a079a4b 97 }
YuuichiAkagawa 0:b4815a079a4b 98 if (!_mp->set_str(tag, strlen(tag))) {
YuuichiAkagawa 0:b4815a079a4b 99 return -1;
YuuichiAkagawa 0:b4815a079a4b 100 }
YuuichiAkagawa 0:b4815a079a4b 101 #ifdef USE_NTP
YuuichiAkagawa 0:b4815a079a4b 102 if (!_mp->set_u32(time(NULL))) {
YuuichiAkagawa 0:b4815a079a4b 103 return -1;
YuuichiAkagawa 0:b4815a079a4b 104 }
YuuichiAkagawa 0:b4815a079a4b 105 #else
YuuichiAkagawa 0:b4815a079a4b 106 if (!_mp->set_u32(0)) {
YuuichiAkagawa 0:b4815a079a4b 107 return -1;
YuuichiAkagawa 0:b4815a079a4b 108 }
YuuichiAkagawa 0:b4815a079a4b 109 #endif
YuuichiAkagawa 0:b4815a079a4b 110 if (!_mp->set_raw((const char*)mpmsg.get_buffer(), mpmsg.get_size())) {
YuuichiAkagawa 0:b4815a079a4b 111 return -1;
YuuichiAkagawa 0:b4815a079a4b 112 }
YuuichiAkagawa 0:b4815a079a4b 113 return(send());
YuuichiAkagawa 0:b4815a079a4b 114 }
YuuichiAkagawa 0:b4815a079a4b 115
YuuichiAkagawa 0:b4815a079a4b 116 int FluentLogger::send()
YuuichiAkagawa 0:b4815a079a4b 117 {
YuuichiAkagawa 0:b4815a079a4b 118 _sock->set_blocking(false, _timeout);
YuuichiAkagawa 0:b4815a079a4b 119 int ret = _sock->send_all((char*)_mp->get_buffer(), (int)_mp->get_size());
YuuichiAkagawa 0:b4815a079a4b 120 if ( ret < 0 ) {//fail
YuuichiAkagawa 0:b4815a079a4b 121 close();
YuuichiAkagawa 0:b4815a079a4b 122 ret = -2;
YuuichiAkagawa 0:b4815a079a4b 123 }
YuuichiAkagawa 0:b4815a079a4b 124 return(ret);
YuuichiAkagawa 0:b4815a079a4b 125 }