FluentLogger: fluent-logger-mbed A structured logger for Fluentd (mbed)
Dependents: FluentLogger_Hello SNIC-FluentLogger-example
FluentLogger
What is this ?
You can logging to Fluentd server.
This library included subset of MassagePack library.
Supported MessagePack formats(encode only)
format name | first byte (in hex) |
---|---|
positive fixint | 0x00 - 0x7f |
fixmap | 0x80 - 0x8f |
fixarray | 0x90 - 0x9f |
fixstr | 0xa0 - 0xbf |
nil | 0xc0 |
false | 0xc2 |
true | 0xc3 |
float 32 | 0xca |
float 64 | 0xcb |
uint 8 | 0xcc |
uint 16 | 0xcd |
uint 32 | 0xce |
uint 64 | 0xcf |
int 8 | 0xd0 |
int 16 | 0xd1 |
int 32 | 0xd2 |
int 64 | 0xd3 |
str 8 | 0xd9 |
negative fixint | 0xe0 - 0xff |
これは何?
Fluentd サーバにログを送信するためのライブラリです。
サブセット版のMassagePackライブラリも同梱しています。
サーバ側ダウン時の再接続機能は限定的に実装されています。 現時点での実装は送信時に切断を検知し、次回送信時に再接続する仕様です。
FluentLogger.cpp@1:6b1268731465, 2014-12-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |