sashimi4’s diary

日々の雑多なメモを書きます

Android Java から Fluentd にログを送信してみる

環境

手順

FluentdのDockerコンテナを準備

$ docker pull fluent/fluentd

fluent.conf を作成

$ mkdir fluent && cd fluent
$ mkdir etc log
$ cat > "./etc/fluent.conf" <<EOF
# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
<source>
  @type forward
  port 24224
</source>

# Match events tagged with "app.*"
<match app.*>
  @type file
  path         /fluentd/log/app.*.log
  symlink_path /fluentd/log/app.log
  append       true
  time_slice_format %Y%m%d
  time_slice_wait   1m
  time_format       %Y%m%dT%H%M%S%z
</match>
EOF

configは docs.fluentd.org をベースに雑に書きました。

$ docker run -it --rm \
--name docker-fluent-logger \
-p 24224:24224 -p 24224:24224/udp \
-v $(pwd)/log:/fluentd/log \
-v $(pwd)/etc:/fluentd/etc \
-e FLUENTD_CONF=fluent.conf \
fluent/fluentd:latest

Android

$ grep fluent app/build.gradle
  // https://mvnrepository.com/artifact/org.fluentd/fluent-logger
  api group: 'org.fluentd', name: 'fluent-logger', version: '0.3.2'
$ grep uses-permission app/src/main/AndroidManifest.xml
  <uses-permission android:name="android.permission.INTERNET"/>
package com.example.fluentloggertest;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import org.fluentd.logger.FluentLogger;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread() {
                    @Override
                    public void run() {
                        FluentLogger LOG = FluentLogger.getLogger("app", "fluentdのDockerコンテナが動いているマシンIP", 24224);
                        LOG.log("action", "MainActivity", "onClickFab"); // こんな感じ?
                    }
                }.start();
            }
        });
    }
...

プロジェクトテンプレから、デフォルトでFabがあるものを使っています。

logを確認

↑のアプリでFabをクリックすると、、

$ tail -f ./log/app/*
==> ./log/app.foo-bar.log <==
2018-09-20T01:34:26+00:00   app.action  {"MainActivity":"onClickFab"}
2018-09-20T01:34:28+00:00   app.action  {"MainActivity":"onClickFab"}

こんな感じでログが保存されます! (あー、この app.log のシンボリックリンクはコンテナ内のpathですね…)

超雑ですが、以上です。m(_ _)m