これは何
AWS ElasticBeanstalk 上にデプロイした Laravel で作ったアプリケーションにおいて、アプリケーションログを任意のPathに出力して、それをawslogs agent の設定をすることによりCloudWatch Logs上で見る方法について。
環境
$ php -v
PHP 7.2.13
$ composer show laravel/framework | grep versions
versions : * v5.8.3
概要
- Laravelで任意のPathにログ出力をする
-
.ebextensions
に awslogs agent の設定を記述する
詳細
Laravelで任意のPathにログ出力をする
まず config.logging.php に channel 設定を追加する
'channels' => [
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
// このブロックを追加します
'new_application_log' => [
'driver' => 'daily',
'path' => storage_path('logs/new_application.log'),
'days' => 14,
],
],
Log Facade を用いてchannel を指定する。
use Illuminate\Support\Facades\Log;
class IndexController extends Controller
{
public function index($id)
{
Log::channel('new_application_log')->getLogger()->info("this is log output");
以下略
}
}
.ebextensions
に awslogs agent の設定を記述する
// ebのdeploy時に以下のファイルを配置しますよ、という書き方
files:
// これは awslogs の設定ファイル
"/etc/awslogs/config/application_log.conf":
mode: "000644"
owner: root
group: root
// 以下の内容のファイルを配置する
content: |
// セクションタイトルなのでなんでも良い
[new_application_log]
// cloudwatch上のlog groupの名前。 /aws/elasitcbeanstalk/<applicationName>/new_application_log みたいな名前になる
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "new_application_log"]]}`
// デフォルトだとインスタンスIDっぽい。うっかり`=`の後ろに空白を入れると認識されずデフォルト設定になってしまうみたい
log_stream_name=all
// ログ出力設定と対応したPathになっていればOK
file=/var/app/current/storage/logs/new_application*.log
commands:
"01":
command: chkconfig awslogs on
"02":
// eb deploy しただけだとawslogsエージェントは再起動せずに設定が反映されないのでrestartしておく
command: service awslogs restart