😇

Log4php 使用方法(自分用、詳しくは公式サイトへ!!)

2023/12/09に公開

はじめに

現在、自身が使用しているプロダクトにlog4phpを導入しようとしています

しかし、使い方がわからなかったので調べてみることに。

※極限まで突き詰めるつもりはありません!!

使い方

  1. まずモノをダウンロード

    Apache log4php - Download - Apache log4php

    composer使っても行けるみたいです。

  2. ファイルをプロダクトの任意ディレクトリ配下に解凍展開

  3. プロパティの設定

  4. 設定ファイルの読み込み

  5. プロダクトのファイル内にlog4phpの処理を差し込んで使用

※番号1、2 は割愛します。

3 プロパティの設定

設定ファイルの記載方法について(自分はここに苦戦しました)

log4phpを動かすうえで、いくつか値を設定する必要があります。

今回はわかり易そうな iniファイル形式を採用

以下の要件でログを出力します。

  • ファイルに追記出力
  • ファイルサイズでローテートしたい
  • フォーマットを指定したい
  • 出力先を指定したい
  • エラーレベルは INFO以上を出力する(※レベルについては後述)

上の要件を満たす設定ファイルは以下です。

(# 等でコメントアウト書けるそうですが、自分の環境では外さないと動きませんでした)

log4php.rootLogger = INFO, dest

log4php.appender.dest = LoggerAppenderRollingFile
log4php.appender.dest.file = ログ出力先絶対パス
log4php.appender.dest.append = true
log4php.appender.dest.maxFileSize = 5MB
log4php.appender.dest.maxBackupIndex = 5
log4php.appender.dest.compress = false
log4php.appender.dest.layout = LoggerLayoutPattern
log4php.appender.dest.layout.conversionPattern =  "%date{Y-m-d H:i:s.u} %-8level From : [%server{REMOTE_ADDR}] To : [%-20logger] Request : [%request] MSG : [%message]%newline”

上から説明していきます。

log4php.rootLogger

構文 : log4php.rootLogger = エラーレベル, 出力する人の名前

全体のログの管理を担当する人の設定を行う行

この項目にはどのエラーレベルのログを、どの担当者(ファイルアペンダー)に出してもらうかを設定します。

設定しない場合はデフォルトの設定になるそうです。

エラーレベル(上に行くほど高い)
INFOを指定したら、INFO以上が取れます。

  • FATAL : これが出たら、アプリが停止します。
  • ERROR : 文字通りエラーの情報、
  • WARNING : 致命的ではないが、注意が必要な情報、アプリ自体は動く、かもしれない
  • INFO : 通常の動作時の情報を記録、たいていこれ。
  • DEBUG : 最も詳細な情報を記録、デバッグ目的
  • TRACE : DEBUGよりも詳細な情報、トラブルシューティング目的

出力する人の名前

公式ドキュメントにはファイルアペンダーとありました。

要は出力する人の名前です。何でもいいそうです。今回はdestとしました。

この後の設定項目で必要です。

log4php.appender.dest

構文 : log4php.appender.dest = LoggerAppenderFile

destさんがどういう風にログ出力するかを決めます。

以下のいずれかを設定できます。

今回はLoggerAppenderRollingFileを採用

  • LoggerAppenderFile
    • ファイルにログを出力する基本的なアペンダー。
    • ログファイルには追記される、サイズやバックアップによるローテーションはせず。
  • LoggerAppenderRollingFile
    • ローテーションをできるアペンダー。サイズや日付でローテーションできる。
    • maxFileSizemaxBackupIndex などのパラメータで設定が可能。指定したサイズや数に達すると新しいファイルを作成し、古いファイルをバックアップ。
  • LoggerAppenderDailyFile
    • ローテーションを日単位で行うアペンダー。毎日ログファイルを新しいものに切り替えます。
  • LoggerAppenderSyslog
    • Syslog サーバーにログを送信するためのアペンダー。
  • LoggerAppenderMail
    • ログをメールで送信するためのアペンダー。

log4php.appender.dest.file

構文 : log4php.appender.dest.file = /hogehoge/hogehoge2/hogehoge/log/app.log

出力先を指定。絶対パス

ちなみに出力日時をファイル名に付与させたい場合は

%d{YmdHis}のフォーマットのように書くことはできません。

php側で処理を加える必要あり。

log4php.appender.dest.append

構文 : log4php.appender.dest.append = true

追記するかの設定(true かfalse)

log4php.appender.dest.maxFileSize

構文 : log4php.appender.dest.maxFileSize = 5MB

1ファイルの最大サイズを指定

log4php.appender.dest.maxBackupIndex

構文 : log4php.appender.dest.maxBackupIndex = 5

ログファイルを何世代まで持つか

log4php.appender.dest.compress

構文 : log4php.appender.dest.compress = false

指定したファイル容量上限を超える、新しい日付になるなど、

自分で設定したローテート条件が満足され、

新しいファイルを作成する際に古いファイルを圧縮するか否か。

true か false

log4php.appender.dest.layout

構文 log4php.appender.dest.layout = LoggerLayoutPattern

  • LoggerLayoutPattern: パターンに基づいてログの書式を設定します(%d, %p, %c, %m, %n などを使用)。
  • LoggerLayoutSimple: 単純な書式のログ出力を提供します。
  • LoggerLayoutHtml: HTML 形式でログを出力します。

出力するログ書式について設定。

今回は何時何分にどのアドレスの人が、などまで知りたいため LoggerLayoutPatternを採用

log4php.appender.dest.layout.conversionPattern

構文 : log4php.appender.dest.layout.conversionPattern = "%date{Y-m-d H:i:s.u} %-8level From : [%server{REMOTE_ADDR}] To : [%-20logger] Request : [%request] MSG : [%message]%newline”

ここのフォーマットの書き方はカスタマイズ性が高いです!!!

キリがなさそうので構文例のもののみ紹介します

  • %date{Y-m-d H:i:s.u}: 日付と時間を指定されたフォーマットで出力。Y は年、m は月、d は日、H は時、i は分、s は秒、u はマイクロ秒を表。

  • %-8level: ログレベルを8文字で表示し、左寄せ。

  • %server{}: スーパーグローバル変数の$_SERVERの値を扱えます。

    例えば %server{REMOTE_ADDR}なら繋いできた人のIPアドレスなど。

  • **%logger** : ロガー名(※後述)

  • **%request** : スーパーグローバル変数の $_REQUESTを扱えます

  • %message : ログのメッセージを出力(※後述)

  • %newline : 改行を行います。

%logger と %messageは実際に使うときに指定します。

指定方法は後々出てきます。あともう少しなので頑張って。

4.プロパティファイルの読み込み

<?php

// 公式さんはこうしてました。
// 自分はオートローダがあったのでそっちを使用してます。
include('Logger.php');

//設定ファイルの読み込み
//LOG_CONF_PATHは上で書いたiniファイルの絶対パスで
Logger::configure(LOG_CONF_PATH);

これだけでいいそうです。

5.ログファイルへの出力

<?php
include('Logger.php');
Logger::configure(LOG_CONF_PATH);

$logger = Logger::getLogger(ロガー名) 
//上記で出てきたものです。ここで入れた値が %logger として扱えます。

//ログ出力(この()の中が%message として扱えます)
$logger->debug('This is a debug message');
$logger->info('This is an info message');
$logger->warn('This is a warning message');
$logger->error('This is an error message');
$logger->fatal('This is a fatal message');

こんな感じで書くと、ログにはこんな感じで出ます。

2023-12-09 19:24:50.400 INFO     From : [繋いできた人のIP] To : [index.php       ] Request : [email=hogehoge.com password=hogehoge] MSG : [This is an info message]
2023-12-09 19:24:50.400 WARN     From : [繋いできた人のIP] To : [index.php       ] Request : [] MSG : [This is a warning message]
2023-12-09 19:24:50.400 ERROR    From : [繋いできた人のIP] To : [index.php       ] Request : [] MSG : [This is an error message]
2023-12-09 19:24:50.400 FATAL    From : [繋いできた人のIP] To : [index.php       ] Request : [] MSG : [This is a fatal message]**

多分、これで使えます。

動かなかったら、公式のほうも読んでみてください。

終わりに

出力ファイル名のところに

%d{YmdHis}のフォーマットのように書くことはできません。php側で処理を加える必要あり。

と書きましたが、 LoggerAppenderDailyFile を指定すれば

app_20231209121212.log なんてこともできるらしい。

そっちに変えようかしら。

Discussion