Skip to content

Commit bf9151a

Browse files
committed
support for unicode character case-sensitivity when searching
1 parent f1d89dc commit bf9151a

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

src/Concerns/LogReader/CanFilterUsingIndex.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ protected function setQuery(?string $query = null): static
9090
$this->only(null);
9191
$this->onlyShowIndex = intval(explode(':', $query)[1]);
9292
} elseif (! empty($query)) {
93-
$query = '~'.$query.'~i';
93+
$query = '~'.$query.'~iu';
9494

9595
Utils::validateRegex($query);
9696

src/Readers/IndexedLogReader.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,15 @@ public function scan(?int $maxBytesToScan = null, bool $force = false): static
9696
$lvl = null;
9797

9898
try {
99+
// first, let's see if it matches the new log entry. Does not take search query into account yet.
99100
$lineMatches = $this->logClass::matches(trim($line), $ts, $lvl);
100101
} catch (SkipLineException $exception) {
101102
continue;
102103
}
103104

104105
if ($lineMatches) {
105106
if ($currentLog !== '') {
107+
// Now, let's see if it matches the search query if set.
106108
if (is_null($this->query) || preg_match($this->query, $currentLog)) {
107109
$logIndex->addToIndex($currentLogPosition, $currentTimestamp ?? 0, $currentLogLevel, $currentIndex);
108110
}

tests/Feature/LogsControllerTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,50 @@
1414

1515
expect($response->json('logs'))->toHaveCount(count($logEntries));
1616
});
17+
18+
test('simple characters can be searched case-insensitive', function () {
19+
$logEntries = [
20+
makeLaravelLogEntry(message: 'error'),
21+
makeLaravelLogEntry(message: 'Error'),
22+
makeLaravelLogEntry(message: 'eRrOr'),
23+
makeLaravelLogEntry(message: 'ERROR'),
24+
makeLaravelLogEntry(message: 'simple text'),
25+
];
26+
$file = generateLogFile('logsearchtest.log', implode(PHP_EOL, $logEntries));
27+
28+
// first, just to be sure that we're getting all the logs without any query
29+
$response = getJson(route('log-viewer.logs', ['file' => $file->identifier]));
30+
expect($response->json('logs'))->toHaveCount(count($logEntries));
31+
32+
// now, with the query. Re-instantiate the log reader to make sure we don't have anything cached.
33+
\Opcodes\LogViewer\Readers\IndexedLogReader::clearInstance($file);
34+
$response = getJson(route('log-viewer.logs', [
35+
'file' => $file->identifier,
36+
'query' => 'error',
37+
]));
38+
expect($response->json('logs'))->toHaveCount(4);
39+
40+
});
41+
42+
test('unicode characters can be searched case-insensitive', function () {
43+
$logEntries = [
44+
makeLaravelLogEntry(message: 'ошибка'),
45+
makeLaravelLogEntry(message: 'Ошибка'),
46+
makeLaravelLogEntry(message: 'ошибкА'),
47+
makeLaravelLogEntry(message: 'ОШИБКА'),
48+
makeLaravelLogEntry(message: 'simple text'),
49+
];
50+
$file = generateLogFile('logunicodetest.log', implode(PHP_EOL, $logEntries));
51+
52+
// first, just to be sure that we're getting all the logs without any query
53+
$response = getJson(route('log-viewer.logs', ['file' => $file->identifier]));
54+
expect($response->json('logs'))->toHaveCount(count($logEntries));
55+
56+
// now, with the query. Re-instantiate the log reader to make sure we don't have anything cached.
57+
\Opcodes\LogViewer\Readers\IndexedLogReader::clearInstance($file);
58+
$response = getJson(route('log-viewer.logs', [
59+
'file' => $file->identifier,
60+
'query' => 'ошибка',
61+
]));
62+
expect($response->json('logs'))->toHaveCount(4);
63+
});

0 commit comments

Comments
 (0)