ユーザースペースプログラムはどこにログを保存することになっていますか?


23

特権なしで実行したいスクリプトを書いています。スクリプトで発生したエラーをログファイルに記録する必要があります。書き込み権限がありません/var/log。そして、私はホームディレクトリにそれを持ちたくありません。

ユーザースペースのスクリプトがランタイム情報を記録する場所はありますか?/var/log潜在的なセキュリティの問題を発生させずにスクリプトに情報を記録させるベストプラクティスは何ですか?スクリプトにuid / gidを設定するのをためらっています。

回答:


8

通常のユーザーとして/ var / logに書き込むことはできませんが、要求された場合はsyslogデーモンが自動的に書き込みます。メッセージを標準のシステムログ(例/var/log/syslog:)に記録したい場合、4.4BSDユーティリティloggerがシステムで利用可能かもしれません。Debianにはデフォルトでインストールされbsdutils、Debian派生物のパッケージに含まれています。

既存のログローテーション、メンテナンス、および監視ツールの利点が得られますが、システムログを読み取るための特権が必要であり、スクリプトのメッセージが他のプログラムからのメッセージと混ざってしまうという欠点があります。

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

使用可能な構成オプションがいくつかあります。詳細はで読むことができますman logger


このユーティリティには言語バインディングがありますか?むしろ、アプリ内のstdoutの各行に対してサブプロセスを生成しません。
ThorSummoner

@ThorSummoner:Gillesの答えによるsyslogと、Cライブラリルーチンであり、C ++はを使用して任意のCを呼び出すことができますextern "C"。他の言語は、多くの場合、Cに対する汎用バインディング、または特定のものへのバインディングのいずれかを提供しますが、それは言語によって異なります。
dave_thompson_085

12

あなたが普通のユーザーとしてプログラムを実行することに決めた場合、そのログの自然な場所はホームディレクトリにあります。ホームディレクトリは、実行するプログラムのログであるかどうかにかかわらず、すべてのファイルを保存するためのものです。

プログラムがシステムの一部として実行され、通常は専用のシステムユーザーとして実行されている場合、そのログの自然な場所はにあり/var/logます。サブディレクトリ/var/log/myappを作成し、適切なアクセス許可を付与して、アプリケーションがそこに書き込めるようにします。

関連性があり、オペレーティングシステムで許可されている場合は、ログファイルを追加専用としてマークします。rootのみがこれを行うことができます。これには、アプリケーションが侵害された場合、過去のログを消去できないという利点があります。これは、侵害のフォレンジック分析に非常に役立ちます。ログをローテーションするには、rootの介入が必要です。chownそのため、アプリケーション、renameログファイルでログファイルを開けなくなり、適切な所有権を持つ新しい追加専用ファイルを作成してから、新しい空のファイルを開くようにアプリケーションに通知します。

logger(1)またはを呼び出すことにより、アプリケーションログをシステムログに記録できますsyslog(3)


4

一般に、デーモンの場合、ログファイルが作成されるrootと、権限が変更され、非特権ユーザーが書き込みできるようになります。logrotate次に、ローテーション中に権限を保持するように設定されます。

デーモンではなくコマンドの場合は、/tmp(できればを使用してmktempSTDOUTログに記録し、ログの送信先を介してユーザーに通知します。


良いアイデア。〜/ .profileには、Dropboxデーモンが実行されているかどうかを確認し、実行されていない場合は開始する数行があります。&プロンプトを保持するのを避けるためにを追加することを検討していましたが、Dropboxを起動するとコンソールに書き込みます。現在/dev/null、出力をにリダイレクトしていますが、Dropboxの起動に失敗した場合にデバッグする方法があります。
ローLord。

1
チェックしてくださいdaemonize
バハマ

「特権は、非特権ユーザーが書き込むことができるように変更されます。」これは単にchmod 666によって行われますか?または、グループなどにユーザーを追加する必要がありますか?
ローLord。

/ var / tmpの下では、/ tmpはブート後も生き残ることが保証されていません。
フォンブランド

@LordLoh .:はいchmod。通常、0644または0664ユーザー/グループの所有権も、それに書き込むことが予想されるデーモンの所有権に変更されます。
バハマ

3

私は、ユーザー空間プログラムがデフォルトでログを破棄すると予想されている印象を受けています。さまざまなプログラムが好きなところにログをダンプするのを見てきましたが、私のシステムでは特に歓迎されません。巨大にならない限り/気付かない場所に蓄積する傾向があります。

彼らのための明確な場所があれば私は好むでしょう、私は彼らのために安定した場所を見つけようとして私のシステムで遊んでいます。

私の最初のアイデアはを使用することでしたが/var/run/user/$UID/log、私のシステムではTMPFSマウントであり、十分な大きさではないか、ログでの使用に本当に適していることがわかりました。

彼らのための場所を作る

/ var / run / userを十分に理解して統合できないので、ユーザー1000に対して手動でエミュレートすることを選択しました。

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

このフォルダー内の構造についてはFHS / var / log spcに固執することをお勧めしますが、仕様は自由形式なので、準拠することはあまりありません。

Logrotate Config

システムが提供するこのディレクトリには、既存のログローテーションはありません。システム用に作成することをお勧めします。

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

以下は私の以前の/ var / run / user / 1000 / logの投稿です。あなたが何をしているのかを本当に知っていない限り、私はそれをお勧めできません

多分次のようになりますが、私にとっては理にかなっているので、私はこれを作りました。

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

/ var / log / user / 1000と統合します。

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.