76
Centralized PHP Logging Patterns Philipp Krenn@xeraa @xeraa

Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

  • Upload
    others

  • View
    20

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Centralized PHPLogging Patterns

Philipp Krenn@xeraa

@xeraa

Page 2: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

<?php

use Monolog\Logger;use Monolog\Handler\StreamHandler;

$log = new Logger('my-logger');$log->pushHandler(new StreamHandler('path/to/my.log', Logger::WARNING));

$log->error('Something went wrong...');

@xeraa

Page 3: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 4: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:
Page 5: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 6: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:
Page 7: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Developer !

@xeraa

Page 8: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 9: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 10: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 11: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 12: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 13: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:
Page 14: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Disclaimer

I build highly monitored Hello World apps

@xeraa

Page 15: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Example: PHPMonolog

@xeraa

Page 16: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

And Everywhere ElseJava: Logback / Log4j

.NET: NLog

JavaScript: Winston

Python: structlog

@xeraa

Page 17: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Anti-Pattern: echo

@xeraa

Page 18: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Logging Levelshttp://tools.ietf.org/html/rfc5424

PSR-3: Logger Interface

DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY

@xeraa

Page 19: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Anti-Pattern: Coupling

@xeraa

Page 20: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Parse !

@xeraa

Page 21: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 22: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Bind Mount Logs

php_app: volumes: - './logs/:/logs/' ...

filebeat_for_logstash: volumes: - './logs/:/mnt/logs/:ro' ...

@xeraa

Page 23: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Collect Log Lines

