回答:
通常のユーザーとして/ 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
。
syslog
と、Cライブラリルーチンであり、C ++はを使用して任意のCを呼び出すことができますextern "C"
。他の言語は、多くの場合、Cに対する汎用バインディング、または特定のものへのバインディングのいずれかを提供しますが、それは言語によって異なります。
あなたが普通のユーザーとしてプログラムを実行することに決めた場合、そのログの自然な場所はホームディレクトリにあります。ホームディレクトリは、実行するプログラムのログであるかどうかにかかわらず、すべてのファイルを保存するためのものです。
プログラムがシステムの一部として実行され、通常は専用のシステムユーザーとして実行されている場合、そのログの自然な場所はにあり/var/log
ます。サブディレクトリ/var/log/myapp
を作成し、適切なアクセス許可を付与して、アプリケーションがそこに書き込めるようにします。
関連性があり、オペレーティングシステムで許可されている場合は、ログファイルを追加専用としてマークします。rootのみがこれを行うことができます。これには、アプリケーションが侵害された場合、過去のログを消去できないという利点があります。これは、侵害のフォレンジック分析に非常に役立ちます。ログをローテーションするには、rootの介入が必要です。chown
そのため、アプリケーション、rename
ログファイルでログファイルを開けなくなり、適切な所有権を持つ新しい追加専用ファイルを作成してから、新しい空のファイルを開くようにアプリケーションに通知します。
一般に、デーモンの場合、ログファイルが作成されるroot
と、権限が変更され、非特権ユーザーが書き込みできるようになります。logrotate
次に、ローテーション中に権限を保持するように設定されます。
デーモンではなくコマンドの場合は、/tmp
(できればを使用してmktemp
)STDOUT
ログに記録し、ログの送信先を介してユーザーに通知します。
&
プロンプトを保持するのを避けるためにを追加することを検討していましたが、Dropboxを起動するとコンソールに書き込みます。現在/dev/null
、出力をにリダイレクトしていますが、Dropboxの起動に失敗した場合にデバッグする方法があります。
chmod
。通常、0644
または0664
ユーザー/グループの所有権も、それに書き込むことが予想されるデーモンの所有権に変更されます。
私は、ユーザー空間プログラムがデフォルトでログを破棄すると予想されている印象を受けています。さまざまなプログラムが好きなところにログをダンプするのを見てきましたが、私のシステムでは特に歓迎されません。巨大にならない限り/気付かない場所に蓄積する傾向があります。
彼らのための明確な場所があれば私は好むでしょう、私は彼らのために安定した場所を見つけようとして私のシステムで遊んでいます。
私の最初のアイデアはを使用することでしたが/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に固執することをお勧めしますが、仕様は自由形式なので、準拠することはあまりありません。
システムが提供するこのディレクトリには、既存のログローテーションはありません。システム用に作成することをお勧めします。
# /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