Jak zapisywać logi z jednego serwisu do osobnego pliku?
Normalnie po prostu dostajesz logger
Serwis, a logi trafiają do:
%kernel.root_dir%/%kernel.environment%.log
Chciałbym logować wiadomości z serwisów SOAP tylko do:
%kernel.root_dir%/%kernel.environment%.soap.log
Nie do głównego pliku logu.
Czytałem książkę kucharską, ale nie rozumiem, jak skonfigurować monolog. Jakieś wskazówki?3 answers
MonologBundle rejestruje wszystko używając tych samych programów obsługi dla całego frameworka. Oznacza to, że jeśli jedna z Twoich usług musi logować się do różnych programów obsługi, powinieneś utworzyć własny Logger/Handler i wprowadzić go do usługi.
To może być przykładowy config (w yaml):services:
my_logger:
class: Symfony\Bridge\Monolog\Logger
arguments: [soap]
calls:
- [pushHandler, [@my_handler]]
my_handler:
class: Monolog\Handler\StreamHandler
# 200 = INFO, see Monolog::Logger for the values of log levels
arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200]
soap_service:
class: Your\Soap\Client
arguments: [@my_logger]
Mam nadzieję, że to wszystko wyjaśni.
Update: począwszy od symfony 2.1, możesz również skonfigurować, które kanały odbierają które programy obsługi, więc możesz alternatywnie zrobić coś takiego to:
services:
soap_service:
class: Your\Soap\Client
arguments: [@logger]
tags:
- { name: monolog.logger, channel: soap }
Który tworzy nowy kanał soap( tzn. instancję loggera odbierającą wszystkie programy obsługi), następnie konfiguruje różne programy obsługi dla tego kanału:
monolog:
handlers:
main:
type: stream
path: %kernel.root_dir%/%kernel.environment%.log
level: error
channels: [!soap]
soap:
type: stream
path: %kernel.root_dir%/%kernel.environment%.soap.log
level: info
channels: [soap]
Oznacza to, że główna obsługa otrzyma wszystko oprócz kanału soap, a obsługa soap otrzyma tylko kanał soap. Możesz również usunąć klucz channels
z głównego programu obsługi, jeśli chcesz, aby twój główny plik dziennika miał wszystko, ale także mieć kopię tylko dzienników soap osobno. To przynosi wiele elastyczność, a jak widzisz kanały to tablica, więc możesz wymienić kanały, które chcesz, lub użyć notacji czarnej listy !name
, aby wykluczyć niektóre i dołączyć Wszystko inne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 06:47:44
Miałem podobny problem i zdecydowałem się użyć biblioteki Monolog bezpośrednio zamiast usługi Monolog.
Monolog używa Monolog\Handler\StreamHandler
do zapisu do plików. Strona github ma prosty przykład:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');
Może być możliwe, aby nadal korzystać z usługi i po prostu wcisnąć nowy handler (i pop go po zakończeniu-w przeciwnym razie można niechcący napisać więcej niż chciałeś do własnego dziennika), ale nie testowałem tego. Szczerze mówiąc łatwiej było po prostu korzystać z biblioteki bezpośrednio.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-17 15:46:25
Rozwiązałem ten sam problem tworząc własne kanały w Konfiguracji .yml Jak wyjaśniono w tym linku Jak logować Wiadomości do różnych plików .
monolog:
channels: ['my_logger']
handlers:
my_logger:
level: debug
type: stream
path: '%kernel.logs_dir%/my_logger.log'
channels: [my_logger]
Po tym, mogę uzyskać dostęp do mojego loogera za pomocą dynamicznie utworzonej usługi o nazwie monolog. logger. my_logger Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 14:22:05