2013-04-12 8 views
7

में monolog चैनल स्विच मैं हमेशा की तरह dev.log तुलना में एक अलग फ़ाइल में लॉग इन करें याSymfony 2.1 - नियंत्रक

मुझे पता है कि यह अलग-अलग चैनलों के साथ किया जा सकता है prod.log करना चाहते हैं और मैं कई सेवाओं में इसका इस्तेमाल किया , लेकिन मैं एक नियंत्रक में मोनोलॉग चैनल स्विच करने के बारे में बहुत स्पष्ट नहीं हूँ।

सेवा में आप सेवा परिभाषा में tags विशेषता के माध्यम से चैनल को परिभाषित करते हैं, लेकिन मैं इसे एक नियंत्रक में या किसी विशिष्ट कार्रवाई में बेहतर तरीके से कैसे कर सकता हूं?

मुझे पता है कि एक संभव समाधान इस होगा: Symfony 2 : Log into a specific file

लेकिन यह सिर्फ एक कस्टम फाइल करने के लिए लॉग इन करने के लिए दो नई सेवाओं को परिभाषित करने के overkill लगता है।

उत्तर

23

ऐसा करने का एकमात्र तरीका है अपने controller as a service को परिभाषित करना और एक कस्टम चैनल के साथ एक कस्टम लॉगर इंजेक्ट करना।

चूंकि चैनल स्वचालित रूप से बनाए जाते हैं, इसलिए वर्तमान में कोई अन्य तरीका नहीं है, लेकिन यह एक दिलचस्प अनुरोध है और आप पहले नहीं हैं, इसलिए मैंने बंडल कॉन्फ़िगरेशन स्तर पर चैनलों की परिभाषा की अनुमति देने के लिए issue on MonologBundle बनाया है। इस तरह आप $this->get('monolog.logger.mychannel') का उपयोग कर नियंत्रक से उचित लॉगर प्राप्त कर सकते हैं (यदि आप चैनल मौजूद हैं तो आप पहले से ही कर सकते हैं, लेकिन यदि आप नियंत्रक के लिए एक कस्टम चैनल नहीं चाहते हैं जो कुछ और उपयोग नहीं करता है)।

अद्यतन:

सिम्फोनी/एकलाप-बंडल के रूप में 2.4.0 आप के रूप में अतिरिक्त चैनलों को परिभाषित कर सकते हैं:

monolog: 
    channels: ["foo", "bar"] 

तो फिर तुम यह रूप में $this->get('monolog.logger.mychannel')

+1

+1 इस समस्या को बनाने के लिए github –

+2

@ JohannesKlauß में बंडल की आने वाली रिलीज में कल मैं इस बीटीडब्ल्यू के लिए एक उचित फिक्स शामिल कर दूंगा। – Seldaek

3

प्राप्त कर सकते हैं मैं वर्तमान में हूँ symfony/monolog-bundle 2.3.0 का उपयोग करके और निम्न कोड काम करता है।

config.yml

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: info 
     doctrine: 
      type: stream 
      path: %kernel.logs_dir%/doctrine_%kernel.environment%.log 
      level: debug 
      channels: doctrine 

में विन्यास नियंत्रकों

$doctrineLogger = $this->get('monolog.logger.doctrine'); 

पर आशा है कि यह मदद करता है।

+3

यह काम कर रहा है, यह केवल चैनलों को गायब कर रहा है: ['सिद्धांत'] 'हैंडलर से पहले – kunicmarko20

5

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं symfony/monolog-bundle 2.1.x का उपयोग कर एक समान आवश्यकता में भाग गया। मुझे लगता है कि मुझे अन्य धागे में बिल्कुल वही चीज़ नहीं मिल रही थी, इसलिए मैं यहां अपना समाधान दस्तावेज कर रहा हूं, जो एक कस्टम चैनल का उपयोग करने वाले लॉगर कंटेनर को बनाना था।

config.yml में

monolog: 
    handlers: 
     user_actions: 
      type: stream 
      path: "%kernel.logs_dir%/%kernel.environment%-user-actions.log" 
      level: info 
      channels: [user_actions] 

मेरी बंडल के services.yml

acme.logger.user_actions: 
    class: Acme\MyBundle\Monolog\UserActionsLogger 
    arguments: ['@logger'] 
    tags: 
     - { name: monolog.logger, channel: user_actions } 

src/एक्मे/MyBundle/monolog/UserActionsLogger में।php

<?php 

namespace Acme\MyBundle\Monolog; 

class UserActionsLogger 
{ 
    public $logger; 

    public function __construct($logger) 
    { 
     $this->logger = $logger; 
    } 
} 

तो फिर तुम साथ अन्य सेवा में लकड़हारा कंटेनर इंजेक्षन या तो कर सकते हैं:

acme.user.authenticationhandler: 
    class: %acme.user.authenticationhandler.class% 
    public: false 
    arguments: ['@router', '@security.context', '@acme.logger.user_actions'] 

या, आप चुनिंदा किसी भी नियंत्रक में एक सेवा के रूप लकड़हारा कंटेनर इस्तेमाल कर सकते हैं:

$userActionsLogger = $this->get('acme.logger.user_actions'); 

फिर आप वास्तविक लॉगर तक पहुंच सकते हैं:

$userActionsLogger->logger->info('A thing happened!')