- ベストアンサー
データ件数が多いことによってログが消えたりしますか?
1500件ほどのログデータがあります。(.txt) このログデータに追加をしたり、修正を加えています。 (cgiを使って) 最近気づいたのですが、以前入力したはずのものが消えていたりするんです。 でも全部が消えるわけではなく、一部が消えるので、プログラムのミスではなさそうなんですが。 このログデータ+cgiは社内のサーバーにアップデートして使用しています。 以前はWeb用のサーバーにおいてあり、使用していましたが、データが消えた?というようなことはなかったのですが、 社内の方においてからそのようなことがおきているのではないかと思うようになりました。 社内の人はそこへは入らない(入れない)ので、もし攻撃を受けているとしたら外部からなのかな?と思い、ログをコピーし、 ローカルに保存しておき、数日たってから中身を照合しようとは思っています。 ですが、あんまりその可能性は考えられないので、それ以外に理由があるのかな?と思ってます。 件数が多いことでログデータが勝手に削除されたりすることはあるのでしょうか? ※cgiはperlでかいています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
基本的にロック処理は読み込み時に行なうものではなく書き込み時に行なうものです。 今のままだとロックの意味がありません。 それにflock関数は全てのサーバで使えるものではありません。お使いのサーバが使えるか確認した方がいいでしょう。
その他の回答 (4)
- buffalomasa
- ベストアンサー率66% (70/106)
>みてみたところ233KBでした。 >これが大きいのか小さいのか不明ですが…。 容量的には問題ないと思います。 あとはそのCGIを具体的に書いてもらえるとより的確に解説ができます。 これはCGIの問題というよりサーバ側の問題の可能性もあります。 No.3の方もおっしゃられているようにロック処理は問題ないのでしょうか? そのログファイルをあなたしか編集しないにしてもロック処理はあった方がいいです。 たとえば「書き込み」ボタンを押してログデータに書き込む場合、間違ってダブルクリックのようになったら同時書き込みが発生する可能性もあります。 毎回書き込む毎にログデータがおかしくなるのならばロック処理がおかしいわけではないと思いますが、たまにログファイルが壊れるのならばロック処理が問題なのかもしれません。
お礼
●ログ書き込み時 open (FILE,">>***.log"); @FILES = "名前=$FORM{'NAME'}&…記入時間={'LOCALTIME'}\n"; print FILE @FILES; close (FILE); ●ログファイルオープン時 open FILE,"***.log"; flock(FILE,2); @FILES = <FILE>; flock(FILE,8); close FILE; となっています。 Web用サーバーとまったく同じ状態で使用しているのですが、 サーバーによってロック作業が変わったりするのでしょうか?
- mhgetter
- ベストアンサー率0% (0/5)
あくまでバグではなかったという前提の下に読んでください。 CGIですので複数の人が同時にCGIにアクセスする可能性があります。 そのときにある特定のファイルの内容を変更する場合には その処理に同時にアクセスされないようにする必要があります。 たとえばファイルを修正する場合には以下のようなパターンが考えられます。 (1)Aというファイルをオープンする (2)内容を変数$conに読み込む (3)ファイルをクローズする。 (4)変数$conに修正を加える。 (5)AというファイルをWRITEモードでオープンする。 (6)変数$conを書き込む。 (7)ファイルをクローズする。 まず最初のアクセスが(5)まで進んだ状態で、次のアクセスが入ってきたとします。 後者のアクセスがAというファイルを読み出そうとしたところ(1)、前者のアクセスが 書き込みモードでオープン(5)されているために内容が読み込めません。 その後最初のアクセスが正常に処理を終了してファイルAは正常に書き込まれますが、 後者のアクセスが0バイトしか読み込めなかった$conのデータに対して修正を 加えて書き込むため、それまで保存されていた内容がすべてなくなってしまうと いうようなことが起こります。 これを回避するには通常ファイルロックを利用します。 下記のURLが詳しいでしょう。 また、ファイルを追加書き込みする場合にはこの処理は必要ありません。下記のようなプログラムの場合です。 open OUT,">>/data/test.txt"; print OUT time()."\n"; close OUT; 追加書き込みの場合には通常はOSによってそれぞれの書き込み内容が保護されます。
お礼
回答ありがとうございます。 cgiではありますが、そのシステムは私以外は使いません。 (見ることはあるが、書き込みなどは一切ありません。見ることも多分ほとんどないと思います。) 一応ロックはするようにかいてはいるんですけど、あんまり機能してない状態です。
- buffalomasa
- ベストアンサー率66% (70/106)
具体的にそのログデータの容量はどのくらいなのでしょうか? 処理の仕方にもよりますが、データを一旦すべて配列に格納してから処理していませんか? そのようにしているとデータが全てメモリに入りますので、サーバのメモリ容量によってはデータが消失してしまいます。当然そのまま保存すればデータの一部が消失した状態になります。 ログの容量とサーバに搭載しているメモリ容量、ログファイルを内部でどのように処理しているかを明記して頂くとさらに詳しく解説できます。
お礼
回答ありがとうございます。 みてみたところ233KBでした。 これが大きいのか小さいのか不明ですが…。
補足
cgi内でログを配列として読み込み。 キーになるデータを元に一覧を作成。 上記に修正を行う場合はキーを入力→検索で探し出してデータを修正できるような形で表示させ、入力後新しいデータを上書き。 という形になっています。
- info22
- ベストアンサー率55% (2225/4034)
具体的なことは分かりませんが、各サーバーごとにログが蓄積されますが、ログ領域は有限ですので、ログか大きくなったときの処理は、通常古い記録から消去(押し出し式)していくか、保存期間を設定してそれ以上経過した記録から削除していくなど計算機に設定されています。毎日または週一回タイムスタンプをつけてログを別ファイルとして吐き出して、吐き出した記録はログから削除するなどを行ったりすることが良く行われています。タイムスタンプの付いたログファイルも12か月分保存すると次の1月はその月の旧ログに重ね書き込み保存したりします。 質問者さんのところの各サーバーのログ処理がどうなっているか、すべてのサーバーで一度確認して見られてはいかがでしょうか?
お礼
毎月変わるデータではなく、すべて常に使用するデータなのです。 なので分けるにも分けられず。。。 キーになっている項目がアルファベットなのでアルファベット別にログを分ければいいのでしょうか? でもその後増えたらまた同じになってしまいますよね…。。。
お礼
回答ありがとうございます。 わかりました、確認してみます。 ありがとうございました。