WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:アクセスログ

0:[投稿] アクア [MAIL] [2002/11/19 12:07 ][環境:WIN+IE WIN系+Perl]

始めまして、携帯のアクセスログを取りたくてjavaでは無くCGI
直で取るような物を作っているのですがlogfail出力で躓いています。
誰かアドバイスください;;

下記のように作ってます

# ログ出力先ファイル
$logfile = "log.dat";

# 環境変数の取得
$agent = $ENV{'HTTP_USER_AGENT'};
$gwif = $ENV{'GATEWAY_INTERFACE'};
$sadmin = $ENV{'SERVER_ADMIN'};

ーーーーーーーーーーーーーーーーーーーーーーー
# 出力用に体裁整形(この場合csv)
$log = "$agent,$gwif,$sadomin\n";

# ファイル出力
open(FILE, ">>$logfile");
flock(FILE, 2);
print(FILE "$log");
flock(FILE, 8);
close(FILE);


1:[回答] ちゃいぱ [2002/11/19 12:49 ]

>print(FILE "$log");
print FILE, "$log";
とか。

ちなみに、closeしている場合は、flock(FILE, 8); は、たぶん不要。


2:[質問] アクア [MAIL] [2002/11/19 13:01 ]

一度試してみます。
あとログを取ったものを保存する時に一ヶ月周期などでログファイル交換したい時はどうしたらいいですか?


3:[回答] 薫 [2002/11/19 13:25 ]

> 一ヶ月周期などでログファイル交換
ログファイル名を「年+月」にするとかかな?
$logfile = "$year_$month.dat"; # ここで適当な名前を作る
open(FILE, ">>$logfile") or open(FILE, ">$logfile");


4:[回答] アクア [MAIL] [2002/11/19 14:04 ]

試してみます。本当に有難う御座います。


5:[回答] アクア [MAIL] [2002/11/19 14:16 ]

試してみたところdatはできているのを確認しましたが
中身が空の.datとなってます。
$month.datを名前としていいんですよね?


6:[回答] アクア [MAIL] [2002/11/19 16:52 ]

open(OUT, ">>_.csv"); # 上書きオープン
print OUT $agent, $gwif, $sadmin, $sname, $sport, $sprotc, $ssoft, $auth, $path, $from, $accept, $refere, $addr, $host, $ident, $user, $cookie, $naiyou; # log.csv に $line の内容を出力
で記述してopen上書きしてるのですが形式を.csvにした時はどのようにすれば日時とエクセルの枠を分けて保存できるのでしょうか?
枠Aに全て書き加えになってるのでそれをagentは枠A gwifは枠Bなどのように


7:[回答] gun [2002/11/19 17:10 ]

print OUT "$agent,$gwif,$sadmin,・・・\n";

