mirror of
https://github.com/zhamao-robot/zhamao-logger.git
synced 2026-07-07 16:55:36 +08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d79edcef53 | ||
|
|
ac5fa59428 | ||
|
|
26dc5fa8c3 | ||
|
|
e75fa01ca5 |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "zhamao/logger",
|
||||
"description": "Another Console Logger for CLI Applications",
|
||||
"description": "Another Colorful Console Logger for CLI Applications",
|
||||
"type": "library",
|
||||
"license": "Apache-2.0",
|
||||
"autoload": {
|
||||
@@ -16,7 +16,7 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "jerry",
|
||||
"email": "admin@zhamao.me"
|
||||
"email": "github@cwcc.me"
|
||||
},
|
||||
{
|
||||
"name": "sunxyw",
|
||||
|
||||
@@ -10,7 +10,7 @@ use Psr\Log\LogLevel;
|
||||
|
||||
class ConsoleLogger extends AbstractLogger
|
||||
{
|
||||
public const VERSION = '1.1.4';
|
||||
public const VERSION = '1.1.7';
|
||||
|
||||
/**
|
||||
* 日志输出格式
|
||||
@@ -86,6 +86,13 @@ class ConsoleLogger extends AbstractLogger
|
||||
*/
|
||||
protected $stream;
|
||||
|
||||
/**
|
||||
* 递归保护标志 — 防止日志写入失败时错误处理器再次调用日志导致死循环 CPU 100%
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected static $in_log = false;
|
||||
|
||||
/**
|
||||
* 是否带颜色
|
||||
*
|
||||
@@ -93,13 +100,15 @@ class ConsoleLogger extends AbstractLogger
|
||||
*/
|
||||
protected $decorated;
|
||||
|
||||
protected $use_stderr = false;
|
||||
|
||||
/**
|
||||
* 创建一个 ConsoleLogger 实例
|
||||
*
|
||||
* @param string $level 日志等级
|
||||
* @param null|resource $stream
|
||||
*/
|
||||
public function __construct(string $level = LogLevel::INFO, $stream = null, bool $decorated = true)
|
||||
public function __construct(string $level = LogLevel::INFO, $stream = null, bool $decorated = true, bool $use_stderr = false)
|
||||
{
|
||||
$this->decorated = $decorated;
|
||||
self::$log_level = $this->castLogLevel($level);
|
||||
@@ -119,6 +128,7 @@ class ConsoleLogger extends AbstractLogger
|
||||
&& posix_isatty($stream); // whether is interactive terminal
|
||||
}
|
||||
$this->stream = $stream;
|
||||
$this->use_stderr = $use_stderr;
|
||||
}
|
||||
|
||||
public function setLevel(string $level): void
|
||||
@@ -215,6 +225,7 @@ class ConsoleLogger extends AbstractLogger
|
||||
|
||||
$log_replace = [
|
||||
'%date%' => date(self::$date_format),
|
||||
'%level_long%' => strtoupper(self::$levels[$level]),
|
||||
'%level%' => strtoupper(substr(self::$levels[$level], 0, 4)),
|
||||
'%body%' => $message,
|
||||
'%level_short%' => strtoupper(substr(self::$levels[$level], 0, 1)),
|
||||
@@ -238,14 +249,33 @@ class ConsoleLogger extends AbstractLogger
|
||||
} else {
|
||||
$output = $output . PHP_EOL;
|
||||
}
|
||||
// use stream
|
||||
if ($this->stream) {
|
||||
fwrite($this->stream, $output);
|
||||
fflush($this->stream);
|
||||
} else {
|
||||
// use plain text output
|
||||
echo $output;
|
||||
// 递归保护:如果上一次日志写入触发了错误(如终端关闭后 STDOUT/STDERR 破损),
|
||||
// 跳过本次输出,防止错误处理器递归调用导致 CPU 100% 空耗
|
||||
if (self::$in_log) {
|
||||
return;
|
||||
}
|
||||
self::$in_log = true;
|
||||
try {
|
||||
// use stream
|
||||
if ($this->stream) {
|
||||
@fwrite($this->stream, $output);
|
||||
@fflush($this->stream);
|
||||
} else {
|
||||
if ($level <= 4 && $this->use_stderr) {
|
||||
@fwrite(STDERR, $output);
|
||||
} else {
|
||||
// use plain text output
|
||||
@echo $output;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
self::$in_log = false;
|
||||
}
|
||||
}
|
||||
|
||||
public function setDecorated(bool $decorated): void
|
||||
{
|
||||
$this->decorated = $decorated;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -319,9 +349,4 @@ class ConsoleLogger extends AbstractLogger
|
||||
|
||||
return strtr($message, $replace);
|
||||
}
|
||||
|
||||
public function setDecorated(bool $decorated): void
|
||||
{
|
||||
$this->decorated = $decorated;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user