Skip to content

Commit 10913e6

Browse files
authored
Merge pull request #5 from shadowhand/toggled-writer
Add writer that can be toggled
2 parents 026478c + f2db9ad commit 10913e6

5 files changed

Lines changed: 133 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
### Added
1515

1616
- Added a `Log::append()` method to allow attaching multiple entries, without using `LogList`
17+
- Added `ToggledWriter` to enable or disable log writing at runtime
1718

1819
## [0.4.0]
1920

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,33 @@ The sampled writer ensures that:
306306
This is particularly useful for high-traffic applications where logging every successful request would be
307307
prohibitively expensive, while still capturing all errors for debugging.
308308

309+
### ToggledWriter
310+
311+
The `ToggledWriter` is a decorator that allows log writing to be enabled or disabled at runtime.
312+
313+
```php
314+
use Knotlog\Writer\ToggledWriter;
315+
use Knotlog\Writer\FileWriter;
316+
317+
// Enabled by default
318+
$writer = new ToggledWriter(new FileWriter());
319+
320+
// Or start disabled
321+
$writer = new ToggledWriter(new FileWriter(), writeLogs: false);
322+
323+
// Disable writing at any point
324+
$writer->disable();
325+
326+
// Re-enable writing
327+
$writer->enable();
328+
329+
// Only writes if enabled
330+
$writer->write($log);
331+
```
332+
333+
This is useful for conditionally disabling log output based on runtime configuration, such as
334+
feature flags or environment-specific settings.
335+
309336
## License
310337

311338
MIT License, see `LICENSE` file for details.

composer.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@
7272
"scripts": {
7373
"analyze": "vendor/bin/mago analyze",
7474
"cover": "coverage-check build/phpunit/clover.xml 100",
75+
"fix": [
76+
"vendor/bin/mago lint --fix",
77+
"vendor/bin/mago format"
78+
],
7579
"lint": "vendor/bin/mago lint",
7680
"test": "vendor/bin/phpunit",
7781
"check": [

src/Writer/ToggledWriter.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Knotlog\Writer;
6+
7+
use Knotlog\Log;
8+
use Override;
9+
10+
final class ToggledWriter implements LogWriter
11+
{
12+
public function __construct(
13+
private readonly LogWriter $logWriter,
14+
private bool $writeLogs = true,
15+
) {}
16+
17+
public function enable(): void
18+
{
19+
$this->writeLogs = true;
20+
}
21+
22+
public function disable(): void
23+
{
24+
$this->writeLogs = false;
25+
}
26+
27+
#[Override]
28+
public function write(Log $log): void
29+
{
30+
if ($this->writeLogs) {
31+
$this->logWriter->write($log);
32+
}
33+
}
34+
}

tests/Writer/ToggledWriterTest.php

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Knotlog\Tests\Writer;
6+
7+
use Knotlog\Log;
8+
use Knotlog\Writer\LogWriter;
9+
use Knotlog\Writer\ToggledWriter;
10+
use PHPUnit\Framework\Attributes\CoversClass;
11+
use PHPUnit\Framework\Attributes\Test;
12+
use PHPUnit\Framework\TestCase;
13+
14+
#[CoversClass(ToggledWriter::class)]
15+
final class ToggledWriterTest extends TestCase
16+
{
17+
#[Test]
18+
public function it_is_enabled_by_default(): void
19+
{
20+
$log = new Log();
21+
22+
$innerWriter = $this->createMock(LogWriter::class);
23+
$innerWriter->expects($this->once())->method('write')->with($log);
24+
25+
$writer = new ToggledWriter($innerWriter);
26+
$writer->write($log);
27+
}
28+
29+
#[Test]
30+
public function it_can_be_constructed_as_disabled(): void
31+
{
32+
$log = new Log();
33+
34+
$innerWriter = $this->createMock(LogWriter::class);
35+
$innerWriter->expects($this->never())->method('write');
36+
37+
$writer = new ToggledWriter($innerWriter, writeLogs: false);
38+
$writer->write($log);
39+
}
40+
41+
#[Test]
42+
public function it_does_not_write_when_disabled(): void
43+
{
44+
$log = new Log();
45+
46+
$innerWriter = $this->createMock(LogWriter::class);
47+
$innerWriter->expects($this->never())->method('write');
48+
49+
$writer = new ToggledWriter($innerWriter);
50+
$writer->disable();
51+
$writer->write($log);
52+
}
53+
54+
#[Test]
55+
public function it_can_be_re_enabled_after_disabling(): void
56+
{
57+
$log = new Log();
58+
59+
$innerWriter = $this->createMock(LogWriter::class);
60+
$innerWriter->expects($this->once())->method('write')->with($log);
61+
62+
$writer = new ToggledWriter($innerWriter);
63+
$writer->disable();
64+
$writer->enable();
65+
$writer->write($log);
66+
}
67+
}

0 commit comments

Comments
 (0)