JSON Log in PHP and Cloud Watch(1)JSON Format in PHP

本文介绍如何使用PHP的日志框架KLogger配置纯JSON格式的日志,并将这些日志集成到AWS CloudWatch中进行高效搜索。通过示例代码展示了如何设置不同类型的日志记录器并调整日志级别。
JSON Log in PHP and Cloud Watch(1)JSON Format in PHP

One way to powerful the search in CloudWatch Log is to use Pure JSON in log.

First Step Configure JSON Format Log in PHP
I am using this logging framework in PHP right now
https://github.com/katzgrau/KLogger

So the changes will be similar to this.
<?php
namespace JobConsumerPHP;

require __DIR__ . '/../../vendor/autoload.php';

use \Psr\Log\LogLevel;
use \Katzgrau\KLogger\Logger;

class LoggerUtil
{
private $logger = null;
private $rawJobLogger = null;
private $jobRedisLogger = null;
private $jobSolrLogger = null;
private $jobBackupLogger = null;

public function __construct($ioc)
{
$config = $ioc->getService("config");

$logLevelConfig = $config["loggingLevel"];
$logLevelSystem = getenv('LOGGING_LEVEL');

// default is from config
$logLevel = $logLevelConfig;
if (!empty($logLevelSystem)) {
$logLevel = $logLevelSystem;
}

$logLevelSetting = $this->getLogLevelSetting($logLevel);
$options = array(
'appendContext' => false,
'logFormat' => json_encode([
'datetime' => '{date}',
'logLevel' => '{level}',
'message' => '{message}',
'context' => '{context}',])
);

$this->logger = new Logger('php://stdout', $logLevelSetting, $options);
// 'php://stdout'
$this->rawJobLogger = new Logger('php://stdout', $logLevelSetting, $options);
$this->jobRedisLogger = new Logger('php://stdout', $logLevelSetting, $options);
$this->jobSolrLogger = new Logger('php://stdout', $logLevelSetting, $options);
$this->jobBackupLogger = new Logger('php://stdout', $logLevelSetting, $options);
}

public function getLogLevelSetting($logLevel)
{
$logLevelSetting = null;

switch ($logLevel) {
case 'DEBUG':
$logLevelSetting = LogLevel::DEBUG;
break;
case 'ERROR':
$logLevelSetting = LogLevel::ERROR;
break;
case 'INFO':
$logLevelSetting = LogLevel::INFO;
break;
case 'WARN':
$logLevelSetting = LogLevel::WARNING;
break;
default:
$logLevelSetting = LogLevel::DEBUG;
}
return $logLevelSetting;
}
public function getLogger()
{
return $this->logger;
}
public function getRawJobLogger()
{
return $this->rawJobLogger;
}
public function getJobRedisLogger()
{
return $this->jobRedisLogger;
}
public function getJobSolrLogger()
{
return $this->jobSolrLogger;
}
public function getJobBackupLogger()
{
return $this->jobBackupLogger;
}
}
?>

When we use the logging in our PHP class, it will be similar to this
function convertUnix2DateTime($unixTime)
{
$logger = $this->ioc->getService("logger");
if (is_numeric($unixTime)) {
$logger->debug("convert the unixTime to DateTime", array('unixTime' => $unixTime));
$dateTime = date('Y-m-d\TH:i:s\Z', $unixTime);
} else {
$dateTime = $unixTime;
}
return $dateTime;
}

The output will be
{"datetime":"2017-12-29 21:29:47.276477","logLevel":"DEBUG","message":"convert the unixTime to DateTime","context":"{"unixTime":"1473216774"}"}
{"datetime":"2017-12-29 21:29:47.276699","logLevel":"DEBUG","message":"convert the unixTime to DateTime","context":"{"unixTime":1473216774}"}

Next Step is to deploy this and Try the Search on Cloud Watch

