PHP
cakephp3
log4php

【PHP】composer+cakePHP+log4php開発環境構築手順

開発環境構築

XAMPP:ApacheFriends XAMPP Version 5.6.15
XAMPP Control Panel Version 3.2.1
PHP:PHP 5.6.15 + PEAR
Log4php:apache-log4php-2.3.0
Composer:Composer version 1.6.2 2018-01-05 15:28:41
CakePHP:CakePHP 3.5
IDE:Eclipse Luna SR2 (4.4.2)

XAMPPインストール

(省略)

Composer インストール

Composer ダウンロード

Windows Installer - Composer-Setup.exe

インストール注意点

1.パスが設定できるように、開発モードをチェックしてください。

  • Developer mode 

image.png

2.インストール先がローカルXAMPPのphp.exeと同じのパスに指定ください。

Composerインストール先:C:\xampp\php

3.PHPコマンドラインを使えるように、ローカルXAMPPのphp.exeを設定ください

PHPコマンドライン:C:\xampp\php\php.exe

4.動作確認

C:\xampp\phpの配下に以下三つのファイルがあることを確認してください。

image.png

CMDを起動して、以下のコマンドを実施してみてください。

cd C:\xampp\php
composer -V

image.png

cakePHPのプロジェクトAppの作成

composerで既存のパッケージから新規作成

composerで以下のコマンドを実施して、既存のパッケージからローカルに新しいプロジェクトAppを作成します。

格納先:C:\xampp\htdocs\App

cd C:\xampp\php
php composer.phar create-project --prefer-dist cakephp/app C:\xampp\htdocs\App

eclipseにインポート

eclipseを起動して、プロジェクトAppをインポートします。

注意点1:eclipseインポートエラー
「インポートするプロジェクトが見つかりません」というeclipseエラーが出るときは、以下の.projectファイルをC:\xampp\htdocs\Appの直下に置いて、インポート作業をやり直してください。

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>App</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
    </buildSpec>
    <natures>
    </natures>
</projectDescription>

注意点2:PHPサポート機能

PHP のコード補完がうまく効き、宣言/定義ジャンプができるように、PHPサポート機能を追加しましょう。

プロジェクトを選択しコンテキストメニューを表示(右クリック)-[構成]-[PHPサポートの追加]

プロジェクトAppの環境配置

Apache設定

C:\xampp\apache\conf\httpd.confに以下の設定を追加して、Apacheを再起動ください。

httpd.conf
# App
    Alias /App "C:/xampp/htdocs/App"
    <Directory "C:/xampp/htdocs/App">
        order deny,allow
        Allow from all
        Require all granted
    </Directory>

ホーム画面が出来ました!
image.png

log4phpパーケージ導入

log4phpインストール

Apache公式サイトからlog4phpのzipをダウンロードして、解凍してからプロジェクトにインストールします。

  • Apache公式サイト:
    Apache log4PHP

  • ダウンロードソース:
    apache-log4php-2.3.0-src.zip

  • 解凍したlog4phpフォルダーの格納場所:
    C:\xampp\htdocs\App\vendor\apache\log4php

composer設定

composer.json
# 追加行:"apache/log4php": "2.3.0"
"require": {
        "php": ">=5.6",
        "cakephp/cakephp": "3.5.*",
        "cakephp/migrations": "^1.0",
        "cakephp/plugin-installer": "^1.0",
        "josegonzalez/dotenv": "2.*",
        "mobiledetect/mobiledetectlib": "2.*",
        "apache/log4php": "2.3.0"
},

log4php.xml配置

log4php.xmlファイル作成
log4php.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://logging.apache.org/log4php/">
    <appender name="default" class="LoggerAppenderConsole">
        <layout class="LoggerLayoutPattern">
            <param name="conversionPattern" value="[%date{Y/m/d H:i:s.u}] [%logger][%-5level] %msg%n" />
        </layout>
    </appender>

    <!-- APP用 -->
    <appender name="appAppender" class="LoggerAppenderDailyFile">
        <param name="file" value="C:\xampp\htdocs\App\logs\APP.%s.log" />
        <param name="datePattern" value="Ymd" />
        <layout class="LoggerLayoutPattern">
            <param name="conversionPattern" value="[%date{Y/m/d H:i:s.u}] [%logger][%-5level] %msg%n" />
        </layout>
    </appender>

     <!-- APP用 -->
     <logger name="APP">
        <level value="debug" />
        <appender_ref ref="appAppender" />
    </logger>
