Skip to content

Commit 7d2e2b9

Browse files
Fix #16208: Fix yii\log\FileTarget to not export empty messages
1 parent 1a0e91e commit 7d2e2b9

File tree

4 files changed

+70
-3
lines changed

4 files changed

+70
-3
lines changed

framework/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Yii Framework 2 Change Log
44
2.0.49 under development
55
------------------------
66

7+
- Bug #16208: Fix `yii\log\FileTarget` to not export empty messages (terabytesoftw)
78
- Bug #19857: Fix AttributeTypecastBehavior::resetOldAttributes() causes "class has no attribute named" InvalidArgumentException (uaoleg)
89
- Bug #18859: Fix `yii\web\Controller::bindInjectedParams()` to not throw error when argument of `ReflectionUnionType` type is passed (bizley)
910
- Enh #19841: Allow jQuery 3.7 to be installed (wouter90)

framework/log/FileTarget.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,18 @@ public function init()
106106
*/
107107
public function export()
108108
{
109+
$text = implode("\n", array_map([$this, 'formatMessage'], $this->messages)) . "\n";
110+
$trimmedText = trim($text);
111+
112+
if (empty($trimmedText)) {
113+
return; // No messages to export, so we exit the function early
114+
}
115+
109116
if (strpos($this->logFile, '://') === false || strncmp($this->logFile, 'file://', 7) === 0) {
110117
$logPath = dirname($this->logFile);
111118
FileHelper::createDirectory($logPath, $this->dirMode, true);
112119
}
113120

114-
$text = implode("\n", array_map([$this, 'formatMessage'], $this->messages)) . "\n";
115121
if (($fp = @fopen($this->logFile, 'a')) === false) {
116122
throw new InvalidConfigException("Unable to append to log file: {$this->logFile}");
117123
}
@@ -124,12 +130,12 @@ public function export()
124130
if ($this->enableRotation && @filesize($this->logFile) > $this->maxFileSize * 1024) {
125131
$this->rotateFiles();
126132
}
127-
$writeResult = @fwrite($fp, $text);
133+
$writeResult = @fwrite($fp, $trimmedText);
128134
if ($writeResult === false) {
129135
$error = error_get_last();
130136
throw new LogRuntimeException("Unable to export log through file ({$this->logFile})!: {$error['message']}");
131137
}
132-
$textSize = strlen($text);
138+
$textSize = strlen($trimmedText);
133139
if ($writeResult < $textSize) {
134140
throw new LogRuntimeException("Unable to export whole log through file ({$this->logFile})! Wrote $writeResult out of $textSize bytes.");
135141
}

tests/framework/log/FileTargetTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use yii\log\Dispatcher;
1313
use yii\log\FileTarget;
1414
use yii\log\Logger;
15+
use yiiunit\framework\log\mocks\CustomLogger;
1516
use yiiunit\TestCase;
1617

1718
/**
@@ -110,4 +111,41 @@ public function testRotate()
110111
$this->assertFileNotExists($logFile . '.3');
111112
$this->assertFileNotExists($logFile . '.4');
112113
}
114+
115+
public function testLogEmptyStrings()
116+
{
117+
$logFile = Yii::getAlias('@yiiunit/runtime/log/filetargettest.log');
118+
$this->clearLogFile($logFile);
119+
120+
$logger = new CustomLogger();
121+
$logger->logFile = $logFile;
122+
$logger->messages = array_fill(0, 1, 'xxx');
123+
$logger->export();
124+
125+
$test = file($logFile);
126+
$this->assertEquals("xxx", $test[0]);
127+
128+
$this->clearLogFile($logFile);
129+
130+
$logger->messages = array_fill(0, 1, 'yyy');
131+
$logger->export();
132+
133+
$this->assertFileNotExists($logFile);
134+
135+
$logger->messages = array_fill(0, 10, '');
136+
$logger->export();
137+
138+
$this->assertFileNotExists($logFile);
139+
140+
$logger->messages = array_fill(0, 10, null);
141+
$logger->export();
142+
143+
$this->assertFileNotExists($logFile);
144+
}
145+
146+
private function clearLogFile($logFile)
147+
{
148+
FileHelper::removeDirectory(dirname($logFile));
149+
mkdir(dirname($logFile), 0777, true);
150+
}
113151
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace yiiunit\framework\log\mocks;
4+
5+
use yii\log\FileTarget;
6+
7+
class CustomLogger extends FileTarget
8+
{
9+
/**
10+
* @param array $message
11+
*
12+
* @return null|string|array
13+
*/
14+
public function formatMessage($message)
15+
{
16+
if ($message == 'yyy') {
17+
return null;
18+
}
19+
20+
return $message;
21+
}
22+
}

0 commit comments

Comments
 (0)