2022年9月29日木曜日

【Linux】Cプログラムでsyslogを出力する話

気づけばもう9月に入っていますね。
…と思ったら9月終わりそう。

最近実はちょっと調子がよくなかったです。
体調だったり、不眠だったり…。齢かな…。
まあ、愚痴ってても仕方ないので、Blogではなるたけ明るい情報を出していきたいかなー。
そんな今日この頃。

最近仕事でLinuxで動作させるアプリケーションの開発があって、
絶賛苦しみ中なのですが、デバッグ用に使用しているsyslogへの出力に関して
ちょっと書いておこうか…忘れそうだしね。




そもそも、GDBなりEclipseなりでデバッグやりゃあいいじゃん
みたいな話になりそうっちゃなりそうなんですが、
動作環境のスペックが家庭用PCとかとは比べ物にならないくらい低くて
アプリケーションとGDBデバッグが共存して動かすことも現実的でないので、
syslogに動作ログを記録して、そこから原因を探るようなことをしているのですね。

クロスプラットでの開発なんだけど、
開発してるWindows環境では発生しないしな~
クソが!

とりあえず、ログの出力方法ですが、
先頭にインクルードファイルの指定を行います。
クロスプラットなら、このインクルード文にOS環境で分岐した方がいいですね。
「#ifdef~」とかで。
Windowsだとエラー吐いちゃうので。


/* syslog出力のためのInclude */
#include <syslog.h>
#include <sys/syslog.h>


んで、
ログ出力の必要な個所に書き込みの処理を記載します。
ファイルのWriteみたいにファイルオープンして、書いて、クローズする感じですね。


/* Syslog Open */
openlog( logname.toUtf8().data(), LOG_NDELAY | LOG_PID, LOG_USER );
/* Syslog Write */
syslog(LOG_ALERT, logmessage.toUtf8().data());
/* Syslog Close */
closelog();

 

これで出力されるはず。
Linuxでプログラム動作時に、正しく動作していれば「/var/log/syslog」
の辺りに出力されるはずです。

openlogの2つ目の引数ではログ生成時のオプション、
3つ目の引数ではメッセージの型を指定します。
これはアプリケーションの正式な動作としてsyslogを出すなら、
用途に応じて適したオプションを必要に応じて設定する感じですかね。

今回はデバッグ用に出力しているので、とりあえず追えるように
2つ目はLOG_NDELAY(即時に)とLOG_PID(プロセスID記述)で、
3つ目はLOG_USER(一般ユーザーレベルのメッセージ)で出しています。

オプションは下記のものがあるようです。
LOG_CONS
LOG_NDELAY
LOG_ODELAY
LOG_PERROR
LOG_PID


メッセージ型は下記のものがあるようです。
LOG_AUTH
LOG_AUTHPRIV
LOG_CRON
LOG_DAEMON
LOG_KERN
LOG_LOCAL0~7
LOG_LPR
LOG_MAIL
LOG_NEWS
LOG_SYSLOG
LOG_USER
LOG_UUCP


上手いこと不具合見つかって修正できるといいんですけどね。
Linuxはよう分からんね…

0 件のコメント:

コメントを投稿