にすれば良いと思います。
ただ、データにダブルクォート(")やカンマ(,)がある場合ですと、
ちょっと細工が必要です。


8:[回答] アクア [MAIL] [2002/11/20 09:39 ]

csvで分けることが出来ました、有難う御座います。gunさん

でもって日時を取る時は、
$time = $year += 1900;

この記述でだいじょうぶなのでしょうか?


9:[回答] gun [2002/11/20 09:58 ]

その記述でダイジョブというか、
そもそも $yearに何が入っているか、アクアさん以外には
分からない気が・・・。

例えば、"yyyy/mm/dd hh24:mi:ss"形式のWEBサーバ日時を得るには、
---------------------------------------------------------
my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if($sec  < 10){$sec ="0$sec"; }
if($min  < 10){$min ="0$min"; }
if($hour < 10){$hour="0$hour";}
if($day  < 10){$day ="0$day"; }
$mon=$mon + 1;
if($mon  < 10){$mon ="0$mon"; }

$str_time= (($year+1900)."/".$mon."/".$day." ".$hour.":".$min.":".$sec);


10:[回答] アクア [MAIL] [2002/11/20 10:29 ]

・・・・・言われると何も入っていませんでした
教えていただいたのを入れてみます。


11:[回答] アクア [MAIL] [2002/11/20 11:07 ]

サーバーの時間設定は yyyy/MM/dd H:mm:ss です。
ちょっと調べて試してみます。


12:[回答] アクア [MAIL] [2002/11/20 11:57 ]

gunさんに教えてもらった記述で書いてみました。
それをprintしてみたところ
print  "$sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst \n";
このようにprintしたところ返された値が
53, 50, 11, 20, 11, 102, 3, 323, 0
となりました。$yearの値が102となってるのが謎です。
でも$hour, $dayは正しいのが返ってきたので日時の追加が出来ました。


13:[回答] gun [2002/11/20 13:24 ]

9の回答の書き方が悪かったです。スミマセン。

my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
とすると、
$year には西暦1900年からの経過年数。
$mon  には月(つき)(0から11まで)。
$wday には曜日(0から6まで)。
$yday には一月一日から経過日数。
$isdat には夏時間なら0以外の値(謎)。

上のコードを少し整理しました。
-----------------------------------------
my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if($sec  < 10){$sec ="0$sec"; }
if($min  < 10){$min ="0$min"; }
if($hour < 10){$hour="0$hour";}
if($day  < 10){$day ="0$day"; }
$mon=$mon + 1;
if($mon  < 10){$mon ="0$mon"; }
$year=$year+1900;

$str_time= "$year/$mon/$day $hour:$min:$sec";
-----------------------------------------


14:[回答] アクア [MAIL] [2002/11/20 15:31 ]

gunさん本当に有難う御座います。
正しく表示されました。
このログをcgiで集計とかして出す時に拡張子は.csvと.datではどちらの方が好ましいのでしょうか?


15:[回答] gun [2002/11/20 16:21 ]

そのログファイルをエクセルから開かれるようですので、
エクセルに関連付けされている拡張子(.csv)にした方が、
エクセルからログファイルを開く際に若干ラクでしょうか。

その他には、どちらでも、特に違いはないと思います。


16:[回答] ひじ [2002/11/20 23:08 ]

>>9, >>13
sprintfという便利な関数があります。

my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$str_time= sprintf('%d/%02d/%02d %02d:%02d:%02d', $year+1900, $mon+1, $day, $hour, $min, $sec);


17:[回答] gun [2002/11/21 00:21 ]

すばらすぃ!
ありがとうございます!


18:[回答] アクア [MAIL] [2002/11/21 10:11 ]

なんとか出来上がってログの回収はできました。
でも最初にアクセスさせるのがCGIでindexに手動で行くのはちょっと手間だしなんでって?思われると思います。
CGIでログを取った後にindexに自動で行かせる方法はありますか?
メタで試してみましたが、myがエラーになってログ自体取れなくなりました。
いい方法あったら教えてください。

あと確かにひじさんの方が短いですが、gunさんの方法との違いってあるんですか?どっちでも取れるならこのままで行きますけど違いあったら教えてください。


19:[回答] 薫 [2002/11/21 10:22 ]

> CGIでログを取った後にindexに自動で行かせる方法
1.Location
 → print "Location :http://******/index.html\n\n";
2.HTML表示でrefresh
とかでしょうね。


20:[回答] gun [2002/11/21 10:40 ]

Locationの方がスマートだとは思いますが(^^;、
いちおうメタで行かせる方法

print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<meta http-equiv=\"refresh\" content=\"0;url=http://******/index.html\">\n";
print "</head>\n";
print "</html>\n";


21:[回答] アクア [MAIL] [2002/11/21 10:42 ]

print "Location :http://******/index.html\n\n";
上記を書き込むだけでいいのですか?
http://の所を変えて試してみます。


22:[回答] アクア [MAIL] [2002/11/21 11:12 ]

メタで上手くいきましたがLocationでは反応が無いみたいです。
何か違ったのでしょうか?
記述してもcgiを呼び出した時に表示されるだけで終わってます。
でもメタで自動にいけるのでいいかなと思い始めました^^;


23:[回答] gun [2002/11/21 12:58 ]

Location で行う場合には、薫さんの仰るように、
書き出すのはLocation のprint文だけでイイはずです。


24:[回答] アクア [2002/11/21 13:01 ]

print "Location :http://******/index.html\n\n";
これのURLを変えるって事ですよね?
でもCGI呼び出すと表示だけされて飛ばないんですよ?
なんか変なのかな?


25:[回答] gun [2002/11/21 13:05 ]

print "Location :http://******/index.html\n\n";

以外に、何か別の文も書き出していませんか?


26:[回答] 薫 [2002/11/21 13:28 ]

>20 のgunさんの
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<meta http-equiv=\"refresh\" content=\"0;url=http://******/index.html\">\n";
print "</head>\n";
print "</html>\n";

これの1行目(レスポンスヘッダ)に相当するのが
print "Location :http://******/index.html\n\n";
です。
なので、これ1行だけで試してみてください。
print "Content-type: text/html\n\n";
が先にあったりなんかすると、普通にprintされてしまいます。


27:[回答] アクア [2002/11/21 14:05 ]

なるほど!print "Content-type: text/html\n\n";
が残ってるままでした^^;
でもって携帯(i/j/au/pc)の機種ごとでリンク先を変更する時はどうしたら良いでしょうか?User Agent で判別するのは解るのですがその先がわからないのでご指導お願いします。


28:[回答] gun [2002/11/21 23:45 ]

User Agentは環境変数 $ENV{'HTTP_USER_AGENT'}で調べます。
リンク先の変更は、$ENV{'HTTP_USER_AGENT'}に対しての
マッチングの結果で分岐すれば良いのではないでしょうか。

if ($ENV{'HTTP_USER_AGENT'}=~/DoCoMo/) {
    print "Location :http://******/docomo.html\n\n";
}
elsif ($ENV{'HTTP_USER_AGENT'}=~/J\-PHONE/) {
    print "Location :http://******/j-phone.html\n\n";
}
    : <略>
else {
    print "Location :http://******/pc.html\n\n";
}

携帯電話の UserAgent の詳細は、検索サイトで
"携帯 User Agent"の3つをキーワードにして検索してみて
ください。


29:[回答] アクア [MAIL] [2002/11/22 09:40 ]

なるほどってことは
@user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($user_agent[0] eq 'ASTEL') {
 # ドットi 用の処理
 $url = "http://url_for_astel/";
} elsif ($user_agent[0] eq 'UP.Browser') {
 # EZweb 旧端末用の処理
 $url = "http://url_for_old_ezweb/";
} elsif ($user_agent[0] =~ /^KDDI/) {
 # EZweb WAP2.0 対応端末用の処理
 $url = "http://url_for_new_ezweb/";
} elsif ($user_agent[0] eq 'PDXGW') {
 # H" 用の処理
 $url = "http://url_for_H''/";
} elsif ($user_agent[0] eq 'DoCoMo') {
 # i-mode 用の処理
 $url = "http://url_for_i-mode/";
} elsif ($user_agent[0] eq 'J-PHONE') {
 # J-SKY 用の処理
 $url = "http://url_for_j-sky/";
} elsif ($user_agent[0] eq 'L-mode') {
 # L-mode 用の処理
 $url = "http://url_for_l-mode/";
} else {
 # それ以外
 $url = "http://url_for_other/";
}
としてやり、この後に
print "<meta http-equiv=\"refresh\" content=\"0;url=$url\">\n";
このように記述すれば良いって事ですよね?


30:[回答] gun [2002/11/22 13:03 ]

ですね(^^)


31:[回答] アクア [MAIL] [2002/11/26 09:20 ]

きちんと起動するようになりました。
でもって質問なんですが設置もしくはHPのページから次にどのページに行ったかを調べるにはどうしたら良いでしょうか?
ページ別HITの測り方があったら教えてください。
よろしくお願いします。


32:[回答] ひじ [2002/11/27 00:04 ]

>>29
>としてやり、この後に
>print "<meta http-equiv=\"refresh\" content=\"0;url=$url\">\n";
>このように記述すれば良いって事ですよね?
携帯ではmeta要素によるリダイレクトは効かないと思った方がよいです。
また、携帯でなくても、meta要素によるリダイレクトはBackボタンが効かなくなるなどの弊害があるため、好ましいことではありません。


33:[回答] アクア [2002/11/27 08:57 ]

metaが駄目だったらhtmlを埋め込んでリフレッシュに変えるのみです。


34:[回答] 薫 [2002/11/27 09:12 ]

> metaが駄目だったらhtmlを埋め込んでリフレッシュ
「リフレッシュ」ってMETAのことではないかと....
どうしてLocationは却下されたのでしょうか?


35:[回答] アクア [2002/11/27 09:16 ]

言ってから俺もmetaじゃんって気が付きました^^;
キャリア取得後にLocationでもいいのかな?
って28でgunさんが書いてるのがLocationだから行けるか・・・
ちょっと試してみます。


36:[回答] アクア [2002/11/27 09:28 ]

Locationにしてもリダイレクトしています・・・
Backボタンも使用できてます。
Locationでもmetaでも両方可能になってますね。
metaよりLocationの方がスマートな感じがするけど
変りってないですよね?
どっちでもいけるならこのままLocationで行きたいと思います。
薫さんLocationは却下はしていませんよ。^^


37:[回答] gun [2002/11/27 09:56 ]

確か、
    metaだと、ブラウザから次のURLを要求
    Locationだと、WEBサーバ側で次のURLへ差し替え
という違いがあるハズで、ブラウザを介さない Location の方
が有利です。


38:[回答] akua [2002/11/27 12:28 ]

確かにそうなってるみたいですね。
色々調べてたら書いてました
でもLocationだとURLに飛ぶ時文字表示されちゃうのがネックかも
metaならhtmlからなので何も表示が出ない
どちらも使えるので後は使いやすさや好みの問題になっちゃいますね。


39:[回答] gun [2002/11/27 12:55 ]

文字表示される
とは、どういう意味ですか??


40:[回答] アクア [2002/11/27 14:33 ]

CGIに入ってから飛ぶまでの間に記号みたいなのが少し(かなり短い)時間表示されてるんです。
でも携帯でみたら表示されずに飛びました
PCだからだったのでしょうか?


41:[回答] gun [2002/11/27 14:46 ]

記号のようなモノですか。
うーん。。
Location を書き出す前に、CGI中から何か他の文字を書き出して
いませんか?


42:[回答] 薫 [2002/11/27 14:48 ]

> CGIに入ってから飛ぶまでの間に記号みたいなのが少し(かなり短い)時間表示されてる
locationされるまでの間に、何かがprintされてしまっているのでしょう。
携帯からは表示されないとの事なので(不可視なだけかもしれませんが)、
PCへの分岐部分をチェックされてみてはどうでしょう?


43:[回答] ひじ [2002/11/27 15:10 ]

http://www.parkcity.ne.jp/~chaichan
でも http://www.parkcity.ne.jp/~chaichan/ が表示される前に何か表示されますか?


44:[回答] アクア [2002/11/27 17:07 ]

どうやら時間たってから試したら表示されなくなりました
いったいなんだったんだろう?
表示されなくなったのでLocationに変えました^^
metaより短くて良いので楽ですね。
薫さんgunさんひじさんありがとうです^^


45:[回答] ひじ [2002/11/27 21:07 ]

>>44
推測ですが、cacheに古いHTML文書(meta要素によるリダイレクトが入ったもの)が残っていたのではないでしょうか。


46:[回答] akua [2002/11/28 09:02 ]

今のところ変な記述は現れないのでそうだと思います。


47:[回答] アクア [2002/11/28 16:40 ]

イメージタグでCGIをリクエストして
$ENV{'SERVER_ADMIN'}でアクセス元を取ると
イメージを呼び込んだ場所になりますが
その前のどこから来たかを調べる手立ては無いのでしょうか?
javaを使うと携帯のログが取れないので
それ以外で方法をご存知の方ご指導お願いします。


48:[完了] gun [2002/11/29 11:07 ]

こちらは完了ですね?


49:[完了] アクア [2002/11/29 11:56 ]

あっはい完了です。
こちらの方は完成したので^^;
完了忘れてすいません

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World