
CプログラムとPerlスクリプトからのメッセージをファイル(例:/var/log/my_log)に送信したいと思います。 syslogデーモン設定へのアクセス権がないため、別のsyslogデーモン(syslog-ng)を起動しようとしました。
logger
コマンドとそのオプションを使用して、-u
コマンドラインからメッセージを送信できます。このログメッセージは通常のメッセージファイルではなくmy_logに書き込まれますが、CまたはPerlでは同じ動作を再現できません。
明らかに、openlog関数には、ロギングに使用されるソケット、ロギングプロセスのPIDを指定するオプション、またはシステムログの代わりにマイログにメッセージを送信するオプションはありません。
syslog
ライブラリを使用して実行できますか、それとも不可能ですか?
答え1
そうですね。 libcではopenlog()
ソケットを指定できませんが、通常は別のソケットが必要な場合にのみ可能ですsyslogd
(A。ソケットもちろん、メッセージが記録されたファイルと同じではありません。 )
logger
デフォルトは(ほとんどのシステムではと思います)user.notice
なので、正しい場所に書き込まれたら、Cで次のようにする必要があります。
#include <syslog.h>
...
openlog("myprog",LOG_PID,LOG_USER);
syslog(LOG_INFO,"%s","my message...");
またはPerlでは:
use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock 'unix';
# setlogsock('unix','/opt/my_root/dev/log');
openlog("myprog","pid","user");
syslog("info","my message...");
定数の詳細については、マニュアルページopenlog(3)
とマニュアルページを参照してください。Sys::Syslog(3)
本当に別のソケットにログインしたい場合は、/dev/log
上記の2番目の形式を使用してPerlから簡単にログインできます。setlogsocket()
最新のパッケージを使用する必要があるかもしれませんがSys::Syslog
、パスを指定したときにv0.17で失敗したことがわかりました。
Cでは少しトリッキーです。ソケットconnect()
に接続して接続する必要があります。AF_UNIX
write()
正しいメッセージ形式を使用する。logger
(関数myopenlog()
および)の最新のソースコードをお読みください。mysyslog()
ユーティリティ-Linux-2.xバージョン。
Linux(glibc)とFreeBSDで使用されるパスはopenlog()
ハードコーディング(_PATH_LOG
from /usr/include/syslog.h
)されており、実行時にこれを変更する方法はありません(chrootまたは.so
DLLインジェクションを除く)。