2013-04-12 27 views
7

Tôi muốn đăng nhập vào một tập tin khác với dev.log thông thường hoặc prod.logSymfony 2.1 - Chuyển sang kênh Monolog trong điều khiển

Tôi biết rằng điều này có thể được thực hiện với các kênh truyền hình khác nhau và tôi đã sử dụng nó trong một số dịch vụ nhưng tôi không rõ lắm về việc chuyển đổi kênh Monolog trong bộ điều khiển.

Trong dịch vụ bạn chỉ xác định kênh qua thuộc tính tags trong định nghĩa dịch vụ, nhưng làm cách nào tôi có thể thực hiện điều này trong bộ điều khiển hoặc thậm chí tốt hơn trong một hành động cụ thể?

Tôi biết rằng một giải pháp khả thi sẽ là: Symfony 2 : Log into a specific file

Nhưng có vẻ như quá mức cần thiết để xác định hai dịch vụ mới chỉ để đăng nhập vào một tập tin tùy chỉnh.

Trả lời

23

Cách duy nhất để làm điều này là xác định controller as a service và tiêm trình ghi nhật ký tùy chỉnh của bạn với kênh tùy chỉnh.

Vì kênh được tạo tự động nên hiện không có cách nào khác, nhưng đó là yêu cầu thú vị và bạn không phải là yêu cầu đầu tiên, vì vậy tôi đã tạo issue on MonologBundle để cho phép định nghĩa kênh ở cấp cấu hình gói. Bằng cách đó, bạn có thể tìm nạp trình ghi hợp lệ từ bộ điều khiển bằng cách sử dụng $this->get('monolog.logger.mychannel') (mà bạn có thể làm nếu kênh tồn tại, nhưng không phải nếu bạn muốn kênh tùy chỉnh cho bộ điều khiển không có gì khác sử dụng).

Cập nhật:

Tính đến symfony/monolog-bó 2.4.0 bạn có thể xác định kênh bổ sung như:

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

Sau đó, bạn có thể lấy nó như $this->get('monolog.logger.mychannel')

+1

+1 để tạo sự cố tại github –

+2

@ JohannesKlauß bản phát hành sắp tới của gói mà tôi sẽ đưa ra vào ngày mai bao gồm bản sửa lỗi thích hợp cho btw này. – Seldaek

3

Tôi hiện đang sử dụng symfony/monolog-bundle 2.3.0 và mã sau hoạt động.

Cấu hình trong 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 

trên bộ điều khiển

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

Hy vọng nó giúp.

+3

Điều này đang hoạt động, nó chỉ thiếu 'kênh: ['doctrine']' trước khi xử lý – kunicmarko20

5

Tôi biết rằng đây là một bài đăng cũ hơn, nhưng tôi đã chạy vào một nhu cầu tương tự bằng cách sử dụng symfony/monolog-bundle 2.1.x. Tôi dường như không thể tìm thấy chính xác những gì tôi cần trong các chủ đề khác, vì vậy tôi đang ghi lại giải pháp của mình ở đây, đó là tạo một thùng chứa logger sử dụng một kênh tùy chỉnh.

Trong config.yml

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

Trong bó tôi services.yml

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

Trong src/Acme/MyBundle/Monolog/UserActionsLogger.php

<?php 

namespace Acme\MyBundle\Monolog; 

class UserActionsLogger 
{ 
    public $logger; 

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

Sau đó, bạn có thể tiêm container logger vào một dịch vụ với:

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

Hoặc, bạn có chọn lọc có thể sử dụng container logger như một dịch vụ trong bất kỳ điều khiển:

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

Sau đó, bạn có thể truy cập nhật ký thực tế theo:

$userActionsLogger->logger->info('A thing happened!') 
Các vấn đề liên quan