別の場所にログメッセージを送信する

別の場所にログメッセージを送信する

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_UNIXwrite()正しいメッセージ形式を使用するlogger(関数myopenlog()および)の最新のソースコードをお読みください。mysyslog()ユーティリティ-Linux-2.xバージョン。

Linux(glibc)とFreeBSDで使用されるパスはopenlog()ハードコーディング(_PATH_LOGfrom /usr/include/syslog.h)されており、実行時にこれを変更する方法はありません(chrootまたは.soDLLインジェクションを除く)。

おすすめ記事