Symfony4 : separate log files for different domains - php

I have 3 web domains (first.com, second.com, third.com) and I'm trying to have separate log files for each of these domains.
I'm using php7.4, Symfony4 and Monolog, I managed to have the 3 log files, but so far every attempt I made just modified every log file, no matter which domain I was on.
I tried to use the host and url options, but it kept modifying all 3 files at the same time.
Here is my monolog.yaml file with different examples of what I tried :
monolog:
handlers:
main_first:
host: "first.com"
type: fingers_crossed
action_level: error
handler: first
excluded_404s:
# regex: exclude all 404 errors from the logs
- ^/
first:
type: rotating_file
path: "%kernel.logs_dir%/first/%kernel.environment%.log"
level: debug
max_files: 30
main_second:
url: "second.com"
type: fingers_crossed
action_level: error
handler: second
excluded_404s:
# regex: exclude all 404 errors from the logs
- ^/
second:
type: rotating_file
path: "%kernel.logs_dir%/second/%kernel.environment%.log"
level: debug
max_files: 30
main_third:
type: fingers_crossed
action_level: error
handler: third
excluded_404s:
# regex: exclude all 404 errors from the logs
- ^/
third:
type: rotating_file
path: "%kernel.logs_dir%/third/%kernel.environment%.log"
level: debug
max_files: 30
Is there any way to tell Monolog to modify a specific file depending on the domain of the request ?
If not, how can I manage to do so without Monolog ?

Related

Saving command logger output to log file and console

I wrote a very simple test command which has LoggerInterface injected in its constructor.
How am I suppose to change the monolog.yaml configuration to save this logger output to both log file and to output it to console?
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
formatter: monolog.line.formatter
handler: terminal
excluded_http_codes: [404, 405]
buffer_size: 50 # How many messages should be saved? Prevent memory leaks
terminal:
type: stream
path: "php://stderr"
level: debug
console:
type: console
process_psr_3_messages: false
channels: [ "!event", "!doctrine" ]
The commands will always stderr by default (if you specify the -vvv option)
If you need to write the logs in a file only on error (with the stack error) you can use the finger_crossed handler :
handlers:
main:
# fingers_crossed allow to log only if action_level defined is reach
type: fingers_crossed
# minimum level to activate the handler
# available level (emergency|alert|critical|error|warning|notice|info|debug){1}
action_level: error
# wrapped handler's name
handler: nested
nested:
# stream allow to write log in file
type: stream
# path to the log file
path: "%kernel.logs_dir%/%project_name%_%kernel.environment%.log"
# available level (emergency|alert|critical|error|warning|notice|info|debug){1}
level: debug
If you want to filter a bit the logs shown in the stderr you can use the default config for the console :
console:
type: console
process_psr_3_messages: false
channels: ['!event', '!doctrine', '!console']
I'll allow you to have nicer console logs (and avoid too many "useless" logs such as event or doctrine which are very verbose)
You can use the "group" handler https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/Configuration.php#L137
Check an implementation here https://symfony.com/doc/current/logging/monolog_email.html
You can do this like your terminal handler does. copy the terminal handler and set the path to the file. Both handlers will be executed.
monolog:
handlers:
main:
...
terminal:
...
terminal_file:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%-terminal.log"
level: debug
You can also do this to log different channels to different files.
Sometimes i use this, to log doctrine debug messages to a different file, by adding the doctrine channel.
monolog:
handlers:
...
doctrine_debug:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%-doctrine.log"
level: debug
channels: ["doctrine"]

monolog configuration in symfony and customization

I am working on a web app built using Symfony 2.6 and there are different configuration inside app/config folder. How do I know which one is being used.
Inside app/config I see config.yml config_dev.yml config_prod.yml and the monolog entry I see in config_dev.yml and also in monolog_prod.yml. It is as below.
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
nested:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
console:
type: console
Now I want to use monolog to input some logs in a controller and put those logs separate form other logs. How can this be done?.
You know which one is used on your environment.
If you are in dev mode you are using config_dev.yml merged with config.yml
You can check it into your virtual host if the file is on app.php you are in prod mode, if the file points to app_dev.php you are in dev mode usually
To log into other files you can create a channel like this:
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
your_handler:
level: debug
type: stream
path: '%kernel.logs_dir%/custom.log'
channels: ['your_channel']
nested:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
console:
type: console
And into your controller you can call it in this way:
$logger = $this->get('monolog.logger.your_handler');
$logger->debug('your custom message into your custom log file');

Symfony production logs

In Symfony 3 is there anyway i can write all errors to logs on production without setting the debug mode on? Errors would include http 500 errors or application errors or the php errors which are silenced due to the error flag set to false on production.
The current log config for production is
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: info
channels: [!request, !event, !translation, !kernel, !security, !php, !snc_redis]
php:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%_php.log"
level: warning
channels: [php]
You could use the default production settings (taken from the monolog-bundle recipe) for this:
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
excluded_404s:
# regex: exclude all 404 errors from the logs
- ^/
nested:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
What happens with this configuration is that Monolog buffers all messages during a request, but only writes them to the log when an error appears. This way you will not "flood" your logs with noisy debug and info messages all the time. You only get full log information when there was an error during a request.

Symfony do not log deprecations

i want the log to behave like the regular php-log in production.
There is a logrotate in place and the server-logs are analyzed with other tools.
So i set up my config_prod.yml like that:
monolog:
use_microseconds: false
handlers:
main:
type: error_log
level: WARNING
deduplicated:
type: deduplication
time: 60
handler: main
Somehow the deprecations (via #trigger_error) appear in my log, too.
Can i disable the logging of the deprecations somehow?
I don't need them in prod but only in dev.
Kind regards.
Patrick
You can try to exclude a channel php from your handler
use_microseconds: false
handlers:
main:
type: error_log
level: WARNING
deduplicated:
type: deduplication
time: 60
handler: main
channels: ['!php']

configure a regex path in yaml to exclude exceptions

In monolog you can exclude path so that when an exception happens it doesn't get logged into prod.log
I wanted to exclude all logs from /items/* so I did the following:
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: file
channels: ["!doctrine", "!event", "!security", "!request"]
excluded_404s:
- ^/items/
I wanted to exclude errors from /items/19283712 and anything that has /items/WHATEVERCRAPINHERE . The documentation shown here details on how to do it. I've tried the regex above and it doesn't seem to work. Why is this?
You can use the following syntax ^/items/*
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: file
channels: ["!doctrine", "!event", "!security", "!request"]
excluded_404s:
- ^/items/*

Categories