No problem, I've found a solution.

I've made my simple Log level Lookup.

Feel free to include into main log4j project. It's simple and powerful!




import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

/**
 * Looks up "name" and "intLevel" keys from
 * {@link org.apache.logging.log4j.Level} log messages.
 */
@Plugin(name = "evt", category = StrLookup.CATEGORY)
public class EventLevelLookup implements StrLookup {

    /**
* Returns {@code null}. This Lookup plugin does not make sense outside the
     * context of a LogEvent.
     *
     * @param key the key to be looked up, may be null
     * @return {@code null}
     */
    @Override
    public String lookup(String key) {
        return null;
    }

    /**
     * Looks up the value for the key using the level in the LogEvent.
     *
     * @param event The current LogEvent.
     * @param key the key to be looked up, not null. It could be "name" or
     * "intLevel". The key "name" returns the string level name
* ("WARN","INFO",etc..), "intLevel" returns its int value (0,1,2, etc...) * @return The value associated with the key. If key is invalid or event
     * does not have level, returns null.
     */
    @Override
    public String lookup(LogEvent event, String key) {
if (key == null || key.trim().isEmpty() || event == null || event.getLevel() == null) {
            return null;
        }

        if (key.trim().equalsIgnoreCase("name")) {
            return event.getLevel().name();
        } else if (key.trim().equalsIgnoreCase("intLevel")) {
            return "" + event.getLevel().intLevel();
        }
        return null;
    }

}



--------------------NEW log4j2 comfiguration

<Configuration status="trace">
    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${evt:name}">
                <Route>
<RollingFile name="RollingFile-${evt:name}" fileName="${sys:catalina.home}/logs${web:contextPath}${web:contextPath}-${evt:name}.log" filePattern="${sys:catalina.home}/logs${web:contextPath}/old/%d{yyyy-MM-dd}-${evt:name}-%i.log.gz">
                        <PatternLayout>
                            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                        </PatternLayout>
                        <Policies>
                            <TimeBasedTriggeringPolicy />
                        </Policies>
                        <DefaultRolloverStrategy/>

<ThresholdFilterlevel="${evt:name}"/>


                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Routing"/>
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>



Best regards,
Agharta




On 01/13/2017 12:20 PM, agharta wrote:

Hi all,

Searching in documentation i didn't find (or wrong search) an example to separate log files based on its level.

The idea is to have separate files named based on its level, so all error messages will be redirected to "somefile-error.log", info to "somefile-info.log", and so on... with relative additivity property.

I suppose to use a <Routing> tag, but...how to iterate over message level (which lookup should i use)?

My example:

<Configuration status="fatal">
    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${some_message_level_variable}">
                <Route>
<RollingFile name="RollingFile-${some_message_level_variable}" fileName="the/path/logs/somefile-${some_message_level_variable}.log" filePattern="the/path/logs/somefile-${some_message_level_variable}-%d{yyyy-MM-dd}-%i.log.gz">
                        <PatternLayout>
                            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                        </PatternLayout>
                        <Policies>
                            <TimeBasedTriggeringPolicy />
                        </Policies>
                        <DefaultRolloverStrategy/>

<ThresholdFilterlevel="${some_message_level_variable}"/>

                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="warn">
            <AppenderRef ref="Routing"/>
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>


Ideas on which property lookup should i use instead of ${some_message_level_variable}??


A note: the best would be to not set any variable in ThreadContext and/or *Map map......


Thanks for your patience,

Best regards,

Agharta













Reply via email to