Skip to content

Commit 624912f

Browse files
authored
Merge pull request #1 from packaged/context
log context items
2 parents 06a6751 + 00878fc commit 624912f

9 files changed

Lines changed: 311 additions & 120 deletions

.circleci/config.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ jobs:
3434
<<: *defaults
3535
docker:
3636
- image: php:7.3-alpine
37-
build-phpRC:
37+
build-php74:
3838
<<: *defaults
3939
docker:
40-
- image: php:rc-alpine
40+
- image: php:7.4-alpine
4141

4242
workflows:
4343
version: 2
@@ -46,4 +46,4 @@ workflows:
4646
- build-php71
4747
- build-php72
4848
- build-php73
49-
- build-phpRC
49+
- build-php74

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
}
1010
],
1111
"require": {
12+
"ext-json": "*",
1213
"php": ">=7.1",
1314
"psr/log": "1.1.*"
1415
},

src/BasicGoogleCloudLogger.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
namespace Packaged\Log;
3+
4+
use Psr\Log\AbstractLogger;
5+
use Psr\Log\LogLevel;
6+
7+
/**
8+
* Logger that outputs the messages using error_log()
9+
*/
10+
class BasicGoogleCloudLogger extends ErrorLogLogger
11+
{
12+
private $_handle;
13+
14+
public function __construct($maxLevel = LogLevel::DEBUG)
15+
{
16+
parent::__construct($maxLevel);
17+
$this->_handle = fopen('php://stderr', 'wb');
18+
}
19+
20+
public function setHandle($handle)
21+
{
22+
$this->_handle = $handle;
23+
}
24+
25+
protected function _writeLog($message)
26+
{
27+
fwrite($this->_handle, $message);
28+
}
29+
30+
protected function _formatLog($level, $message, array $context = null)
31+
{
32+
return json_encode(array_filter([
33+
'timestamp' => (new \DateTime())->format(DATE_RFC3339_EXTENDED),
34+
'severity' => $level,
35+
'textPayload' => $message,
36+
'jsonPayload' => $context,
37+
])) . PHP_EOL;
38+
}
39+
}

src/ErrorLogLogger.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public function __construct($maxLevel = LogLevel::DEBUG)
3333
$this->setMaxLogLevel($maxLevel);
3434
}
3535

36+
protected function _writeLog($message)
37+
{
38+
error_log($message);
39+
}
40+
3641
/**
3742
* @param string $level One of the Psr\Log\LogLevel constants
3843
*/
@@ -41,12 +46,21 @@ public function setMaxLogLevel($level)
4146
$this->_maxLevel = $this->_levelToNum($level);
4247
}
4348

44-
public function log($level, $message, array $context = [])
49+
public function log($level, $message, array $context = null)
4550
{
4651
if($this->_levelToNum($level) <= $this->_maxLevel)
4752
{
48-
error_log($message);
53+
$this->_writeLog($this->_formatLog($level, $message, $context));
54+
}
55+
}
56+
57+
protected function _formatLog($level, $message, array $context = null)
58+
{
59+
if(!empty($context))
60+
{
61+
$message .= ' ' . json_encode($context);
4962
}
63+
return "[$level] $message";
5064
}
5165

5266
private function _levelToNum($level)

src/Log.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,26 @@ public static function debug($message, array $context = [])
7979

8080
public static function exception(Throwable $e)
8181
{
82-
static::error("EXCEPTION (" . $e->getCode() . "): " . $e->getMessage());
82+
static::critical(
83+
$e->getMessage(),
84+
[
85+
'code' => $e->getCode(),
86+
'file' => $e->getFile(),
87+
'line' => $e->getLine(),
88+
]
89+
);
8390
}
8491

8592
public static function exceptionWithTrace(Throwable $e)
8693
{
87-
static::error("EXCEPTION (" . $e->getCode() . "): " . $e->getMessage() . "\n" . $e->getTraceAsString());
94+
static::critical(
95+
$e->getMessage(),
96+
[
97+
'code' => $e->getCode(),
98+
'file' => $e->getFile(),
99+
'line' => $e->getLine(),
100+
'stack_trace' => $e->getTraceAsString(),
101+
]
102+
);
88103
}
89104
}

