LogstashFormatterTest.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php declare(strict_types=1);
  2. /*
  3. * This file is part of the Monolog package.
  4. *
  5. * (c) Jordi Boggiano <j.boggiano@seld.be>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Monolog\Formatter;
  11. use Monolog\Logger;
  12. use PHPUnit\Framework\TestCase;
  13. class LogstashFormatterTest extends TestCase
  14. {
  15. /**
  16. * @covers Monolog\Formatter\LogstashFormatter::format
  17. */
  18. public function testDefaultFormatterV1()
  19. {
  20. $formatter = new LogstashFormatter('test', 'hostname');
  21. $record = [
  22. 'level' => Logger::ERROR,
  23. 'level_name' => 'ERROR',
  24. 'channel' => 'meh',
  25. 'context' => [],
  26. 'datetime' => new \DateTimeImmutable("@0"),
  27. 'extra' => [],
  28. 'message' => 'log',
  29. ];
  30. $message = json_decode($formatter->format($record), true);
  31. $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
  32. $this->assertEquals("1", $message['@version']);
  33. $this->assertEquals('log', $message['message']);
  34. $this->assertEquals('meh', $message['channel']);
  35. $this->assertEquals('ERROR', $message['level']);
  36. $this->assertEquals(Logger::ERROR, $message['monolog_level']);
  37. $this->assertEquals('test', $message['type']);
  38. $this->assertEquals('hostname', $message['host']);
  39. $formatter = new LogstashFormatter('mysystem');
  40. $message = json_decode($formatter->format($record), true);
  41. $this->assertEquals('mysystem', $message['type']);
  42. }
  43. /**
  44. * @covers Monolog\Formatter\LogstashFormatter::format
  45. */
  46. public function testFormatWithFileAndLineV1()
  47. {
  48. $formatter = new LogstashFormatter('test');
  49. $record = [
  50. 'level' => Logger::ERROR,
  51. 'level_name' => 'ERROR',
  52. 'channel' => 'meh',
  53. 'context' => ['from' => 'logger'],
  54. 'datetime' => new \DateTimeImmutable("@0"),
  55. 'extra' => ['file' => 'test', 'line' => 14],
  56. 'message' => 'log',
  57. ];
  58. $message = json_decode($formatter->format($record), true);
  59. $this->assertEquals('test', $message['extra']['file']);
  60. $this->assertEquals(14, $message['extra']['line']);
  61. }
  62. /**
  63. * @covers Monolog\Formatter\LogstashFormatter::format
  64. */
  65. public function testFormatWithContextV1()
  66. {
  67. $formatter = new LogstashFormatter('test');
  68. $record = [
  69. 'level' => Logger::ERROR,
  70. 'level_name' => 'ERROR',
  71. 'channel' => 'meh',
  72. 'context' => ['from' => 'logger'],
  73. 'datetime' => new \DateTimeImmutable("@0"),
  74. 'extra' => ['key' => 'pair'],
  75. 'message' => 'log',
  76. ];
  77. $message = json_decode($formatter->format($record), true);
  78. $this->assertArrayHasKey('context', $message);
  79. $this->assertArrayHasKey('from', $message['context']);
  80. $this->assertEquals('logger', $message['context']['from']);
  81. // Test with extraPrefix
  82. $formatter = new LogstashFormatter('test', null, 'extra', 'CTX');
  83. $message = json_decode($formatter->format($record), true);
  84. $this->assertArrayHasKey('CTX', $message);
  85. $this->assertArrayHasKey('from', $message['CTX']);
  86. $this->assertEquals('logger', $message['CTX']['from']);
  87. }
  88. /**
  89. * @covers Monolog\Formatter\LogstashFormatter::format
  90. */
  91. public function testFormatWithExtraV1()
  92. {
  93. $formatter = new LogstashFormatter('test');
  94. $record = [
  95. 'level' => Logger::ERROR,
  96. 'level_name' => 'ERROR',
  97. 'channel' => 'meh',
  98. 'context' => ['from' => 'logger'],
  99. 'datetime' => new \DateTimeImmutable("@0"),
  100. 'extra' => ['key' => 'pair'],
  101. 'message' => 'log',
  102. ];
  103. $message = json_decode($formatter->format($record), true);
  104. $this->assertArrayHasKey('extra', $message);
  105. $this->assertArrayHasKey('key', $message['extra']);
  106. $this->assertEquals('pair', $message['extra']['key']);
  107. // Test with extraPrefix
  108. $formatter = new LogstashFormatter('test', null, 'EXTRA');
  109. $message = json_decode($formatter->format($record), true);
  110. $this->assertArrayHasKey('EXTRA', $message);
  111. $this->assertArrayHasKey('key', $message['EXTRA']);
  112. $this->assertEquals('pair', $message['EXTRA']['key']);
  113. }
  114. public function testFormatWithApplicationNameV1()
  115. {
  116. $formatter = new LogstashFormatter('app', 'test');
  117. $record = [
  118. 'level' => Logger::ERROR,
  119. 'level_name' => 'ERROR',
  120. 'channel' => 'meh',
  121. 'context' => ['from' => 'logger'],
  122. 'datetime' => new \DateTimeImmutable("@0"),
  123. 'extra' => ['key' => 'pair'],
  124. 'message' => 'log',
  125. ];
  126. $message = json_decode($formatter->format($record), true);
  127. $this->assertArrayHasKey('type', $message);
  128. $this->assertEquals('app', $message['type']);
  129. }
  130. public function testFormatWithLatin9Data()
  131. {
  132. $formatter = new LogstashFormatter('test', 'hostname');
  133. $record = [
  134. 'level' => Logger::ERROR,
  135. 'level_name' => 'ERROR',
  136. 'channel' => '¯\_(ツ)_/¯',
  137. 'context' => [],
  138. 'datetime' => new \DateTimeImmutable("@0"),
  139. 'extra' => [
  140. 'user_agent' => "\xD6WN; FBCR/OrangeEspa\xF1a; Vers\xE3o/4.0; F\xE4rist",
  141. ],
  142. 'message' => 'log',
  143. ];
  144. $message = json_decode($formatter->format($record), true);
  145. $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
  146. $this->assertEquals('log', $message['message']);
  147. $this->assertEquals('¯\_(ツ)_/¯', $message['channel']);
  148. $this->assertEquals('ERROR', $message['level']);
  149. $this->assertEquals('test', $message['type']);
  150. $this->assertEquals('hostname', $message['host']);
  151. $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['extra']['user_agent']);
  152. }
  153. }