filebeat.inputs:- type: log paths: - /mnt/logs/*.log

@xeraa

Page 24: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Metadata

processors: - add_host_metadata: ~

@xeraa

Page 25: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:
Page 26: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Test Multiline Patternhttps://www.elastic.co/guide/en/beats/filebeat/current/

_test_your_regexp_pattern_for_multiline.html

@xeraa

Page 28: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Dev Tools

Grok Debugger

@xeraa

Page 29: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Machine Learning

Data Visualizer

@xeraa

Page 30: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Pro: No change

Con: Regular expression, multiline, format changes

@xeraa

Page 31: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Send ✉

@xeraa

Page 32: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 33: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

GelfHandler

ElasticsearchHandler

...

@xeraa

Page 34: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

ElasticsearchHandler in Action[2020-01-24 13:21:16] {"memory":2102392,"version":"1.0.0"} app_logger.DEBUG: Iteration '1'

Fatal error: Uncaught Elasticsearch\Common\Exceptions\NoNodesAvailableException: No alive nodes found in your cluster in /usr/src/app/vendor/elasticsearch/elasticsearch/src/Elasticsearch/ConnectionPool/StaticNoPingConnectionPool.php:50Stack trace:#0 /usr/src/app/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(77): Elasticsearch\ConnectionPool\StaticNoPingConnectionPool->nextConnection()#1 /usr/src/app/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(94): Elasticsearch\Transport->getConnection()#2 /usr/src/app/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(276): Elasticsearch\Transport->performRequest('POST', '/_bulk', Array, '{"index":{"_ind...', Array)#3 /usr/src/app/vendor/react/promise/src/FulfilledPromise.php(25): Elasticsearch\Connections\Connection->Elasticsearch\Connections\{closure}(Array)#4 /usr/src/app/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php(55): React\Promise\FulfilledPromise->then(Object(Closure), NULL, NULL)#5 / in /usr/src/app/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php on line 155

@xeraa

Page 35: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Pro: No files

Con: Outages & coupling

@xeraa

Page 36: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Structure !

@xeraa

Page 37: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 38: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Collect JSON

filebeat.input:- type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys: true fields: application: php

@xeraa

Page 39: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Elastic Common Schema

https://github.com/elastic/ecs

@xeraa

Page 40: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

ECS Logging Librarieshttps://github.com/elastic/ecs-logging-php

https://github.com/elastic/ecs-logging-javahttps://github.com/elastic/ecs-dotnet

more to come

@xeraa

Page 41: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Log Excpetions, Errors, Throwablesuse Elastic\Types\Error as EcsError;

try { ...}catch(Excpetion $exception) { $logger->error('Meaningful message', ['error' => new EcsError($exception)]);}

@xeraa

Page 42: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Serviceuse Elastic\Types\Service;

$serviceContext = new Service();$serviceContext->setName('my-service-x');$serviceContext->setVersion('1.0.0');

$logger->notice('Add service context', ['service' => $serviceContext]);

@xeraa

Page 43: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

User

use Elastic\Types\User;

$userContext = new User();$userContext->setId(12345);$userContext->setEmail('[email protected]');

$logger->notice('Add user information', ['user' => $userContext]);

@xeraa

Page 44: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Pro: Right format

Con: JSON serialization overhead

@xeraa

Page 45: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Containerize !

@xeraa

Page 46: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 47: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Where to put Filebeat?

Sidecar

@xeraa

Page 48: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 50: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Docker Logs

filebeat.autodiscover: providers: - type: docker hints.enabled: true

processors: - add_docker_metadata: ~

@xeraa

Page 51: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

MetadataNo Docker metadata with the other methods

@xeraa

Page 52: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

"docker": { "container": { "labels": { "app": "fizzbuzz", "co_elastic_logs/multiline_match": "after", "com_docker_compose_config-hash": "41520c6cf2b6a1f3dae4f16d0a6fd76760cdfc38fbfe43a3a3be2e09bdd1b8b5", "environment": "production", "co_elastic_logs/multiline_pattern": "^\\[", "co_elastic_logs/multiline_negate": "true", "com_docker_compose_oneoff": "False", "com_docker_compose_project": "php-logging", "com_docker_compose_service": "php_app", "com_docker_compose_container-number": "1", "com_docker_compose_version": "1.23.2" } }}

@xeraa

Page 53: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Missing the Last LineWaiting for the newline

@xeraa

Page 54: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Hints

labels: - "app=fizzbuzz" - "co.elastic.logs/multiline.pattern=^\\[" - "co.elastic.logs/multiline.negate=true" - "co.elastic.logs/multiline.match=after"

@xeraa

Page 55: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Registry File

filebeat.registry.path: /usr/share/filebeat/data/registry

@xeraa

Page 56: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Multi-Index

output.elasticsearch: hosts: ["http://localhost:9200"] indices: - index: "docker-php-%{+yyyy.MM}-00" when.contains: container.name: "docker_php"

@xeraa

Page 57: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Unknown Fields

@xeraa

Page 58: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

ASCII Art _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 55757 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'

@xeraa

Page 59: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Configuration Templatesfilebeat.autodiscover: providers: - type: docker templates: - condition: equals: docker.container.image: redis config: - type: docker containers.ids: - "${data.docker.container.id}" exclude_lines: ["^\\s+[\\-`('.|_]"]

@xeraa

Page 60: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Who Logs the LoggerAvoid loops

Process without -e

filebeat.yml: logging.to_files: true

@xeraa

Page 61: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Pro: Hot !

Con: Complexity

@xeraa

Page 62: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Orchestrate !

@xeraa

Page 63: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

@xeraa

Page 64: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Where to put Filebeat?

DaemonSet

@xeraa

Page 66: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

MetadataEither in cluster or outside

processors:

- add_kubernetes_metadata: in_cluster: true

- add_kubernetes_metadata: in_cluster: false host: <hostname> kube_config: ${HOME}/.kube/config

@xeraa

Page 67: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

{ "host": "172.17.0.21", "port": 9090, "kubernetes": { "container": { "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51", "image": "my-php:1.0.0", "name": "my-php" }, "labels": { "app": "php_app", }, "namespace": "default", "node": { "name": "minikube" }, "pod": { "name": "php-2657348378-k1pnh" } },}

@xeraa

Page 68: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

More MetadataAdd: Cloud, local timezone, process

Drop: Events, fields

Rename: Fields

Dissect, DNS reverse lookup

@xeraa

Page 69: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Configuration Templatesfilebeat.autodiscover: providers: - type: kubernetes templates: - condition: equals: kubernetes.namespace: redis config: - type: docker containers.ids: - "${data.kubernetes.container.id}" exclude_lines: ["^\\s+[\\-`('.|_]"]

@xeraa

Page 70: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Customize Indicesoutput.elasticsearch: index: "%{[kubernetes.namespace]:filebeat}-%{[beat.version]}-%{+yyyy.MM.dd}"

@xeraa

Page 71: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Pro: Hot !!!

Con: Complexity++

@xeraa

Page 72: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

PS: Filebeat Modules

filebeat.modules:- module: apache2- module: mysql- module: nginx- module: system

@xeraa

Page 73: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Conclusion

@xeraa

Page 74: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Exampleshttps://github.com/xeraa/php-logging

@xeraa

Page 75: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Parse !

Send ✉

Structure !

Containerize !

Orchestrate !

@xeraa

Page 76: Centralized PHP Logging Patterns - xeraa.net · Collect JSON filebeat.input: - type: log paths: - /mnt/logs/app.json json: message_key: message keys_under_root: true overwrite_keys:

Questions?Philipp Krenn@xeraa

@xeraa