Apacheモジュールを作る「postgresでロギングする(2)」

続き

  • Apacheモジュールを作る「postgresでロギングする(1)」 の続き。
    (1)ではテンプレの実行+αまで行った。
    (2)では、httpd.conf設定の読み込みまで行う。

全体を通して
PostgreSQL とやりとりする Apache のモジュールを作ってみた
を大いに参考にさせていただきました。

コマンド構造体の登録

「mod_pg_logger.c」下の方の、モジュール構造体の定義を修正して、コマンド構造体の登録を行う。コマンド構造体は、このモジュールの設定の取り込み方などを定義する。設定値の読み元は、おなじみhttpd.confを使うことができる。

NULL,                  /* table of config file commands       */

pg_logger_cmds,        /* table of config file commands       */

にする。

そして構造体の中身を設定。

/* difinition of this module's command_rec struct */
static const command_rec pg_logger_cmds[] = {
   // TAKE1というのは、設定フォーマットの種類。
   {
   "PGLoggerHost",
   ap_set_string_slot, (void *)XtOffsetOf(PGLogger_cfgs, host),
   OR_ALL, TAKE1,
   "Set Hostname for PostgreSQL server ",
   },
   {
   "PGLoggerDBname",
   ap_set_string_slot, (void *)XtOffsetOf(PGLogger_cfgs, dbname),
   OR_ALL, TAKE1,
   "Set DB name for PostgreSQL server",
   },
   {
   "PGLoggerUser",
   ap_set_string_slot, (void *)XtOffsetOf(PGLogger_cfgs, user),
   OR_ALL, TAKE1,
   "Set Username for PostgreSQL server",
   },
   {
   "PGLoggerTable",
   ap_set_string_slot, (void *)XtOffsetOf(PGLogger_cfgs, table),
   OR_ALL, TAKE1,
   "Set Table name ",
   },
   
   //	これがないとどこまで続くか分からないのでターミネータとして入れる
   { NULL },
};

設定保存構造体の定義(ユーザ定義)

さらに実際にメモリに確保されて値が入る構造体の定義をする。 これは構造体でなくてもよいが、まとめた方が当然管理しやすいので普通構造体として定義する。

//	設定構造体(ユーザ定義)
typedef struct {
	char *host;
	char *dbname;
	char *user;
	char *table;
} PGLogger_cfgs;

さらにさらに、この構造体のメモリを確保して、必要であればデフォルト設定などをする関数を定義する。

//	設定構造体確保(+デフォルトパラメータ設定)
static void *pg_logger_cdir_cfg(pool *pool, char *arg)
{
	//	ユーザ定義の構造体。ここに値が入る
	PGLogger_cfgs *cfg;
       
	//	poolというのは、リクエスト毎のApache子プロセスに結び付けられたリソース資源
	cfg = ap_pcalloc(pool, sizeof(PGLogger_cfgs));
	//     これはよくある手法。汎用的なvoidポインタとして返す。
	return((void *)cfg);
}

この関数もモジュール構造体に登録する。

   NULL,                  /* create per-dir    config structures */

   pg_logger_cdir_cfg,    /* create per-dir    config structures */

に。

デバッグ

ここまでで本当に設定の値が取り込めるか試すべく、コンテンツハンドラでデバッグ出力する。

/* The sample content handler */
static int pg_logger_handler(request_rec *r)
{
	//	デバッグ表示のため
	PGLogger_cfgs *cfg;
	//	設定読み込み
	cfg = ap_get_module_config(r->per_dir_config, &pg_logger_module);
	
   r->content_type = "text/html";
   ap_send_http_header(r);
   if (!r->header_only){
       ap_rputs("The sample page from mod_pg_logger.c\n", r);
       ap_rprintf(r,"%s<BR>\n",ap_table_get(r->headers_in, "Referer"));
       ap_rprintf(r,"%s<BR>\n",ap_table_get(r->headers_in, "User-Agent"));
       ap_rprintf(r,"%s<BR>\n",r->content_type);
       // 設定のデバッグ表示
       ap_rprintf(r,"%s<BR>\n",cfg->host);
       ap_rprintf(r,"%s<BR>\n",cfg->dbname);
       ap_rprintf(r,"%s<BR>\n",cfg->user);
       ap_rprintf(r,"%s<BR>\n",cfg->table);
   }
   // HTTPステータス(マクロ定義されている。200のこと)
   return OK;
}

で、このままコンパイルしても怒られる。pg_logger_moduleを使っているのに、後で定義しているからだ。そこで宣言を上のほうに追加。

//	モジュール宣言
module MODULE_VAR_EXPORT pg_logger_module;

httpd.confの修正を行う。

<Location /pg_logger>
 SetHandler pg_logger
 PGLoggerHost localhost
 PGLoggerDBname apache_log_db
 PGLoggerUser apache_logger
 PGLoggerTable t_apache_log
</Location>

これでmakeしてapachectl configtestしてrestartして再びブラウザで確認。ちゃんと設定した値が表示されていればOKPK

The sample page from mod_pg_logger.c http://kepietro.dip.jp/~pietro/ajax/in.html
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.4) Gecko/20060508      Firefox/1.5.0.4 
text/html
localhost
apache_log_db
apache_logger
t_apache_log

参考


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-11-28 (日) 21:47:37 (2344d)