• ベストアンサー

コマンドラインのログファイルの作成

Linuxで次のようなプログラムを実現したいのですが どのようにしたらよいでしょうか? (1) シェル起動後、自動的に起動し (2) シェルで入出力されるコマンドラインを指定したファイルに自動的に追加書込みされ * 書込みについては、一行毎に入出力された時刻も同時に書込むものとします 詰まり、次のような記述で、書込みたいのです 入力 時刻 出力 時刻 ・・・ 入力 時刻 出力 時刻 といった感じの書式です (3) 追加書込みされるファイルが一定容量以上になると自動的に別ファイルを生成して、そのファイルに書込まれる これは、Perlなどのスクリプト言語で作るべきでしょうか? それとも、( 例えば、コマンドやリダイレクトだけで作ると言ったような ) もっと簡単な方法がありますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#17908
noname#17908
回答No.2

どんなコマンドを入力したのか、そしてどんな結果を得たのか。 ユーザーのコマンドラインを監視したいということですか? コマンド名だけを記録するならば、Acctというものがあります。 ただし、今回の仕様に完全に適合するとは言えません。 http://savannah.gnu.org/projects/acct/ 利便性を落とさず、コマンドラインをロギングするのは、 bashのソースコードをいじる必要があるかと思います。

mathsan
質問者

お礼

ご回答ありがとうございます。 お礼の返事の方が遅れてすみませんでした。 私にとってはまだむずかしそうです。 結局の所、スクリプトを組まなければいけないみたいなので まず、bashの理解を固めたいと思います。 一応、bashについては http://cyberam.dip.jp/linux_command/shellscript/shellscript_main.html を読んでいますが、他に分りやすそうなサイトなどあれば 是非、教えていただきたいです。 それから、使えそうなソフトは利用したいとも思っています。

その他の回答 (3)

  • hamaddux
  • ベストアンサー率0% (0/3)
回答No.4

意図が一致しているかどうかわかりませんが、回答します。 その処理を行うスクリプト内に、 echo>>ログファイル名 でログの管理は可能だと思います。 その処理の初めと終わりにdate関数で時間を変数にしておいて処理の終わりに、 echo "入力時刻:$date1\n出力時刻:$date2">>ログファイル名 のようにすればできるのでは?と思います。 あと、(3)についてですが、 wcコマンドで文字数や行数の確認が行えます。 その容量または行数の数値をある変数において、数値比較で分岐させてやれば新しいファイルを自動で生成して、そのファイルに書き込むことができると思います。 処理としては新しいものを作成して書き込むより、書き込むログファイルは常に同じで、古いものをbak1.log、bak2.log・・・といったようにするほうが容易かと思います。 当方はUNIXメインなのでいけるかどうかははっきりは確認しておりませんが、参考になれば幸いです。

mathsan
質問者

お礼

ご回答ありがとうございます。 もう少し早く返事をしたいと思っていましたが まだ、シェルスクリプトについては入ったばかりで 殆ど何もしていないのが実情です。 何となく考え方などが理解できますが 実際にできるように色々調べてみます。 分らないことがあればまた質問すると思います、そのときはどうぞよろしくお願いします。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.3

要件を100%救うことは無理だと思いますが、GNU Screenというツールがあります。 参考URLは、公式サイトですが、検索すれば日本語で説明されているサイトがそこそこ見つかります。 個人サイトなので、ここには載せられませんが。 RedHat9などには、インストールCDにRPMが入っています。 端末の仮想化を行うソフトウェアですが、コンソールのログを取る機能もある為、自動的にそのような内容を記録することが可能でしょう。 時刻の記録については、シェルのプロンプトに日付や時刻を出力するようにすれば、それなりには取れるかと思います。 しかし、記載されている要件を完璧に実現するのは、コンソールをフックする独自プログラムを開発するか、ANo.2で出ているように、bashを直接いじる必要があるかと思います。 私が以前関わっていた顧客の環境では、実際に開発者や運用担当者の作業をログを残すために、そのような仕組みをPerlで独自開発していました。 コンソールには、実際には様々なコントロールコードが入出力されています。開発するとなれば、それらを適切に扱わないと、操作上のトラブルの原因になります。 時刻を記録するという部分については、機能的には結構微妙でしょう。一回の入力あるいは出力というのを判別するのは意外に難しく、一般的には行単位の処理となります。 入出力に2バイトコードが入る場合、さらに処理は面倒になるかもしれません。 ログファイルについては、このような要件の場合、ローテーションを実装するよりも、ログイン単位で日時を使ってファイル名を生成すれば、そうそう大きなファイルにはならないため、必要以上にログ出力機能を複雑化させないのが一般的かと思います。 いずれにしても、質問者さんが期待していると思われるレベルの簡単さは無いのではないかと思います。

参考URL:
http://www.gnu.org/software/screen/
mathsan
質問者

お礼

ご回答ありがとうございます。 お礼の返事の方が遅れてすみませんでした。 私にとって、むずかしいことなので考えをまとめたりしていて時間がかかってしまいました。 仮想端末というソフトが具体的にはどのようなソフトなのか今一理解できていませんが GNUscreenというソフトではログを取る機能があるとのことなので使えればいいとも思いましたが 結局の所、スクリプトを組まなければいけないみたいなので まず、bashの理解を固めることと実現したいシステムの詳細の構成について考える所から追々に始めていきたいと思いました。 もう少し内容を整理してから、質問もしたいと思います。そのときには、お手数で申し訳ありませんが、よろしくお願い致します。

noname#17908
noname#17908
回答No.1

「自動的」というニュアンスが今イチつかめませんが、 以下のようなスクリプトを思い描いているのではないでしょうか? 出力の場合だけ書きました。入力は考えてください。 function logecho() { message=$1 now=$(date '+%D %T') echo "[OUT] $now $message" | tee -a logfile lines=$(cat logfile | wc -l) if [ "$lines" -ge 1000 ]; then mv -f logfile logfile.orig touch logfile fi } logecho "[START]:Tomcat" logecho "[START]:Apache"

mathsan
質問者

お礼

ご回答ありがとうございます。 やはり、スクリプトを組まないと難しいことのようでしょうか。 教えて頂いたスクリプトの内容を調べながら参考にして、考えたいと思います。 実現したい処理したい処理についてもう少し具体的に書きたいと思います。 実現したい処理をPとします。 (1) シェル起動 P起動 (2) (2-1)  ユーザーがシェルでコマンドラインを入力し<Enter>を押す (2-2)  (2-1)で入力されたコマンドラインがPによって  指定したファイルに自動的に追加書込みされる (2-3)  (2-2)のときに、追加書込した行で次に区切り記号を付し  (2-1)でユーザーが入力した時刻を書込む。  改行する。 (2-4)  (2-1)の入力による出力結果も  (2-2)で言う所の指定したファイルに追加書込される。  追加書込した行で次に区切り記号を付す。  出力結果がシェルに表示された時刻を書込む。  改行する。 つまり、次のような記述で、書込みたいのです <入力><区切記号><入力時刻> <出力><区切記号><出力時刻> ・・・ <入力><区切記号><入力時刻> <出力><区切記号><出力時刻> といった感じで指定したファイルに書込まれます。 (3)  指定した追加書込みされるファイルが  一定容量以上になると自動的に別ファイルを生成して、  そのファイルに書込まれる。  その際、ファイル名はファイル生成時刻にする。 また、何かあればご教授の程よろしくお願いします。

関連するQ&A