スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Zend_Logでメールログとログローテート

Zend_ApplicationのブートストラップでZend_LogにライターとしてDBとファイルとメールを追加しようと思ったのですが、どうやらライターは一つしか登録できないようです。
ということで、ブートストラップで手動で設定することにしました。
ちなみに、Zend_Logではログローテートをサポートしていないようですので、このあたりも手動で設定してみます。
まずは、application.iniからログに関係するところだけ抽出しています。

resources.mail.transport.type = smtp
resources.mail.transport.host = "localhost"
resources.mail.defaultFrom.email = noreply@example.com
resources.mail.defaultFrom.name = "noreply"
resources.mail.defaultReplyTo.email = noreply@example.com
resources.mail.defaultReplyTo.name = "noreply"
resources.db.adapter = "pdo_pgsql"
resources.db.params.host = "localhost"
resources.db.params.username = "user"
resources.db.params.password = "password"
resources.db.params.dbname = "test"
resources.db.isDefaultTableAdapter = true
logger1.writerName = "Db"
logger1.writerParams.table = "t_log"
logger1.writerParams.columnMap.message = "message"
logger1.writerParams.columnMap.priority = "priority"
logger1.writerParams.columnMap.insert_ts = "timestamp"
logger1.filterName = "Priority"
logger1.filterParams.priority = 6
logger2.writerName = "Stream"
logger2.writerParams.stream_prefix = "/tmp/logs/"
logger2.writerParams.stream_postfix = ".log"
logger2.filterName = "Priority"
logger2.filterParams.priority = 3
logger3.priority = 3
logger3.to = "system@example.com,admin@example.com"
logger3.subject = "system error"

次はBootstrap.phpです

require_once 'Zend/Mail.php';
require_once 'Zend/Db/Table.php';
require_once 'Zend/Registry.php';

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
// DB初期化
protected function _initDb()
{
$resource = $this->getPluginResource('db');
$db = $resource->getDbAdapter();
Zend_Registry::set('db', $db);
Zend_Db_Table::setDefaultAdapter($db);

// ログの初期化

// DBログ
$loggerOption1 = $this->getOption("logger1");
$loggerOption1['writerParams']['db'] = $db;

// ファイルログ
$loggerOption2 = $this->getOption("logger2");
// 日付でログローテート
$dateTime = new DateTime();
$loggerOption2['writerParams']['stream'] =
$loggerOption2['writerParams']['stream_prefix'] .
$dateTime->format('Ymd') .
$loggerOption2['writerParams']['stream_postfix'];
unset($loggerOption2['writerParams']['stream_prefix']);
unset($loggerOption2['writerParams']['stream_postfix']);

// ログ生成
$logger = Zend_Log::factory(array(
$loggerOption1
,$loggerOption2
));

// メールログ
$loggerOption3 = $this->getOption("logger3");
$resource = $this->getPluginResource('mail');
$mailTr = $resource->getMail();
$mail = new Zend_Mail('UTF-8');
$to = $loggerOption3['to'];
$toAry = explode(",", $to);
foreach($toAry as $to) {
$mail->addTo($to);
}
$mail->setSubject($loggerOption3['subject']);
Zend_Registry::set('mail', $mail);
$writer = new Zend_Log_Writer_Mail($mail);
$writer->addFilter(intval($loggerOption3['priority']));
$logger->addWriter($writer);

Zend_Registry::set('logger', $logger);

// 設定の保存
Zend_Registry::set('config', $this->getOptions());
}
}

ファイルログはstreamにファイル名を指定するので、本日の日付を取得してファイル名に加えて日付でログローテートしています。

メールログはファクトリーに対応していないようなので、loggerを生成した後にaddすることにしました。

リソースのgetMailはどうやらトランスポートオブジェクトだけを生成しているようなので、別途newしました。

TOはカンマ区切りで複数登録できるようになっています。

この設定では、INFOまでDBログに出力しています。
ERRからメールログとファイルログに出力しています。
これは、priorityの値で設定できます。
スポンサーサイト

Tag : zendframework

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。