나는 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] 삭제
몇 마디 만하겠습니다