2011-11-17 27 views
53

Thông thường bạn chỉ nhận được logger dịch vụ, và các bản ghi đi:Cách ghi nhật ký từ một dịch vụ vào một tệp riêng biệt?

%kernel.root_dir%/%kernel.environment%.log 

Tôi muốn đăng thông điệp hình dịch vụ SOAP CHỈ tới:

%kernel.root_dir%/%kernel.environment%.soap.log 

không logfile chính.

Tôi đã đọc sách dạy nấu ăn, nhưng tôi không hiểu cách cấu hình monolog.

Bất kỳ trợ giúp, manh mối nào?

+0

Tôi rất thích câu trả lời. Tôi đã hỏi một câu hỏi tương tự vài tuần trước đây: http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven

Trả lời

74

MonologBundle ghi lại mọi thứ bằng cách sử dụng cùng một trình xử lý cho toàn bộ khung công tác. Điều đó có nghĩa là nếu một trong các dịch vụ của bạn cần đăng nhập vào các trình xử lý khác nhau, bạn nên tạo Logger/Handler của riêng bạn và đưa vào dịch vụ của bạn.

Đây có thể là một ví dụ cấu hình (trong 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] 

Tôi hy vọng điều này làm rõ nó.

Cập nhật: như của symfony 2.1, bạn cũng có thể cấu hình những kênh nhận mà xử lý, vì vậy bạn cách khác có thể làm một cái gì đó như thế này:

services: 
    soap_service: 
     class: Your\Soap\Client 
     arguments: [@logger] 
     tags: 
      - { name: monolog.logger, channel: soap } 

nào tạo ra một kênh phim truyền hình mới (ví dụ logger dụ nhận tất cả các bộ xử lý), sau đó để cấu hình bộ xử lý khác nhau cho kênh này:

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] 

này có nghĩa là xử lý chính sẽ nhận được tất cả mọi thứ nhưng kênh xà phòng, và xử lý xà phòng sẽ chỉ nhận được cái kênh ap. Bạn cũng có thể xóa khóa channels trên trình xử lý chính nếu bạn muốn tệp nhật ký chính của mình có mọi thứ, nhưng cũng chỉ có bản sao của nhật ký xà phòng. Điều này mang lại rất nhiều tính linh hoạt và khi bạn thấy các kênh là một mảng để bạn có thể liệt kê các kênh bạn muốn hoặc sử dụng ký hiệu danh sách đen !name để loại trừ một số và bao gồm mọi thứ khác.

+0

Giải pháp rất đẹp –

+0

Giải pháp rất tốt! – AlterPHP

+2

Kênh là ass xấu –

27

Tôi gặp vấn đề tương tự và tôi đã chọn sử dụng thư viện Monolog trực tiếp thay vì dịch vụ Monolog.

Sử dụng Monolog Monolog\Handler\StreamHandler để ghi vào tệp. Các github page có một ví dụ đơn giản:

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'); 

Có thể vẫn sử dụng dịch vụ và chỉ cần đẩy một handler mới (và bật nó một khi bạn đang thực hiện - nếu không bạn có thể vô tình viết nhiều hơn bạn muốn đến nhật ký tùy chỉnh của bạn) nhưng tôi chưa thử nghiệm điều này. Trung thực nó có vẻ dễ dàng hơn chỉ để sử dụng thư viện trực tiếp.

+2

Gói không hỗ trợ các cách tạo nhật ký khác nhau dựa trên ở cấp độ ghi nhật ký. Giải pháp của bạn là tốt đẹp, nhưng có lẽ nó là giá trị đăng ký này logger và xử lý của nó bên trong DIC, vì vậy bạn có thể tiêm nó bất cứ nơi nào trong mô hình của bạn. –

+1

Nó thực sự sẽ có thể chỉ cần đẩy xử lý và bật nó sau khi thực hiện các công cụ xà phòng, nhưng trong trường hợp đó cẩn thận, xử lý bạn đẩy nên có '$ bong bóng = false' truyền cho constructor của nó, nếu không các xử lý trước đó vẫn sẽ được gọi. Bạn cũng có thể đẩy một NullHandler đầu tiên để ngăn chặn tất cả mọi thứ, sau đó xử lý của riêng bạn để bắt chỉ các cấp bạn quan tâm. – Seldaek

+7

cuối cùng một cái gì đó lành mạnh, cảm ơn bạn rất nhiều! –

5

Tôi đã giải quyết vấn đề tương tự bằng cách tạo kênh tùy chỉnh trong config.yml như được giải thích trong liên kết này How to Log Messages to different Files.

monolog: 
    channels: ['my_logger'] 

    handlers: 
     my_logger: 
      level: debug 
      type:  stream 
      path:  '%kernel.logs_dir%/my_logger.log' 
      channels: [my_logger] 

Sau này, tôi có thể truy cập vào dịch vụ được tạo động bằng tên monolog.logger.my_logger

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