すがブロ

sugamasaoのhatenablogだよ

syslog に書き込んでみる

syslog 経由でログを出力

ターミナルから書き込むには logger コマンドを使うと書き込む事が出来る。

logger -t sample hoge

こんな風にすると、

Mar 10 01:52:56 siegfried sample[761]: hoge

こんな風に出力される。 -t xxx の部分がプロセス名が出力される部分になる。ちなみに、Mac で実行しているので、Linux 等では出力形式が異なるかもしれない。

C言語では?

syslog を使う。基本的にはオープンして、書き込んで、閉じる。
Pinkdragon.netここを参考に作ってみた。
無駄にラッピングしてしまった。ただ、こーしておけば汎用的に使えるかなーと。・・・とか考えて作ったのだけど、 syslog の使い方自体が非常に簡単なので、あまり役に立たないかもしれない。

#include <stdio.h>
#include <syslog.h>

void log_open(const char* name);
void log_close(void);
void log_write(int priority, const char* message);

int main(void) {
    const char* pg_name = "syslog_sample";

    log_open(pg_name);
    log_write(LOG_EMERG, "log_test:LOG_EMERG");
    log_write(LOG_ALERT, "log_test:LOG_ALERT");
    log_write(LOG_CRIT, "log_test:LOG_CRIT");
    log_write(LOG_WARNING, "log_test:LOG_WARNING");
    log_write(LOG_NOTICE, "log_test:LOG_NOTICE");
    log_write(LOG_INFO, "log_test:LOG_INFO");
    log_write(LOG_DEBUG, "log_test:LOG_DEBUG");
    log_close();

    return 0;
}

/************************************
 * SYSLOG オープン
 * **********************************/
void log_open(const char* name) {
    openlog(name, LOG_CONS | LOG_PID, LOG_USER);
}

/************************************
 * SYSLOG 書き込み
 * **********************************/
void log_write(int priority, const char* const message) {
    syslog(priority, "%s", message);
}

/************************************
 * SYSLOG クローズ
 * **********************************/
void log_close() {
    closelog();
}

上記の例ではすべてのログレベルでログを書き込んでいる。一番レベルの高い、LOG_EMERGは実行されるとメッセージが他のコンソールにもブロードキャストされる。
ちなみに、こんな感じに出力される*1

Mar 10 01:45:50 siegfried syslog_sample[743]: log_test:LOG_EMERG

Broadcast Message from root@siegfried.local
(no tty) at 1:45 JST...

Mar 10 01:45:50 siegfried syslog_sample[743]: log_test:LOG_EMERG

Mar 10 01:45:50 siegfried syslog_sample[743]: log_test:LOG_ALERT
Mar 10 01:45:50 siegfried syslog_sample[743]: log_test:LOG_CRIT
Mar 10 01:45:50 siegfried syslog_sample[743]: log_test:LOG_WARNING
Mar 10 01:45:50 siegfried syslog_sample[743]: log_test:LOG_NOTICE

こうしてみると

syslog に出力するのって結構お手軽ですね。

*1:syslogの設定上、INFO 等は出力されていない