LogstashFormatterTest.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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\Level;
  12. use Monolog\LevelName;
  13. use Monolog\Test\TestCase;
  14. class LogstashFormatterTest extends TestCase
  15. {
  16. /**
  17. * @covers Monolog\Formatter\LogstashFormatter::format
  18. */
  19. public function testDefaultFormatterV1()
  20. {
  21. $formatter = new LogstashFormatter('test', 'hostname');
  22. $record = $this->getRecord(
  23. Level::Error,
  24. 'log',
  25. channel: 'meh',
  26. datetime: new \DateTimeImmutable("@0"),
  27. );
  28. $message = json_decode($formatter->format($record), true);
  29. $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
  30. $this->assertEquals("1", $message['@version']);
  31. $this->assertEquals('log', $message['message']);
  32. $this->assertEquals('meh', $message['channel']);
  33. $this->assertEquals(LevelName::Error->value, $message['level']);
  34. $this->assertEquals(Level::Error->value, $message['monolog_level']);
  35. $this->assertEquals('test', $message['type']);
  36. $this->assertEquals('hostname', $message['host']);
  37. $formatter = new LogstashFormatter('mysystem');
  38. $message = json_decode($formatter->format($record), true);
  39. $this->assertEquals('mysystem', $message['type']);
  40. }
  41. /**
  42. * @covers Monolog\Formatter\LogstashFormatter::format
  43. */
  44. public function testFormatWithFileAndLineV1()
  45. {
  46. $formatter = new LogstashFormatter('test');
  47. $record = $this->getRecord(
  48. Level::Error,
  49. 'log',
  50. channel: 'meh',
  51. context: ['from' => 'logger'],
  52. datetime: new \DateTimeImmutable("@0"),
  53. extra: ['file' => 'test', 'line' => 14],
  54. );
  55. $message = json_decode($formatter->format($record), true);
  56. $this->assertEquals('test', $message['extra']['file']);
  57. $this->assertEquals(14, $message['extra']['line']);
  58. }
  59. /**
  60. * @covers Monolog\Formatter\LogstashFormatter::format
  61. */
  62. public function testFormatWithContextV1()
  63. {
  64. $formatter = new LogstashFormatter('test');
  65. $record = $this->getRecord(
  66. Level::Error,
  67. 'log',
  68. channel: 'meh',
  69. context: ['from' => 'logger'],
  70. datetime: new \DateTimeImmutable("@0"),
  71. extra: ['key' => 'pair'],
  72. );
  73. $message = json_decode($formatter->format($record), true);
  74. $this->assertArrayHasKey('context', $message);
  75. $this->assertArrayHasKey('from', $message['context']);
  76. $this->assertEquals('logger', $message['context']['from']);
  77. // Test with extraPrefix
  78. $formatter = new LogstashFormatter('test', null, 'extra', 'CTX');
  79. $message = json_decode($formatter->format($record), true);
  80. $this->assertArrayHasKey('CTX', $message);
  81. $this->assertArrayHasKey('from', $message['CTX']);
  82. $this->assertEquals('logger', $message['CTX']['from']);
  83. }
  84. /**
  85. * @covers Monolog\Formatter\LogstashFormatter::format
  86. */
  87. public function testFormatWithExtraV1()
  88. {
  89. $formatter = new LogstashFormatter('test');
  90. $record = $this->getRecord(
  91. Level::Error,
  92. 'log',
  93. channel: 'meh',
  94. context: ['from' => 'logger'],
  95. datetime: new \DateTimeImmutable("@0"),
  96. extra: ['key' => 'pair'],
  97. );
  98. $message = json_decode($formatter->format($record), true);
  99. $this->assertArrayHasKey('extra', $message);
  100. $this->assertArrayHasKey('key', $message['extra']);
  101. $this->assertEquals('pair', $message['extra']['key']);
  102. // Test with extraPrefix
  103. $formatter = new LogstashFormatter('test', null, 'EXTRA');
  104. $message = json_decode($formatter->format($record), true);
  105. $this->assertArrayHasKey('EXTRA', $message);
  106. $this->assertArrayHasKey('key', $message['EXTRA']);
  107. $this->assertEquals('pair', $message['EXTRA']['key']);
  108. }
  109. public function testFormatWithApplicationNameV1()
  110. {
  111. $formatter = new LogstashFormatter('app', 'test');
  112. $record = $this->getRecord(
  113. Level::Error,
  114. 'log',
  115. channel: 'meh',
  116. context: ['from' => 'logger'],
  117. datetime: new \DateTimeImmutable("@0"),
  118. extra: ['key' => 'pair'],
  119. );
  120. $message = json_decode($formatter->format($record), true);
  121. $this->assertArrayHasKey('type', $message);
  122. $this->assertEquals('app', $message['type']);
  123. }
  124. public function testFormatWithLatin9Data()
  125. {
  126. $formatter = new LogstashFormatter('test', 'hostname');
  127. $record = $this->getRecord(
  128. Level::Error,
  129. 'log',
  130. channel: '¯\_(ツ)_/¯',
  131. datetime: new \DateTimeImmutable("@0"),
  132. extra: [
  133. 'user_agent' => "\xD6WN; FBCR/OrangeEspa\xF1a; Vers\xE3o/4.0; F\xE4rist",
  134. ],
  135. );
  136. $message = json_decode($formatter->format($record), true);
  137. $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']);
  138. $this->assertEquals('log', $message['message']);
  139. $this->assertEquals('¯\_(ツ)_/¯', $message['channel']);
  140. $this->assertEquals('ERROR', $message['level']);
  141. $this->assertEquals('test', $message['type']);
  142. $this->assertEquals('hostname', $message['host']);
  143. $this->assertEquals('�WN; FBCR/OrangeEspa�a; Vers�o/4.0; F�rist', $message['extra']['user_agent']);
  144. }
  145. }