tests/AbstractLoggerTestCase.php

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
namespace Packaged\Log\Tests;
3+
4+
use Exception;
5+
use Packaged\Log\BasicGoogleCloudLogger;
6+
use Packaged\Log\ErrorLogLogger;
7+
use Packaged\Log\Log;
8+
use PHPUnit\Framework\TestCase;
9+
use Psr\Log\LogLevel;
10+
11+
class BasicGoogleCloudLoggerTest extends TestCase
12+
{
13+
private $_tempFile;
14+
private $_handler;
15+
16+
public function setUp()
17+
{
18+
$this->_tempFile = tempnam(sys_get_temp_dir(), 'packaged-log-');
19+
$this->_handler = fopen($this->_tempFile, 'wb');
20+
}
21+
22+
public function tearDown()
23+
{
24+
fclose($this->_handler);
25+
unlink($this->_tempFile);
26+
}
27+
28+
protected function _getLogContents()
29+
{
30+
return file_get_contents($this->_tempFile);
31+
}
32+
33+
public function assertLastLog($test)
34+
{
35+
self::assertStringEndsWith($test . PHP_EOL, $this->_getLogContents());
36+
}
37+
38+
private function _getTestLogger($maxLevel = LogLevel::DEBUG)
39+
{
40+
$l = new BasicGoogleCloudLogger($maxLevel);
41+
$l->setHandle($this->_handler);
42+
return $l;
43+
}
44+
45+
public function testLogger()
46+
{
47+
Log::bind($this->_getTestLogger());
48+
49+
Log::debug('debug: test');
50+
self::assertLastLog('","severity":"debug","textPayload":"debug: test"}');
51+
52+
Log::info('info: test');
53+
self::assertLastLog('","severity":"info","textPayload":"info: test"}');
54+
55+
Log::notice('notice: test');
56+
self::assertLastLog('","severity":"notice","textPayload":"notice: test"}');
57+
58+
Log::warning('warning: test');
59+
self::assertLastLog('","severity":"warning","textPayload":"warning: test"}');
60+
61+
Log::error('error: test');
62+
self::assertLastLog('","severity":"error","textPayload":"error: test"}');
63+
64+
Log::critical('critical: test');
65+
self::assertLastLog('","severity":"critical","textPayload":"critical: test"}');
66+
67+
Log::alert('alert: test');
68+
self::assertLastLog('","severity":"alert","textPayload":"alert: test"}');
69+
70+
Log::emergency('emergency: test');
71+
self::assertLastLog('","severity":"emergency","textPayload":"emergency: test"}');
72+
}
73+
74+
public function testLevelLog()
75+
{
76+
Log::bind($this->_getTestLogger(LogLevel::INFO));
77+
78+
Log::info('info: test');
79+
self::assertLastLog('","severity":"info","textPayload":"info: test"}');
80+
81+
Log::debug('debug: test');
82+
self::assertLastLog('","severity":"info","textPayload":"info: test"}');
83+
}
84+
85+
public function testExceptionLog()
86+
{
87+
Log::bind($this->_getTestLogger());
88+
89+
$e = new Exception('exception message', 123);
90+
Log::exception($e);
91+
self::assertContains(',"textPayload":"exception message"', $this->_getLogContents());
92+
self::assertContains(',"severity":"critical"', $this->_getLogContents());
93+
self::assertNotContains('"stace_trace":', $this->_getLogContents());
94+
}
95+
96+
public function testExceptionTraceLog()
97+
{
98+
Log::bind($this->_getTestLogger());
99+
100+
$e = new Exception('exception message', 123);
101+
Log::exceptionWithTrace($e);
102+
self::assertContains('"textPayload":"exception message"', $this->_getLogContents());
103+
self::assertContains('"severity":"critical"', $this->_getLogContents());
104+
self::assertContains('"code":123', $this->_getLogContents());
105+
self::assertContains('"line":100', $this->_getLogContents());
106+
self::assertContains('BasicGoogleCloudLoggerTest.php', $this->_getLogContents());
107+
self::assertContains('"stack_trace"', $this->_getLogContents());
108+
}
109+
110+
public function testContextLog()
111+
{
112+
Log::bind($this->_getTestLogger());
113+
Log::debug('debug: test', ['test1' => 'value1', 'test2' => 'value2']);
114+
self::assertLastLog(
115+
'","severity":"debug","textPayload":"debug: test","jsonPayload":{"test1":"value1","test2":"value2"}}'
116+
);
117+
}
118+
}

0 commit comments

Comments
 (0)