</configuration>

  • リリース用ログ出力設定

同じようにリリース用の設定も用意しておきます。
log4php_release.xml
設定内容はほぼ同じですが、ログの保存パスをlinuxの設定と合わせる必要があります。

プロジェクトApp用環境設定
app.php
# 下記の環境設定レベル切り替え用のソースコードを追加
/**
 * Environment Level:
 *
 * develop
 * release
 *
 */
'Env' => 'develop',       // ローカル用
/*'Env' => 'release', */  // リリース用

/**
 * Configures logging options
 */
'Log' => [
         # 下記のAppログ設定のソースコードを追加 
        'app' => [
                'className' => 'App',
                'model' => 'LogEntry',
                'path' => LOGS,
                'file' => 'debug',
                'url' => env('LOG_DEBUG_URL', null),
                'scopes' => false,
                'levels' => ['debug', 'info', 'warn', 'error', ],
        ],

    'debug' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'debug',
        'url' => env('LOG_DEBUG_URL', null),
        'scopes' => false,
        'levels' => ['notice', 'info', 'debug'],
    ],
    'error' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'error',
        'url' => env('LOG_ERROR_URL', null),
        'scopes' => false,
        'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
    ],
    // To enable this dedicated query log, you need set your datasource's log flag to true
    'queries' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'queries',
        'url' => env('LOG_QUERIES_URL', null),
        'scopes' => ['queriesLog'],
    ],
],

独自ログクラスAppLog.php

cakePHPでは、app.phpに設定あるLogクラスはデフォルトでCake\Log\Engine\FileLogを使ってログ出力するようになっています。
上記app.phpにはdebug,error,queriesのデフォルト設定があり、ログレベルも既に配置され、便利なので、それをそのまま使ってもいいです。

どうしても、独自のlogクラスを作りたいとしたら、事前に「XxxxLog.php」を作って、src\Log\Engine\の直下に「XxxxLog.php」を配置しなければならなりません。なぜなら、cakePHPはカスタマイズのログ仕組みを読み込み手段は、黙然にsrc\Log\Engine\の直下にXxxxLog.phpがあるかをチェックしてカスタマイズログクラスを読み込んで使うようになっています。
というのは、app.phpのログclassNameは必ず「Xxxx」にセットしてください。
そうじゃないと、cakePHPさんが見つからなくて、エラーで怒られるのです。

独自のログクラスを作るときに、ちゃんとルールを守りましょう。
例え、自分が「AppLog.php」を作りました。
そして、src\Log\Engine\の直下に配置しています。
src\Log\Engine\AppLog.php
app.phpにログclassNameを設定するとは、
'className' => 'App',という書き方です。

log4php.xml配置の読み込み

bootstrap.php
// app.phpを呼ぶ処理(既存のまま)
try {
    Configure::config('default', new PhpConfig());
    Configure::load('app', 'default', false);
} catch (\Exception $e) {
    exit($e->getMessage() . "\n");
}

# 下記のソースコードを追加
// log4phpを格納した場所(C:\xampp\htdocs\App\vendor\apache\log4php)
require(ROOT . DS . 'vendor' . DS . 'apache' . DS . 'log4php' . DS . 'Logger.php');
try {
 $env = Configure::read('Env');
 if ($env === 'release') {
  Logger::configure ( ROOT . DS . 'config' . DS . 'log4php_release.xml' );
 } else {
  Logger::configure ( ROOT . DS . 'config' . DS . 'log4php_develop.xml' );
 }
} catch (\Exception $e) {
 die($e->getMessage() . "\n");
}

ログ出力の動作確認

AppController.php
use Logger;

public function index()
{
    // getLoggerにlog4php.xmlに定義したlogger nameをセットする
    $logger = Logger::getLogger('APP');

    $logger->info( 'ログ確認' );
    $logger->debug( 'ログ確認' );
    $logger->error( 'ログ確認' );
    $logger->warn( 'ログ確認' );
}

  • ログ出力ファイル確認
APP.20180228.log
[2018/02/28 13:59:57.427] [APP][INFO ] ログ確認
[2018/02/28 13:59:57.427] [APP][DEBUG] ログ確認
[2018/02/28 13:59:57.427] [APP][ERROR] ログ確認
[2018/02/28 13:59:57.427] [APP][WARN ] ログ確認

以上、何があれば、どうぞお気軽にご指摘ください。

参考
Windows Installer - Composer-Setup.exe
CakePHP 3.5 Red Velvet Cookbook

---I Love PHP (。・ω・。)ノ♡