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 等は出力されていない