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

# はじめに

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

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

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

# 使い方

1. まずモノをダウンロード
    
    [Apache log4php - Download - Apache log4php](https://logging.apache.org/log4php/download.html)
    
    composer使っても行けるみたいです。
    
2. ファイルをプロダクトの任意ディレクトリ配下に解凍展開
3. プロパティの設定
4. 設定ファイルの読み込み
5. プロダクトのファイル内にlog4phpの処理を差し込んで使用


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

## 3 プロパティの設定

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

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

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

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

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

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

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

```java
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**
    - ローテーションをできるアペンダー。サイズや日付でローテーションできる。
    - **`maxFileSize`** や **`maxBackupIndex`** などのパラメータで設定が可能。指定したサイズや数に達すると新しいファイルを作成し、古いファイルをバックアップ。
- **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
<?php

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

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

```

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

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

```php
<?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 なんてこともできるらしい。

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