Допустим, есть простой сайт по типу mvc. 
1  Как добавить в определённое место логирование?
2 Где наиболее правильно размещать операции записи в лог? 
3 И что лучше- записывать логи в файл типа CSV или в базу данных?
loggerInterface.php 
spoiler<?php
// определяем интерфейс
namespace Psr\Log;
// реализуемые методы для того класса (mylog к прим., который даный интреф.будет реализ.
interface LoggerInterface
{
	//$messege = 'User {name} not found;
    public function emergency($message, array $context = []); // массив параметров кот.могут подставляться к примеру п.9 в ['name'='Вася'] подставляется. далее в п.9 {name} должно заменяться на конкр.знач.
    public function alert($message, array $context = []); // по умолч.пустой массив
    public function critical($message, array $context = []);
    public function error($message, array $context = []);
    public function warning($message, array $context = []);
    public function notice($message, array $context = []);
    public function info($message, array $context = []);
    public function debug($message, array $context = []);
    public function log($level, $message, array $context = []);
}
?>
 
loggerAwareInterface.php 
spoiler<?php
namespace Psr\Log;
//класс установщик того или иного класса реализ. LoggerInterface 
interface LoggerAwareInterface
{
    public function setLogger(LoggerInterface $logger);
}
?>
 
logLevel.php  
spoiler<?php
namespace Psr\Log;
//перечисляем все константы
class LogLevel
{
    const EMERGENCY = 'emergency';
    const ALERT = 'alert';
    const CRITICAL = 'critical';
    const ERROR = 'error';
    const WARNING = 'warning';
    const NOTICE = 'notice';
    const INFO = 'info';
    const DEBUG = 'debug';
}
?>
 
Далее - теоретический класс Mylog.php  в котором loggerInterface  должен реализовываться:
spoiler<?php
use Psr\Log\LoggerInterface;
class Mylog
{
    private $logger;
    public function __construct(LoggerInterface $logger = null)
    {
        $this->logger = $logger;
    }
    public function doSomething()
    {
        if ($this->logger) {
            $this->logger->info('Doing work');
        }
        // делает что-нибудь
    }
}
?>
 
И к примеру, есть в проекте maincontroller_class.php В его классе нужно подключить логирование. Каким образом это делается?
spoiler<?php
<?php
class MainController extends AbstractController {
// 3 сво-ва:
    protected $title;
    protected $meta_desc;
    protected $meta_keywords;
    // объявляем констр.
    public function __construct() {
        parent::__construct(new View(DIR_TMPL)); // вызываем род.констр. и перед.новый объект View c константой DIR_TMPL
        // в конст.сод.путь к дир. template
    }
    public function action404() {
        parent::action404(); // берём род.реализ.чтобы все заголовки были отпр.
        $this->title = 'Страница не найдена - 404';
        $this->meta_desc = 'Запрошенная страница не существует.';
        $this->meta_keywords = 'страница не найдена, страница не существует, 404';
        // получ.сод.из tmplfile
        // файлик созд.отдельно
        $content = $this->view->render('404', [], true); // обращаемся к св-ву protected view из п.6 род.класса
        $this->render($content); // и вызываем у него метод рендер (п.11 view_class.php)
    }
    public function actionIndex() {
        $this->title = 'Главная страница';
        $this->meta_desc = 'Описание главной страницы';
        $this->meta_keywords = 'описание, главная страниц';
        // обращение к тому файлу кот.отвечает за вывод гл.стр:
        $content = $this->view->render('index', [], true); // вызываем сод.стр. из tmpl file 'index.tmpl'
        $this->render($content);
    }
    public function actionPage() {
        $this->title = 'Внутренняя страница';
        $this->meta_desc = 'Описание внутренней страницы';
        $this->meta_keywords = 'описание, внутренняя страниц';
        $email = 'abc@mail.ru'; // Допустим, получено из базы с помощью Model
        $content = $this->view->render('page', ['email' => $email], true);
        $this->render($content);
    }
    //
    protected function render($content) {
        $params = [];
        $params['title'] = $this->title;
        $params['meta_desc'] = $this->meta_desc;
        $params['meta_keywords'] = $this->meta_keywords;
        $params['content'] = $content;
        $this->view->render(MAIN_LAYOUT, $params); // передаём константу кот.будет сод.общий вид сайта. в этот шаблоны вводятся парам.
    }
}
?>
?>