Я использую Google Kubernetes Engine (GKE) в сочетании со Stackdriver Logging.
Документация Stackdriver говорит, что агент ведения журнала использует некоторые специальные поля для установки полей в объекте LogEntry.
Что касается severity
поле, работает нормально. Тем не мение, time
поле работает не так, как задумано.
Следующий JSON - это журнал ошибок MySQL, который был изменен и перенаправлен на стандартный вывод:
(украшено и аннотировано для ясности)
{
"prio": 0,
"err_code": 11323,
"component": "mysqlx",
"source_line": 154,
"source_file": "socket_acceptors_task.cc",
"function": "show_startup_log",
"msg": "X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060",
"err_symbol": "ER_XPLUGIN_LISTENER_STATUS_MSG",
"SQL_state": "HY000",
"subsystem": "Server",
"label": "System",
// Added for Stackdriver Logging
"severity": "INFO",
"time": "1548054692.636",
// This is the same time written in human-readable format.
"time.readable": "2019-01-21T07:11:32.636761Z"
}
И следующее - соответствующий журнал, записанный Stackdriver Logging:
(украшено и аннотировано для ясности)
{
"insertId": "1jibhqgfw4kum0",
"jsonPayload": {
// Both `severity` and `time` fields were removed.
"msg": "X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060",
"label": "System",
"prio": 0,
"err_code": 11323,
"time.readable": "2019-01-21T07:11:32.636761Z",
"subsystem": "Server",
"source_file": "socket_acceptors_task.cc",
"err_symbol": "ER_XPLUGIN_LISTENER_STATUS_MSG",
"function": "show_startup_log",
"SQL_state": "HY000",
"source_line": 154,
"component": "mysqlx"
},
"resource": {
"type": "container",
"labels": {
"namespace_id": "myproject",
"instance_id": "506697609301173766",
"zone": "asia-east1-b",
"pod_id": "demo-demoid1234567890-sns7g",
"project_id": "harai-development",
"cluster_name": "myproject",
"container_name": "mysql-errorlog-output"
}
},
// `timestamp` doesn't reflect the value in the original log,
// which is "2019-01-21T07:11:32.636761Z".
"timestamp": "2019-01-21T07:11:44Z",
// `severity` reflects the value in the original log
"severity": "INFO",
"labels": {
"compute.googleapis.com/resource_name": "fluentd-gcp-v3.1.0-pwc9k",
"container.googleapis.com/pod_name": "demo-demoid1234567890-sns7g",
"container.googleapis.com/stream": "stdout",
"container.googleapis.com/namespace_name": "myproject"
},
"logName": "projects/harai-development/logs/mysql-errorlog-output",
"receiveTimestamp": "2019-01-21T07:11:49.560205566Z"
}
Хотя оба time
и severity
поля были удалены, timestamp
поле в LogEntry не отражает время, указанное в исходном time
поле.
Как я могу установить timestamp
к моменту создания журнала?
В конфигурации Fluentd для кластера GKE формат времени определяется следующим образом:
time_format %Y-%m-%dT%H:%M:%S.%NZ
Следовательно, он будет работать должным образом, если time
поле как "2019-01-21T07:11:32.636761000Z"
.