References:
https://github.com/katzgrau/KLogger
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
<think>我们正在讨论Docker日志配置选项。根据引用,用户可能想了解如何在Docker中配置日志选项,特别是通过docker-compose或直接使用docker命令来设置日志驱动及其选项。 根据引用[1][2][3][5],Docker默认使用json-file日志驱动,它将日志存储在主机上的JSON文件中。我们可以配置日志文件的大小和数量,以防止日志文件占用过多磁盘空间。 在docker-compose.yml中,我们可以为每个服务配置logging选项,例如: logging: driver: "json-file" options: max-size: "100m" # 每个日志文件的最大大小 max-file: "3" # 保留的日志文件数量 在直接使用docker run命令时,我们可以使用--log-opt参数来设置这些选项: docker run --log-driver=json-file --log-opt max-size=100m --log-opt max-file=3 ... 现在,我们来详细说明Docker日志选项的配置方法。 注意:在引用中,用户提供了多个docker-compose配置示例,其中都包含了logging配置。因此,我们可以总结出通用的配置方法。</think>### Docker日志配置选项详解 Docker提供了灵活的日志管理机制,通过配置`logging`选项可控制容器日志的存储、轮转和格式。以下是核心配置参数及使用方法: #### 1. **基础配置语法** 在`docker-compose.yml`中配置: ```yaml services: your_service: logging: driver: "json-file" # 日志驱动类型 options: max-size: "100m" # 单个日志文件最大尺寸 max-file: "3" # 保留的日志文件数量 ``` #### 2. **关键配置选项** | 选项 | 说明 | 示例值 | 数学约束[^5] | |---------------|----------------------------------------------------------------------|-----------------|-----------------------------| | `max-size` | 单个日志文件最大尺寸 | `"10m"`, `"2g"` | $ \text{size} \leq \text{max-size} $ | | `max-file` | 保留的日志文件数量 | `"3"`, `"10"` | $ \text{file\_count} \leq N $ | | `tag` | 日志条目前缀(支持模板如 `{{.Name}}`) | `"app_{{.ID}}"` | - | | `labels` | 日志的元数据标签 | `"env:prod"` | - | | `env` | 包含的环境变量作为日志元数据 | `"TZ"` | - | #### 3. **日志驱动类型** | 驱动类型 | 特点 | 适用场景 | |----------------|----------------------------------------------------------------------|-----------------------| | `json-file` | 默认驱动,日志存为JSON文件[^2] | 本地开发、基础运维 | | `syslog` | 直接发送到syslog服务器 | 集中式日志管理 | | `journald` | 使用systemd日志系统 | Systemd环境 | | `awslogs` | 发送到Amazon CloudWatch Logs | AWS云环境 | | `gelf` | Graylog扩展日志格式 | Graylog/ELK栈集成 | #### 4. **配置示例** **场景1:限制日志大小与数量** ```yaml # 限制每个日志文件100MB,保留3个文件[^5] logging: driver: "json-file" options: max-size: "100m" max-file: "3" ``` **场景2:添加自定义标签** ```yaml # 添加环境标签和容器ID前缀 logging: driver: "json-file" options: tag: "prod_{{.Name}}_{{.ID}}" labels: "environment" ``` **场景3:Syslog集成** ```yaml # 发送日志到Syslog服务器 logging: driver: "syslog" options: syslog-address: "tcp://192.168.0.10:514" tag: "nginx" ``` #### 5. **日志文件路径** 使用`json-file`驱动时,日志存储在: $$ \text{/var/lib/docker/containers/}\langle \text{container\_id} \rangle \text{/}\langle \text{container\_id} \rangle \text{-json.log} $$ 可通过命令查看路径: ```bash docker inspect --format='{{.LogPath}}' <container_name> ``` #### 6. **最佳实践** 1. **生产环境配置**: ```yaml logging: driver: "json-file" options: max-size: "1g" # 根据磁盘空间调整 max-file: "5" # 保留适当历史日志 compress: "true" # 启用压缩(部分驱动支持) ``` 2. **日志轮转原理**: - 当日志文件达到`max-size`时,重命名为`<filename>.1` - 旧文件序号递增,超出`max-file`的文件被删除 - 满足关系:$ \text{磁盘占用} \leq \text{max-size} \times \text{max-file} $ 3. **调试技巧**: ```bash # 查看实时日志 docker logs -f <container_name> # 检查日志驱动配置 docker inspect -f '{{.HostConfig.LogConfig.Type}}' <container_name> ``` > 通过合理配置日志选项,可有效平衡日志完整性和存储空间占用[^1][^3]。对于大规模部署,建议使用`syslog`或`gelf`驱动实现集中式日志管理。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值