日志
最后更新于:2022-04-02 05:14:09
[TOC]
# 日志
`Phalcon\Logger` 是一个组件,其目的是为应用程序提供日志记录服务。它使用不同的适配器提供对不同后端的日志记录。它还提供事务日志记录,配置选项,不同格式和过滤器。您可以将 `Phalcon\Logger` 用于应用程序所需的每个日志记录,从调试过程到跟踪应用程序流。
## 适配器
该组件使用适配器来存储记录的消息。适配器的使用允许一个通用的日志记录接口,它提供了在必要时轻松切换后端的能力。支持的适配器是:
| 适配器 | 描述 |
| ----------------------------------- | ------------------------- |
| `Phalcon\Logger\Adapter\File` | 记录到纯文本文件 |
| `Phalcon\Logger\Adapter\Stream` | 记录到 PHP 流 |
| `Phalcon\Logger\Adapter\Syslog` | 记录到系统日志 |
| `Phalcon\Logger\Adapter\FirePHP` | 记录到FirePHP |
### 工厂
使用适配器选项加载Logger Adapter类
```php
'log.txt',
'adapter' => 'file',
];
$logger = Factory::load($options);
```
## 创建日志
下面的示例显示了如何创建日志并向其添加消息:
```php
critical(
'This is a critical message'
);
$logger->emergency(
'This is an emergency message'
);
$logger->debug(
'This is a debug message'
);
$logger->error(
'This is an error message'
);
$logger->info(
'This is an info message'
);
$logger->notice(
'This is a notice message'
);
$logger->warning(
'This is a warning message'
);
$logger->alert(
'This is an alert message'
);
// 您还可以将 log() 方法与Logger常量一起使用:
$logger->log(
'This is another error message',
Logger::ERROR
);
// 如果没有给出常数,则假设为DEBUG。
$logger->log(
'This is a message'
);
// 您也可以像这样传递上下文参数
$logger->log(
'This is a {message}',
[
'message' => 'parameter'
]
);
```
生成的日志如下:
```bash
[Tue, 28 Jul 15 22:09:02 -0500][CRITICAL] This is a critical message
[Tue, 28 Jul 15 22:09:02 -0500][EMERGENCY] This is an emergency message
[Tue, 28 Jul 15 22:09:02 -0500][DEBUG] This is a debug message
[Tue, 28 Jul 15 22:09:02 -0500][ERROR] This is an error message
[Tue, 28 Jul 15 22:09:02 -0500][INFO] This is an info message
[Tue, 28 Jul 15 22:09:02 -0500][NOTICE] This is a notice message
[Tue, 28 Jul 15 22:09:02 -0500][WARNING] This is a warning message
[Tue, 28 Jul 15 22:09:02 -0500][ALERT] This is an alert message
[Tue, 28 Jul 15 22:09:02 -0500][ERROR] This is another error message
[Tue, 28 Jul 15 22:09:02 -0500][DEBUG] This is a message
[Tue, 28 Jul 15 22:09:02 -0500][DEBUG] This is a parameter
```
您还可以使用 `setLogLevel()` 方法设置日志级别。此方法采用Logger常量,仅保存与常量一样重要或更重要的日志消息:
```php
setLogLevel(
Logger::CRITICAL
);
```
在上面的示例中,只有关键和紧急消息才会保存到日志中。默认情况下,一切都已保存。
## 事务
将数据记录到适配器,即文件(文件系统)在性能方面总是昂贵的操作。要解决这个问题,您可以利用日志记录事务。事务将日志数据临时存储在内存中,稍后在单个原子操作中将数据写入相关适配器(在本例中为File)。
```php
begin();
// 添加消息
$logger->alert(
'This is an alert'
);
$logger->error(
'This is another error'
);
// 将消息提交到文件
$logger->commit();
```
## 记录到多个处理程序
只需一次调用,`Phalcon\Logger` 就可以向多个处理程序发送消息:
```php
push(
new FileAdapter('test.log')
);
$logger->push(
new StreamAdapter('php://stdout')
);
$logger->log(
'This is a message'
);
$logger->log(
'This is an error',
Logger::ERROR
);
$logger->error(
'This is another error'
);
```
消息按照注册顺序发送给处理程序。
## 消息格式格式化
此组件在将消息发送到后端之前使用格式化程序格式化消息。可用的格式化程序是:
| 适配器 | 描述 |
| ------------------------------------- | -------------------------------------------------------- |
| `Phalcon\Logger\Formatter\Line` | 使用单行字符串格式化消息 |
| `Phalcon\Logger\Formatter\Firephp` | 格式化消息,以便将它们发送到FirePHP|
| `Phalcon\Logger\Formatter\Json` | 准备要使用JSON编码的消息 |
| `Phalcon\Logger\Formatter\Syslog` | 准备要发送到syslog的消息 |
### 单行格式化
使用单行字符串格式化消息。默认的日志记录格式为:
```bash
[%date%][%type%] %message%
```
您可以使用`setFormat()`更改默认格式,这允许您通过定义自己的格式来更改已记录消息的格式。允许的日志格式变量是:
| 变量 | 描述 |
| --------- | ---------------------------------------- |
| %message% | 预计将记录消息本身|
| %date% | 日期添加到消息 |
| %type% | 带有消息类型的大写字符串 |
以下示例显示了如何更改日志格式:
```php
setFormatter($formatter);
```
### 实现自己的格式化程序
必须实现 `Phalcon\Logger\FormatterInterface` 接口才能创建自己的记录器格式化程序或扩展现有的格式化程序。
## 适配器
The following examples show the basic use of each adapter:
### Stream Logger
流记录器将消息写入PHP中的有效注册流。[此处](http://php.net/manual/en/wrappers.php)提供了一个流列表:
```php
'w',
]
);
```
### Syslog记录器
此记录器将消息发送到系统记录器。系统日志行为可能因操作系统而异。
```php
LOG_NDELAY,
'facility' => LOG_MAIL,
]
);
```
### FirePHP记录器
此记录器在[FirePHP](http://www.firephp.org/)(Firefox的[FirePHP](http://www.firephp.org/)扩展)显示的HTTP响应标头中发送消息。
```php
log(
'This is a message'
);
$logger->log(
'This is an error',
Logger::ERROR
);
$logger->error(
'This is another error'
);
```
### 实现自己的适配器
必须实现 `Phalcon\Logger\AdapterInterface` 接口才能创建自己的记录器适配器或扩展现有的记录器适配器。
';