Literatura Leos
Me pregunto si hay alguna forma de proporcionar un valor predeterminado para la sustitución de propiedades en LOG4J.
Quiero pasar la ruta del archivo en la propiedad del sistema java y luego usarla con “${env:mySystemProperty}”. Pero, ¿qué pasa si el desarrollador se olvida de establecer esta propiedad? Entonces me gustaría tener algún valor predeterminado significativo definido en log4j2.xml.
¿Alguna idea de cómo lograr esta funcionalidad?
EDITAR:
La sustitución env no funciona para mí:
standalone.conf
-DoauthLoginLogPath=/path/oauth2.log
log4j2.xml
<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true">
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true">
Puedo ver en la consola wildfly la propiedad, reinicié el servidor pero no puedo hacerlo.
Remko papá
Mapa de propiedades predeterminado
Mirando a http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution
puede especificar un mapa de propiedades predeterminado en el archivo de configuración. Que toma esta forma:
<Configuration status="debug">
<Properties>
<Property name="oauthLoginLogPath">default/location/of/oauth2.log</Property>
</Properties>
...
<Appenders>
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}">
....
</Configuration
Luego, si inicia su aplicación con la propiedad del sistema -DoauthLoginLogPath=/path/oauth2.log
el agregador de archivos fileName
El valor se buscará primero en las propiedades del sistema, pero si eso falla, volverá a la propiedad definida en el Properties
en la parte superior del archivo de configuración log4j2.xml.
En línea
Una segunda forma es proporcionar el valor predeterminado en línea:
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
En general, todas las búsquedas de Log4j2 siguen este patrón: ${type:key:-defaultValue}
.
Env vs sistema
Por cierto, el env
El prefijo es para variables de entorno (como %PATH% en Windows), y no está relacionado con sys
, que son las propiedades del sistema Java. Ver también http://logging.apache.org/log4j/2.x/manual/lookups.html
-
No sé si funcionó en una versión anterior, pero esta ya no funciona. Tiene que usar ‘:-‘ en la propiedad para definir el valor predeterminado.
– Go Goris
14 de junio de 2016 a las 6:56
-
En caso de que alguien tenga problemas para establecer el valor predeterminado en línea. Tenga en cuenta que el valor es lo que viene después del guión, por ejemplo, si mi ruta predeterminada es
/var/log/myfile.log
entonces escribiría${sys:oauthLoginLogPath:-/var/log/myfile.log}
– José Duarte
19 oct 2021 a las 23:06
GoGoris
Puedes usar el mismo ${sys:propName:-default}
sintaxis. Observe el ‘:-‘, se llama “delimitador de valor predeterminado variable“. El por defecto valor para el “delimitador de valor predeterminado variable” es :-
como en intento y otra *nada conchas
Puede leer más sobre esto en la documentación de Log4j 2 para el StrSubstitutor clase.
Para usar el mismo ejemplo:
<Configuration status="debug">
...
<Appenders>
<Appender type="File" name="File"
fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
....
</Appenders>
</Configuration>
-
Lamentablemente, parece que los valores predeterminados se resuelven en el momento en que se carga el archivo log4j2.xml. No funciona para establecer valores predeterminados para, por ejemplo, variables que se inyectarán a través del contexto del hilo.
– grabar
16/07/2017 a las 20:20
-
Corrección: funciona, pero hay que añadir un segundo
$
p.ej$${ctx:username:-UNKNOWN}
🙂– grabar
16 de julio de 2017 a las 20:24