Monolog 로그를 파일 및 원격 데이터베이스에 쓰는 방법

GotBatteries

나는 Symfony2-프로젝트를 가지고 있으며 로그를 다른 파일에 아름답게 기록하지만 원격 데이터베이스 (mongodb)에도 로그를 기록하고 싶습니다. 데이터베이스 연결에 문제가 발생할 경우를 대비하여 실제 로그 파일을 서버에 백업으로 보관하고 싶습니다.

질문 1 : 동일한 로그를 두 개의 다른 위치에 동시에 저장할 수도 있습니까?

질문 2 : 로그를 mongodb에 어떻게 저장합니까? 특정 mongodb 지침이 반드시 필요하지는 않지만 monologger를 사용하여 원격 DB에 쓰는 방법에 대한 몇 가지 지침이 필요합니다. 가능한 경우 mongodb 관련 지침도 환영합니다. ;)

질문 3 (선택 사항) : 어떻게 든 로그에 전체 오류 스택을 가져올 수 있습니까? Monolog가 실제로 쓸 수있는 데이터와 작성 방법의 전체 목록은 어디에서 찾을 수 있습니까?

사이먼 폴

모노로그와 교리로 mysql 데이터베이스에 로그인하기 위해 언젠가는 아주 좋은 Blogpost가있었습니다. 더 이상 찾을 수 없으므로 여기에 필요한 파일을 추가하고 조정할 수 있습니다. 전체 로직은 DatabaseHandler에서 수행되므로 mysql 삽입에서 mongodb 처리로 변경할 수 있습니다. 누군가가 원래 게시물을 알고 있다면이 코드는 내 것이 아닙니다.

BacktraceLoggerListener.php

namespace UtilsBundle\EventListener;

use Symfony\Component\HttpKernel\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class BacktraceLoggerListener{
private $_logger;

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

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $this->_logger->addError($event->getException());
}
}

DatabaseHandler.php

namespace UtilsBundle\Logger;



use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;

/**
 * Stores to database
 *
 */
class DatabaseHandler extends AbstractProcessingHandler{
protected $_container;

/**
 * @param string $stream
 * @param integer $level The minimum logging level at which this handler will be triggered
 * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
 */
public function __construct($level = Logger::DEBUG, $bubble = true)
{
    parent::__construct($level, $bubble);
}

/**
 *
 * @param type $container
 */
public function setContainer($container)
{
    $this->_container = $container;
}

/**
 * {@inheritdoc}
 */
protected function write(array $record)
{

    // Ensure the doctrine channel is ignored (unless its greater than a warning error), otherwise you will create an infinite loop, as doctrine like to log.. a lot..
    if( 'doctrine' == $record['channel'] ) {

        if( (int)$record['level'] >= Logger::WARNING ) {
            error_log($record['message']);
        }

        return;
    }
    // Only log errors greater than a warning
    // TODO - you could ideally add this into configuration variable
    if( (int)$record['level'] >= Logger::NOTICE ) {

        try
        {
            // Logs are inserted as separate SQL statements, separate to the current transactions that may exist within the entity manager.
            $em = $this->_container->get('doctrine')->getManager();
            $conn = $em->getConnection();

            $created = date('Y-m-d H:i:s');

            $serverData = ""; //$record['extra']['server_data'];
            $referer = "";
            if (isset($_SERVER['HTTP_REFERER'])){
                $referer= $_SERVER['HTTP_REFERER'];
            }

            $stmt = $em->getConnection()->prepare('INSERT INTO system_log(log, level, server_data, modified, created)
                                    VALUES(' . $conn->quote($record['message']) . ', \'' . $record['level'] . '\', ' . $conn->quote($referer) . ', \'' . $created . '\', \'' . $created . '\');');
            $stmt->execute();

        } catch( \Exception $e ) {

            // Fallback to just writing to php error logs if something really bad happens
            error_log($record['message']);
            error_log($e->getMessage());
        }
    }
}
}

여기서는 xml을 사용했지만 services.yml에서도 가능합니다.

services.xml

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services     http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
    <service id="utils.database.logger" class="UtilsBundle\Logger\DatabaseHandler">
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>

