①SQL Serverにログ保存用のDBとテーブル作成(SQL Server設定)
例:DB名→IISLogs テーブル名→InternetLog
※DB名、テーブル名は任意です

・SQL Management StudioなどでDB「IISLogs」を作成。
・「IISLogs」を右クリックして[新しいクエリ]を選択。
・以下のSQLクエリを貼り付けて実行するとテーブル「InternetLog」が生成される。



USE [IISLogs]
GO
/****** Object: Table [dbo].[InternetLog] Script Date: 12/20/2007 19:05:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[InternetLog](
[ClientHost] [varchar](255) NULL,
[username] [varchar](255) NULL,
[LogTime] [datetime] NULL,
[service] [varchar](255) NULL,
[machine] [varchar](255) NULL,
[serverip] [varchar](50) NULL,
[processingtime] [int] NULL,
[bytesrecvd] [int] NULL,
[bytessent] [int] NULL,
[servicestatus] [int] NULL,
[win32status] [int] NULL,
[operation] [varchar](255) NULL,
[target] [varchar](255) NULL,
[parameters] [varchar](255) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF




②システムDNS(データソース)の作成(Windows Server設定)
・[スタート]-[管理ツール]-[データソース(ODBC)]を開く。
・[ODBC データソース アドミニストレータ]画面で[システムDNS]タブを選択する。
・[追加]ボタンを押しデータソースのドライバで[SQL Server]を選択して[完了]ボタンを押す。
・以下の項目を入力して[次へ]ボタンを押す。
  ■データソースの名前→任意のデータソース名(例:IISLogs)を入力
  ■SQL Server サーバー名→SQL Server名
・[ユーザーが入力するSQL Server用のログインIDとパスワードを使う]を選択。
・[クライアントの設定]ボタンを押して[TCP/IP]が選択されている事を確認して[OK]ボタンを押す。
・以下の項目を入力して[次へ]ボタンを押す。
  ■ログインID→SQL Server用のログインID
  ■パスワードSQL Server用のパスワード
・[既定のデータベースを以下のものに変更する]にチェックを入れた後、保存先DB(例:IISLogs)を選択。[次へ]ボタンを押す。
・[完了]ボタンを押す。
・[データソースのテスト]ボタンを押す。
・「テストは無事に完了しました。」のメッセージが出てきたら[OK]ボタンを押す。
・再度[OK]ボタンを押して画面を閉じ、その下の画面も[OK]ボタンを押して画面を閉じる。


③ODBCロギング用の役割サービスを追加する(Windows Server設定)
・[スタート]-[管理ツール]-[サーバーマネージャ]を開く。
・左側ツリーから[役割]ツリーを開いて[Webサーバー(IIS)]を選択する。
・右側画面の[役割サービス]内の[役割サービスの追加]を押す。
・一覧から[カスタムログ]と[ODBCログ]にチェックを入れて[インストール]ボタンを押す。


④ODBCログ設定(Windows Server設定)
・コマンドプロンプトで 以下のコマンドの青字部分を環境に合わせて編集して順番に実行(4行)。


cd C:\windows\system32\inetsrv

appcmd unlock config -section:system.webServer/odbcLogging

appcmd set config -section:ODBCLogging -datasource:データソース名(例:IISLogs) -tableName:テーブル名(例:InternetLog) -username:SQL Server用のログインID -password:SQL Server用のパスワード

appcmd set sites "ログ対象のサイト(例:Default Web Site)" -logFile.logFormat:Custom -logFile.customLogPluginClsid:{FF16065B-DE82-11CF-BC0A-00AA006111E0}




以上でログがSQL Serverのテーブルにリアルタイムで登録されていくはず。
あくまでも自分の環境で成功した事なので実行は自己責任でお願いします。

参考URL:
http://www.microsoft.com/japan/opensource/php/learning/article4.mspx
http://weblogs.asp.net/steveschofield/archive/2007/12/20/iis7-post-57-how-to-setup-odbc-logging-in-iis-7-0.aspx
http://support.microsoft.com/kb/245243
■メールを送信するPHPファイルを作成。
・daily_mail.php ※内容は省略
→wwwフォルダの上の階層のtaskフォルダにセット
ffftpなどでファイルの属性を744に変更。
ぷしゆのWEBクリ道場-FFFTP属性変更


■cronで実行するシェルファイル(.sh)を作成
・daily_mail.sh
↓内容



#!/bin/sh
#PHP
/usr/local/bin/php -f /home/ユーザID/task/daily_mail.php -c /home/ユーザID/www/php.ini



→wwwフォルダの上の階層のshフォルダにセット
ffftpなどでファイルの属性を744に変更。
ぷしゆのWEBクリ道場-FFFTP属性変更


■さくらインターネットのサーバコントロールパネルで定期的にphpを実行してメールを送信する仕組みをcronで設定。
ぷしゆのWEBクリ道場-さくらインターネット_サーバーコントロール設定


以上で設定は終わり。

.sh ファイルの「c /home/ユーザID/www/php.ini」でphp設定ファイルを指定するところで悩みまくりました・・
文字列関数のRight関数 と Left関数 と Trim関数を作ってみました


//トリム関数
//左側と右側の空白(半角も全角も)を削除して返す

public function Trim($str){
mb_regex_encoding('UTF-8');
$str = mb_ereg_replace("^ +", "", $str);
$str = mb_ereg_replace(" +$", "", $str);
return mb_ereg_replace('^[\s ]*(.*?)[\s ]*$', '\1',$str);
}



サンプル:
$str = "    文字列 mojiretsu    ";
$result = Trim($str);
echo $result;
結果:"文字列 mojiretsu" と表示される


//Left関数
//左からn文字取得して返す

function Left($str,$n){
return mb_substr($str,0,(mb_strlen($str)-$n)*-1);
}



サンプル:
$str = "あああ12345678";
$result = Left($str,4);
echo $result;
結果:"あああ1" と表示される


//Right関数
//右からn文字取得して返す

function Right($str,$n){
return mb_substr($str,($n)*-1);
}



サンプル:
$str = "あああ12345678";
$result = Right($str,4);
echo $result;
結果:"5678" と表示される
標準関数で日付計算はない模様なので以下のようなコードを作りました。


//日付計算関数

//日付計算関数
function DateAdd(cat,add,ymd){
var result_ymd;
if(cat=="d"){
result_ymd = new Date(ymd.getFullYear(), ymd.getMonth(), ymd.getDate() + (add * 1));
}else if(cat=="m"){
result_ymd = new Date(ymd.getFullYear(), ymd.getMonth() + (add * 1), ymd.getDate());
}else if(cat=="y"){
result_ymd = new Date(ymd.getFullYear() + (add * 1), ymd.getMonth(), ymd.getDate());
}
return (result_ymd);
}





cat引数にはy(年) または m(月) 又は 日(d)をセット

add引数には正 または 負の整数をセット

ymd引数にはDate型の変数をセット

返り値はymdのcatにaddを足したDate型の変数になります


サンプルコード


//本日(2009/1/13)から3ヶ月前の年月日を求める場合

alert(DateAdd("m","-3",new Date()));





上記のコードを実行すると"Mon Oct 13 2008 00:00:00 GMT+0900"と表示されるはずです。

これで今からちょうど3ヶ月前の2008/10/13が求められました。

JavaScriptで小数点第n位まで求める関数は標準でないっぽいです。



そこで自作しました。




//小数点以下第n位まで求める(四捨五入)
function MyRound(kazu,n){
var w = "1";
for(i=1;i<=n;i++){
w += "0";
}
kazu = Math.round(kazu*w)/w;
return kazu;
}






これで今のとこ正常に動いてまぷ。

Shift-JIS形式でデータを保存しているDBからデータを取り出しutf-8形式に変換した際に機種依存文字が文字化けしてしまう。


×


/*対象データ$strの文字コードをShift-JIS→utf-8に変換*/


mb_convert_encoding($str,"SJIS","UTF-8"); 




上記のPHPコードだと機種依存文字列が「?」になってしまう。




webで調べたところ文字コード:SJIS-WINはShift-JISとUTF-8の機種依存文字列に対応しているとのことなので





/*対象データ$strの文字コードをShift-JIS→SJIS-WIN変換後にSJIS-WIN→UTF-8に変換*/


mb_convert_encoding(mb_convert_encoding($str,"SJIS-WIN","SJIS"),"UTF-8","SJIS-WIN");




上記のコードで対応できたっぽい。