2015年8月16日日曜日

fluentd output plugin s3

fluentdからs3にログを残す。
s3プラグイン: http://docs.fluentd.org/articles/out_s3
以下はstoreの設定例。

    type s3 #plugin名
    aws_key_id <アクセスキー>
    aws_sec_key <シークレットキー>
    s3_bucket <バケット名>
    s3_region <リージョン名>
    format json #レコードの出力をjsonに変更
    path webapi/ #バケット配下の階層
    buffer_path /var/log/td-agent/buffer/s3_e #バッファ用ファイルのprefix
    time_slice_format %Y%m%d/%Y%m%d-%H #sliceのフォーマット
    #time_slice_wait 10m
    s3_object_key_format %{path}%{time_slice}_%{index}_%{hostname}_error.%{file_extension} #s3上のファイル名
    utc #標準時形式
    include_time_key true #出力レコードに時刻を追加
    include_tag_key true #出力レコードにタグを追加
    buffer_chunk_limit 256m #バッファファイルが256MBになったら送信
    flush_interval 60s #60秒ごとに送信
    store_as json #保存形式をgzからjsonに変更(AWS Console上で内容を確認したい)

fluentdの基本: centralized logging middle ware

ログシステムの保証レベル
at-most-once:最高で1回の送信。ただし到達を保証しない
at-least-once:少なくとも1回の送信。ただし重複の可能性がある
exactly-once:at-most-onceとat-least-onceの両方を満たす


ログ採取ミドルウェアfluentd
chmod +x install-redhat.sh
./install_redhat.sh
sudo service td-agent start //起動default port 24224


ログ/メッセージに任意のタグをつけて逐次的に収集。
フィルタ(データ加工、集計)、バッファ、ルーティングの後に各種データ出力先へ保存(Output Plugin)する。

fluentd メッセージ
[tag, time, record]

in_exec: 一定間隔ごとに指定パスにあるスクリプトをコマンド実行して、結果を収集する
out_exec_filter: tailプラグインなどで収集したログメッセージに対してデータ加工を行う
out_exec: 収集したログメッセージを指定パスにあるスクリプトの引数として渡して実行する

flush_interval: バッファリングしたメッセージを一括で受け渡しする時間間隔

tailプラグイン:既存のアプリログを収集するのに便利


fluentd設定ファイル
/etc/td-agent/td-agent.conf

有効ディレクティブ
<system> // Fluentdのコア部分の動作を決定する
<source> // プラグインの指定
<match> // ログデータの加工、フィルタリング、外部出力
include // 内部または外部の設定ファイルのロード

以下、設定ファイルの各ディレクティブの説明。[]内はデフォルト設定


system
コマンドラインの引数より優先される
log_level: [info]
suppress_repeated_stacktrace: 連続した同一エラー出力を抑制 [抑制無し]
emit_error_log_interval: 指定時間内の同一エラー出力を抑制 [抑制無し]
suppress_config_dump: 起動時に設定ファイルの標準ログ出力を抑制


source
ログの入力元を決定する。
type: Inputプラグインの指定

<source>
  type <name of plugin>
  tag <output tag>
  <option of plugin>
</source>

tailの場合、formatが必須。formatは正規表現で記述可能。例えばapachなどプリセットも用意されている。


match
ログの出力先を決定する。
type: outputプラグインの指定。フィルタリング、ルーティングも可能。

<match <マッチさせるタグ>>
  type <プラグイン名>
  <プラグインのオプション>
</match>

一度受信したtagをルーティングして、vhostのドメイン部分をタグに含めて再度ルーティングすると、vhostの情報を含むログを出力できる。
outputのプラグインには、fileやs3、mongo、stdoutなどがある。
ルーティング目的では、copy、rewrite_tag_filterなどがある。
一旦matchして出力してしまうと以降のmatchでは引っかからないので、copyなどを利用してうまく設定することが必要。


マッチングタグの記述
*: 1つのタグ要素に合致
**: 0個以上のtag要素に合致
{x, y, z}: x, y, zにマッチ。x, y, zはマッチしたいパターン


fluentdテスト用コマンド
fluent-cat: td-agent付属のコマンド

// 標準出力
echo '{"message":"Hello World."}' | /usr/lib64/fluent/ruby/bin/fluent-cat debug.test // fluent-catにはタグ名を渡す

// ログファイルの参照
sudo less /var/log/td-agent/td-agent.log


example) apache

ログファイルの権限などに注意。間違っている場合td-agent.logにエラーが出力されるので容易にわかる。

2015年8月9日日曜日

Lispによる関数型プログラミング入門2 記法

Lispの記法

・前置記法
1 + 2
→ 
 (+ 1 2)

つまり、関数(ここでは和演算)を最初に宣言して、引数を渡す。これはf(x)と記述するのと同じである。

・defun
means define-function

例)
フィボナッチ数計算:
> (defun fib(n)
>   (if (<= n 1)
>     1
>     (+ (fib (- n 1)) (fib(- n 2)))
>   )
> )

> (fib 5)
 8
> (fib 21)
 17711


Lispの評価と特殊形式quote、function

・quote
関数を評価せずにそのままかえす

例)
> (quote (1 2 3))
 (1 2 3)

・function
シンボルの関数をかえす特殊関数
略記 #'

例)
> (function +)

#<SYSTEM-FUNCTION +>

2015年8月3日月曜日

Lispによる関数型プログラミング入門

SoftwareDesignの2015Aug を読んでLispに興味をもったので、何回かにわけて入門のメモを残す。

Lispの前に、関数型プログラミングの特徴から。

関数型プログラミング

グローバル変数や代入文など副作用を生じる機能を使わずにプログラミングを行う。

・従来の考え方
上記のように変数や配列などの状態をループなどを用いて変更し結果を得る

・関数型プログラミングの考え方
関数(主に高階関数)を利用して副作用無しに結果を得る

・関数型プログラミング向きの問題
状態をもたない再帰的な問題
→探索、整列

・人間には再帰的思考が向いている
数学的帰納法(具体的で小さい問題から大きな全体の問題へ向かう)

・並列処理に対する強み
状態を持たないので、並列処理を自然に(というのは同期や排他が必要無い)できる。
クラウドやビックデータ向きである。

・関数呼び出しに対する弱み
関数呼び出しはコストが大きいので、低機能コンピュータには向いていない。高機能コンピュータ上で並列処理するのに向いている。

・動的なプログラミングに対する強み
関数自身をオブジェクトとして扱えるため、動的な関数生成や変更をすることができる。(サービス指向コンピューティング)

・抽象的なプログラミングに対する強み
うまく作れれば、状態をもたないので仕様変更に柔軟であるはず。

・バグの現象
副作用が少ないので、バグの温床がつくられることを防げる。

Lisp
・言語仕様が小さい
・インタプリタ言語であり、実行が簡単
・GC、ラムダなど最近の言語では常識であるアイデアの元となった言語
・動的型付け(型推論ではない)
・かっこが多くて見難い
・前置記法が見難い
・動的型付けはリソースを食う

数学的帰納法だと考えるとわかりやすい
・再帰をみつける = 同じことの繰り返しをみつける。

例)
階乗:
・関数型
 →5(N)の階乗は4(N-1)の階乗の結果に5を掛けること
・手続き型
 →1 x 2 x 3 x 4 x 5

Lispのインストール(OSX)

次回はLispの記法から。