    <service id="utils.backtrace.logger.listener" class="UtilsBundle\EventListener\BacktraceLoggerListener">
        <argument type="service" id="logger" />
        <tag name="monolog.logger" channel="backtrace" />
        <tag name="kernel.event_listener"  event="kernel.exception" method="onKernelException" />
    </service>
</services>

마지막으로 config _ **. yml의 모노로그 구성에 핸들러를 추가합니다.

config_prod.yml

monolog:
handlers:
    main:
        type:         rotating_file
        action_level: error
        max_files: 10
        handler:      nested
    nested:
        type:  stream
        path:  "%kernel.logs_dir%/%kernel.environment%.log"
        level: debug
    console:
        type:  console
    database:
        type: service
        level: notice
        id: utils.database.logger
        channels: ["!translation"]

도움이되는 희망

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

원격 호스트에서 Entity Framework 및 SQL Server로 데이터베이스를 업데이트하는 방법

분류에서Dev

데이터 및 파일, 이미지를 Laravel의 데이터베이스 및 폴더에 삽입하는 방법

분류에서Dev

테이블에 파일 및 파일 경로를 쓰는 방법

분류에서Dev

원격 개발자간에 동일한 데이터베이스 구조를 유지하는 방법

분류에서Dev

C #에서 원격 couchbase 데이터베이스로 데이터베이스 연결을 만드는 방법

분류에서Dev

Net :: OpenSSH를 사용하여 원격 파일에 안전하게 쓰는 방법

분류에서Dev

Visual Studio 2010 내에서 Linux에서 원격으로 컴파일 및 디버그하는 방법

분류에서Dev

C 프로그램 및 Ubuntu OS에서 원격 장치의 파일을 읽는 방법은 무엇입니까?

분류에서Dev

ReactiveExtensions Range 및 WithAsync를 사용하여 N 페이지마다 데이터베이스에 일괄 쓰기 방법

분류에서Dev

Postgres 12에서 생성 된 SQL 파일을 Postgres 9.6 데이터베이스로 복원하는 방법

분류에서Dev

원격 Oracle 데이터베이스에서 데이터를 가져 오는 방법 Ruby on Rails

분류에서Dev

최대 절전 모드에서 원격 측 데이터베이스의 데이터를 가져 오는 방법

분류에서Dev

로컬 GUI 도구를 사용하여 원격 Postgres 데이터베이스에 액세스하는 방법

분류에서Dev

원격 데이터베이스에 연결하는 방법

분류에서Dev

gradle-원격으로 파일에 액세스하는 방법

분류에서Dev

CSV 파일에 열 단위로 데이터를 쓰는 방법

분류에서Dev

파일 읽기 및 데이터베이스 쓰기 진행률 표시 방법

분류에서Dev

Android 응용 프로그램에서 mysql 데이터베이스에 doc 및 pdf 파일을 저장하는 방법은 무엇입니까?

분류에서Dev

원격 로그 파일에서 html로 텍스트를 스트리밍하는 방법-Ruby on Rails

분류에서Dev

주기적으로 Python 파일에서 Django 데이터베이스에 데이터를 삽입하는 방법

분류에서Dev

channel.connect ()를 사용하여 원격 데이터베이스에 "삽입"쿼리를 실행하는 방법;

분류에서Dev

ASP.NET Core 및 Entity Framework Core와의 통합 테스트-테스트 당 데이터베이스에서 테스트 데이터를 복원하는 방법?

분류에서Dev

Yii : 데이터베이스에 원격으로 연결하는 방법은 무엇입니까?

분류에서Dev

WordPress 데이터베이스에 원격으로 연결하는 방법은 무엇입니까?

분류에서Dev

WordPress 데이터베이스에 원격으로 연결하는 방법은 무엇입니까?

분류에서Dev

winForms 및 데이터베이스 SQL 서버로 .EXE 파일을 만드는 방법

분류에서Dev

devexpress xtra 보고서를 데이터베이스 또는 파일에 저장하고 데이터베이스 또는 파일에서로드하는 방법

분류에서Dev

정보를 저장하는 방법? 데이터베이스 vs 데이터 구조 vs 로그 파일

분류에서Dev

txt 파일에서 mysql 데이터베이스로 데이터를 가져 오는 방법

Related 관련 기사

