2011-10-10 31 views
15

Trong số cookbook article này, chúng tôi có thể xem cách sử dụng kênh tùy chỉnh trong một dịch vụ. Nhưng làm cách nào tôi có thể sử dụng kênh đăng nhập tùy chỉnh trong một lệnh?kênh ghi nhật ký monolog tùy chỉnh trong lệnh symfony2

Tôi đã tạo lệnh symfony2 để thực hiện điều gì đó. Tôi muốn sử dụng monolog để ghi lại những điều được thực hiện bởi lệnh của tôi.

Thực ra, tôi muốn viết nhật ký cho lệnh của mình trong một tệp khác so với nhật ký của ứng dụng.

+0

Tôi muốn biết cách thực hiện điều này quá – HappyDeveloper

+2

Đã trả lời trong http://stackoverflow.com/questions/8169114/how-to-write-logs-from-one-service-into-separate-file/8210892#8210892 – Seldaek

+0

cảm ơn, tôi đã trả lời câu hỏi của mình bằng liên kết này. – Reuven

Trả lời

0

Trong hầu hết các trường hợp, lệnh của bạn mở rộng ContainerAwareCommand (như được thấy ở đây: http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command).

Điều này có nghĩa là lệnh của bạn có quyền truy cập vào vùng chứa dịch vụ của Symfony - đó là một túi lớn của tất cả các dịch vụ bên trong Symfony (tức là các đối tượng hữu ích). Trong trường hợp của bạn, bạn cần dịch vụ logger, mà bạn có thể nhận được bằng cách lấy nó ra khỏi container:

$logger = $this->getContainer()->get('logger'); 

(tham khảo: http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container)

Bây giờ bạn có thể sử dụng logger như bình thường. Nếu bạn cần bất kỳ dịch vụ nào khác, chỉ cần kiểm tra lệnh php app/console container:debug, liệt kê mọi dịch vụ đơn lẻ trên vùng chứa.

Chúc may mắn!

+1

Cảm ơn câu trả lời của bạn. Tôi biết cách sử dụng logger. Tôi muốn biết làm thế nào tôi có thể sử dụng một kênh tùy chỉnh cho logger này. Tôi muốn đăng nhập các kết quả của lệnh của tôi trong một tập tin khác. – Reuven

+0

câu hỏi hay. Có ai biết câu trả lời không? –

6

Bất kỳ lệnh tùy chỉnh kéo dài ContainerAwareCommand, có quyền truy cập vào dịch vụ chứa Symfony của. Bạn có thể xác định một dịch vụ đăng nhập vào một kênh tùy chỉnh trong cấu hình của bạn.

<services> 
    <service id="console.logger" parent="monolog.logger_prototype"> 
     <argument index="0">mychannel</argument> 
    </service> 
</services> 

Bạn có thể truy cập dịch vụ của bạn từ lệnh theo cách sau

$logger = $this->getContainer()->get('console.logger'); 

logger này sẽ đăng nhập với kênh như "mychannel".

FYI Dịch vụ nhật ký mặc định đăng nhập vào kênh "ứng dụng". Điều này có thể được nhìn thấy trong tập tin Symfony/Bundle/MonologBundle/Resources/config/monolog.xml. Đây cũng là nơi dịch vụ logger mặc định được xác định.

<services> 
    <service id="monolog.logger" parent="monolog.logger_prototype" public="false"> 
     <argument index="0">app</argument> 
    </service> 

    <service id="logger" alias="monolog.logger" /> 

    <service id="monolog.logger_prototype" class="%monolog.logger.class%" abstract="true"> 
     <argument /><!-- Channel --> 
    </service> 
</services> 
4

Hãy thử điều này, sử dụng thư viện trực tiếp

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

// ... 

// create a log channel 
$log = new Logger('name'); 
$log->pushHandler(new StreamHandler('path of log file', Logger::WARNING)); 

//add the erros to log file 

try { 
    //do something 
} catch(Exception $e) { 
    $log->addError($e->getMessage()); 
} 

Có lẽ điều này có thể giải quyết vấn đề của bạn, thêm này vào tập tin lệnh của bạn.

0

Đối Symfony 3.3 vì các dịch vụ autowire khi bạn muốn đăng nhập trên các tập tin riêng biệt theo phương pháp này:

Ví dụ chúng ta hãy giả sử chúng ta cần phải đăng nhập vào 2 file xoay:

  • exception.log: Đối với ngoại lệ gây ra trong ứng dụng.
  • dataFetch.log: Đối với các cuộc gọi đến tha, hãy truy lục dữ liệu ứng dụng.

Các trên services.yml đặt:

monolog: 
    channels: ['dataFetch', 'exception'] 

    handlers: 

    dataFetch: 
    type: 'rotating_file' 
    level: info 
    type: stream 
    path: 'dataFetch.log' 
    max_files: 7 
    channels: dataFetch 

    exception: 
     type: 'rotating_file' 
     level: error 
     type: stream 
     path: 'exception.log' 
     max_files: 7 
     channels: exception 

Bây giờ cho các loger ngoại lệ bạn có thể tiêm quảng cáo phụ thuộc các monolog.logger.exception trong khi đối với các dataFetch bạn có thể sự phụ thuộc tiêm monolog.logger.dataFetch.

Các vấn đề liên quan