The logger can be injected from the ServerContainer:

namespace OCA\MyApp\AppInfo;

use \OCP\AppFramework\App;
use \OCA\MyApp\Service\AuthorService;

class Application extends App {

    public function __construct(array $urlParams=[]){
        parent::__construct('myapp', $urlParams);

        $container = $this->getContainer();

         * Controllers
        $container->registerService('AuthorService', function($c) {
            return new AuthorService(

        $container->registerService('Logger', function($c) {
            return $c->query('ServerContainer')->getLogger();

and then be used in the following way:

namespace OCA\MyApp\Service;

use \OCP\ILogger;

class AuthorService {

    private $logger;
    private $appName;

    public function __construct(ILogger $logger, $appName){
        $this->logger = $logger;
        $this->appName = $appName;

    public function log($message) {
        $this->logger->error($message, ['app' => $this->appName]);


The following methods are available:

  • emergency

  • alert

  • critical

  • error

  • warning

  • notice

  • info

  • debug

Which Logging Level Should You Use?

When considering which logging level to use, please refer to this guide from IG:


Information that is useful during development. Usually very chatty, and will not show in production.


Information you will need to debug production issues.

WARN (warning)

Someone in the team will have to investigate what happened, but it can wait until tomorrow.


Oh-oh, call the fireman! This needs to be investigated now!