You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by "Mihhail Lapushkin (JIRA)" <ji...@apache.org> on 2017/03/09 10:24:38 UTC

[jira] [Created] (LOG4J2-1842) Expand SystemPropertiesLookup syntax

Mihhail Lapushkin created LOG4J2-1842:
-----------------------------------------

             Summary: Expand SystemPropertiesLookup syntax
                 Key: LOG4J2-1842
                 URL: https://issues.apache.org/jira/browse/LOG4J2-1842
             Project: Log4j 2
          Issue Type: Improvement
          Components: Lookups
            Reporter: Mihhail Lapushkin
            Priority: Minor


I've been using a modified version of {{SystemPropertiesLookup}} in my project. Maybe it could be part of the library.

The idea is to allow a series of property keys to be specified. If one of the properties is present, then it is used. If none are present, then the default value is used. For example:
{code}
<Logger name="com.myapp.dao" level="${sys:myapp.log.level|myapp.log.level.dao|warn}"/>

<Logger name="com.myapp.service" level="${sys:myapp.log.level|myapp.log.level.service|warn}"/>

<Logger name="com.myapp.controller" level="${sys:myapp.log.level|myapp.log.level.controller|warn}"/>
{code}
This allows me to quickly rerun the app with different log levels without fiddling with the configuration file or JConsole. Defaults represent production settings, so that nothing extra needs to be specified to run the app.
This work nice in other places as well:
{code}
<PatternLayout disableAnsi="${sys:myapp.log.nocolor|true}">
{code}
Disables colors by default (for production build), but leaves an easy way to turn them on for development.

When no pipes are present in the expression, then the standard property lookup is used, so the change is backwards-compatible.
Can be a separate lookup if needed.

Here is the possible implementation:
{code}
@Plugin(name = "sys", category = StrLookup.CATEGORY)
public class SystemPropertiesLookup extends AbstractLookup {

    private static final Logger LOGGER = StatusLogger.getLogger();
    private static final Marker LOOKUP = MarkerManager.getMarker("LOOKUP");

    /**
     * @param event The current LogEvent.
     * @param expression the expression to be looked up.
     * @return The value resolved by expression.
     */
    @Override
    public String lookup(final LogEvent event, final String expression) {
        try {
            if (expression.indexOf('|') < 0) {
                return System.getProperty(expression);
            }

            String[] expressionElements = expression.split("\\|");

            for (int i = 0; i < expressionElements.length - 1; i++) {
                String propertyValue = System.getProperty(expressionElements[i]);

                if (propertyValue != null) {
                    return propertyValue;
                }
            }

            return expressionElements[expressionElements.length - 1];
        } catch (final Exception ex) {
            LOGGER.warn(LOOKUP, "Error while resolving system property by expression [{}].", expression, ex);
            return null;
        }
    }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org