LogstashFormatterTest.php 5.7 KB

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