Skip to content

Commit

Permalink
FileLogger: Add option to log errors only (#351)
Browse files Browse the repository at this point in the history
  • Loading branch information
enricodias authored Feb 9, 2020
1 parent 2f857c2 commit f766292
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 24 deletions.
1 change: 1 addition & 0 deletions examples/using-logger.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
// enable query logging to this file
'profiler' => [
'file' => 'log/log.sql',
'errorsOnly' => false,
],
]);

Expand Down
4 changes: 3 additions & 1 deletion src/Dibi/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class Connection implements IConnection
* - profiler (array)
* - run (bool) => enable profiler?
* - file => file to log
* - errorsOnly (bool) => log only errors
* - substitutes (array) => map of driver specific substitutes (under development)
* - onConnect (array) => list of SQL queries to execute (by Connection::query()) after connection is established
* @throws Exception
Expand All @@ -70,7 +71,8 @@ public function __construct(array $config, string $name = null)
// profiler
if (isset($config['profiler']['file']) && (!isset($config['profiler']['run']) || $config['profiler']['run'])) {
$filter = $config['profiler']['filter'] ?? Event::QUERY;
$this->onEvent[] = [new Loggers\FileLogger($config['profiler']['file'], $filter), 'logEvent'];
$errorsOnly = $config['profiler']['errorsOnly'] ?? false;
$this->onEvent[] = [new Loggers\FileLogger($config['profiler']['file'], $filter, $errorsOnly), 'logEvent'];
}

$this->substitutes = new HashMap(function (string $expr) { return ":$expr:"; });
Expand Down
53 changes: 30 additions & 23 deletions src/Dibi/Loggers/FileLogger.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ class FileLogger
/** @var int */
public $filter;

/** @var bool */
private $errorsOnly;

public function __construct(string $file, int $filter = null)
public function __construct(string $file, int $filter = null, bool $errorsOnly)
{
$this->file = $file;
$this->filter = $filter ?: Dibi\Event::QUERY;
$this->errorsOnly = $errorsOnly ?? false;
}


Expand All @@ -42,35 +45,39 @@ public function logEvent(Dibi\Event $event): void
return;
}

$handle = fopen($this->file, 'a');
if (!$handle) {
return; // or throw exception?
if ($this->errorsOnly === true && ($event->result instanceof \Exception) === false) {
return;
}
flock($handle, LOCK_EX);

if ($event->result instanceof \Exception) {
$message = $event->result->getMessage();
if ($code = $event->result->getCode()) {
$message = "[$code] $message";
}
fwrite($handle,
"ERROR: $message"
. "\n-- SQL: " . $event->sql
. "\n-- driver: " . $event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name')
. ";\n-- " . date('Y-m-d H:i:s')
. "\n\n"
);
} else {
fwrite($handle,
'OK: ' . $event->sql
. ($event->count ? ";\n-- rows: " . $event->count : '')
. "\n-- takes: " . sprintf('%0.3f ms', $event->time * 1000)
. "\n-- source: " . implode(':', $event->source)
. "\n-- driver: " . $event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name')
. "\n-- " . date('Y-m-d H:i:s')
. "\n\n"
);
$message = "ERROR: $message"
. "\n-- SQL: " . $event->sql;

$this->writeToFile($event, $message);
return;

}
fclose($handle);

$message = 'OK: ' . $event->sql
. ($event->count ? ";\n-- rows: " . $event->count : '')
. "\n-- takes: " . sprintf('%0.3f ms', $event->time * 1000)
. "\n-- source: " . implode(':', $event->source);

$this->writeToFile($event, $message);
}

private function writeToFile(Dibi\Event $event, $message): void
{
if (is_writable(dirname($this->file)) === false) return;

$message .= "\n-- driver: " . $event->connection->getConfig('driver') . '/' . $event->connection->getConfig('name')
. "\n-- " . date('Y-m-d H:i:s')
. "\n\n";

file_put_contents($this->file, $message, FILE_APPEND | LOCK_EX);
}
}

0 comments on commit f766292

Please sign in to comment.