php - logger - ¿Cómo no mostrar el último corchete en una línea de registro monólogo?
symfony logger (3)
Esos son los datos extra. El formato predeterminado de LineFormatter es "[%datetime%] %channel%.%level_name%: %message% %context% %extra%/n"
. el nombre de usuario / edad es el contexto, y los resultados que normalmente son vacíos en esta matriz vacía []
Si utiliza procesadores para adjuntar datos a los registros de registro, normalmente lo escriben en la clave adicional para evitar conflictos con la información de contexto. Si realmente es un problema para usted, puede cambiar el formato predeterminado y omitir %extra%
.
Edición: a partir de Monolog 1.11, el LineFormatter tiene un parámetro $ ignoreEmptyContextAndExtra en el constructor que le permite eliminarlos, por lo que puede usar esto:
// the last "true" here tells it to remove empty []''s
$formatter = new LineFormatter(null, null, false, true);
$handler->setFormatter($formatter);
// in my PHP code
$log = new Logger(''LaurentCommand'');
$log->pushHandler(new StreamHandler(''./app/logs/LaurentCommand.log''));
$log->addInfo("Start command",array(''username'' => ''Joe'', ''Age'' => ''28''));
Resultado en el archivo de registro LaurentCommand.log:
[2012-12-20 10:28:11] LaurentCommand.INFO: Comando de inicio {"username": "Joe", "Age": "28"} []
¿Por qué este soporte al final?
Sé que esta es una vieja pregunta, pero también la encontré y quiero compartir mi solución.
Los corchetes al final de las líneas de registro se deben a la forma en que el LineFormatter
de Monolog intenta json_encode()
los datos en %extra%
. Los paréntesis son una representación JSON de una matriz vacía.
Para desactivar esos corchetes, tuve que subclasificar Monolog/Formatter/LineFormatter
con mi propia clase y sobrescribir su función convertToString($data)
para que devuelva una cadena vacía si no hay datos presentes. Aquí está mi nueva subclase:
namespace My/Fancy/Monolog;
use Monolog/Formatter/LineFormatter;
class LineFormatter extends LineFormatter {
protected function convertToString($data)
{
if (null === $data || is_scalar($data)) {
return (string) $data;
}
// BEGIN CUSTOM CODE - This section added to prevent empty
// brackets from appearing at the end of log lines:
if ((is_array($data) && !$data)
|| is_object($data) && !get_object_vars($data)) {
return '''';
}
// END CUSTOM CODE
$data = $this->normalize($data);
if (version_compare(PHP_VERSION, ''5.4.0'', ''>='')) {
return $this->toJson($data);
}
return str_replace(''///'', ''/'', json_encode($data));
}
}
Puedes usar esta clase inyectando una instancia de ella en tu clase de manejador de Monolog, de esta manera:
$handler = new Monolog/Handler/StreamHandler(''/path/to/my/logfile'', ''debug'');
$handler->setFormatter(new My/Fancy/Monolog/LineFormatter());
$monolog->pushHandler($handler);
¡Disfrutar!
Vieja pregunta, pero arrojando otra opción simple:
$slackHandler = new /Monolog/Handler/SlackWebhookHandler(...);
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true);