  1. 1

    원격 호스트에서 Entity Framework 및 SQL Server로 데이터베이스를 업데이트하는 방법

  2. 2

    데이터 및 파일, 이미지를 Laravel의 데이터베이스 및 폴더에 삽입하는 방법

  3. 3

    테이블에 파일 및 파일 경로를 쓰는 방법

  4. 4

    원격 개발자간에 동일한 데이터베이스 구조를 유지하는 방법

  5. 5

    C #에서 원격 couchbase 데이터베이스로 데이터베이스 연결을 만드는 방법

  6. 6

    Net :: OpenSSH를 사용하여 원격 파일에 안전하게 쓰는 방법

  7. 7

    Visual Studio 2010 내에서 Linux에서 원격으로 컴파일 및 디버그하는 방법

  8. 8

    C 프로그램 및 Ubuntu OS에서 원격 장치의 파일을 읽는 방법은 무엇입니까?

  9. 9

    ReactiveExtensions Range 및 WithAsync를 사용하여 N 페이지마다 데이터베이스에 일괄 쓰기 방법

  10. 10

    Postgres 12에서 생성 된 SQL 파일을 Postgres 9.6 데이터베이스로 복원하는 방법

  11. 11

    원격 Oracle 데이터베이스에서 데이터를 가져 오는 방법 Ruby on Rails

  12. 12

    최대 절전 모드에서 원격 측 데이터베이스의 데이터를 가져 오는 방법

  13. 13

    로컬 GUI 도구를 사용하여 원격 Postgres 데이터베이스에 액세스하는 방법

  14. 14

    원격 데이터베이스에 연결하는 방법

  15. 15

    gradle-원격으로 파일에 액세스하는 방법

  16. 16

    CSV 파일에 열 단위로 데이터를 쓰는 방법

  17. 17

    파일 읽기 및 데이터베이스 쓰기 진행률 표시 방법

  18. 18

    Android 응용 프로그램에서 mysql 데이터베이스에 doc 및 pdf 파일을 저장하는 방법은 무엇입니까?

  19. 19

    원격 로그 파일에서 html로 텍스트를 스트리밍하는 방법-Ruby on Rails

  20. 20

    주기적으로 Python 파일에서 Django 데이터베이스에 데이터를 삽입하는 방법

  21. 21

    channel.connect ()를 사용하여 원격 데이터베이스에 "삽입"쿼리를 실행하는 방법;

  22. 22

    ASP.NET Core 및 Entity Framework Core와의 통합 테스트-테스트 당 데이터베이스에서 테스트 데이터를 복원하는 방법?

  23. 23

    Yii : 데이터베이스에 원격으로 연결하는 방법은 무엇입니까?

  24. 24

    WordPress 데이터베이스에 원격으로 연결하는 방법은 무엇입니까?

  25. 25

    WordPress 데이터베이스에 원격으로 연결하는 방법은 무엇입니까?

  26. 26

    winForms 및 데이터베이스 SQL 서버로 .EXE 파일을 만드는 방법

  27. 27

    devexpress xtra 보고서를 데이터베이스 또는 파일에 저장하고 데이터베이스 또는 파일에서로드하는 방법

  28. 28

    정보를 저장하는 방법? 데이터베이스 vs 데이터 구조 vs 로그 파일

  29. 29

    txt 파일에서 mysql 데이터베이스로 데이터를 가져 오는 방법

뜨겁다태그

보관