How to log messages in separate files depending on their level

安稳与你 提交于 2019-12-11 11:12:15

问题


What I want to do is create custom log Levels (for example SentLevel, ReceivedLevel and ReadLevel) and store the messages logged using them in separate files.

Let me explain myself more clearly, with an example. Each LOC should be placed in separate LOG files:

    logger.log(ResultadosEnviadosLevel.RESULTADOS_ENVIADOS, "sent data :)");
    logger.log(ResultadosRecibidosLevel.RESULTADOS_RECIBIDOS, "received data :-)");
    logger.log(CustomLevel.ACCION, "action!!");

Content of today-sent: sent data :)

Content of today-received: received data :-)

Content of today-action: action!!

I've investigated a bit and I'm using Log4j 1.2.17. I'm using DailyRollingFileAppender. The issue is that every message I log it's stored within the three files.

I've created Levels in the following way:

import org.apache.log4j.Level;

public class CustomLog4jLevel extends Level {

    private static final long serialVersionUID = 6031879473353817158L;

    /**
     * Value of AccionLog4jLevel level. This value is lesser than DEBUG_INT and higher
     * than TRACE_INT}
     */
    public static final int ACCION_INT = DEBUG_INT - 10;

    /**
     * Level representing my log level
     */
    public static final Level ACCION = new CustomLog4jLevel(ACCION_INT, "ACCION", 10);

    /**
     * Constructor
     */
    protected CustomLog4jLevel(int arg0, String arg1, int arg2) {
        super(arg0, arg1, arg2);

    }

    /**
     * Checks whether logArgument is "Accion" level. If yes then returns
     * Accion}, else calls AccionLog4jLevel#toLevel(String, Level) passing
     * it Level#DEBUG as the defaultLevel.
     */
    public static Level toLevel(String logArgument) {
        if (logArgument != null && logArgument.toUpperCase().equals("ACCION")) {
            return ACCION;
        }
        return (Level) toLevel(logArgument);
    }

    /**
     * Checks whether val is AccionLog4jLevel#Accion_INT. If yes then
     * returns AccionLog4jLevel#Accion, else calls
     * AccionLog4jLevel#toLevel(int, Level) passing it Level#DEBUG as the
     * defaultLevel
     * 
     */
    public static Level toLevel(int val) {
        if (val == ACCION_INT) {
            return ACCION;
        }
        return (Level) toLevel(val, Level.DEBUG);
    }

    /**
     * Checks whether val is AccionLog4jLevel#Accion_INT. If yes
     * then returns AccionLog4jLevel#Accion, else calls Level#toLevel(int, org.apache.log4j.Level)
     * 
     */
    public static Level toLevel(int val, Level defaultLevel) {
        if (val == ACCION_INT) {
            return ACCION;
        }
        return Level.toLevel(val, defaultLevel);
    }

    /**
     * Checks whether logArgument is "Accion" level. If yes then returns
     * AccionLog4jLevel#Accion, else calls
     * Level#toLevel(java.lang.String, org.apache.log4j.Level)
     * 
     */
    public static Level toLevel(String logArgument, Level defaultLevel) {
        if (logArgument != null && logArgument.toUpperCase().equals("ACCION")) {
            return ACCION;
        }
        return Level.toLevel(logArgument, defaultLevel);
    }
}

My log4j.xml is the following:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" 
 "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration 
    xmlns:log4j="http://jakarta.apache.org/log4j/"
    debug="true">

    <appender name="file-daily" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="append" value="false" />
        <param name="additivity" value="false" />

        <param name="Threshold" value="ACCION"/>

        <param name="levelMin" value="ACCION" />
        <param name="levelMax" value="ACCION" />

        <!-- Colocamos los logs en la carpeta padronlogs dentro de la del Tomcat logs -->
        <param name="file" value="${catalina.home}/logs/padronLogs/hoy.log" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
                value="%d{dd-MM-yyyy HH:mm:ss} %-5p - %m%n" />
        </layout>
    </appender>    

    <appender name="file-results-sent" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="append" value="false" />
        <param name="additivity" value="false" />

        <param name="Threshold" value="RESULTADOS_ENVIADOS"/>

        <param name="levelMin" value="RESULTADOS_ENVIADOS" />
        <param name="levelMax" value="RESULTADOS_ENVIADOS" />

        <!-- Colocamos los logs en la carpeta padronlogs dentro de la del Tomcat logs -->
        <param name="file" value="${catalina.home}/logs/padronLogs/enviados/hoy-enviados.log" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
                value="%d{dd-MM-yyyy HH:mm:ss} %-5p - %m%n" />
        </layout>
    </appender>    

    <appender name="file-results-received" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="append" value="false" />
        <param name="additivity" value="false" />

        <param name="Threshold" value="RESULTADOS_RECIBIDOS"/>

        <param name="levelMin" value="RESULTADOS_RECIBIDOS" />
        <param name="levelMax" value="RESULTADOS_RECIBIDOS" />

        <!-- Colocamos los logs en la carpeta padronlogs dentro de la del Tomcat logs -->
        <param name="file" value="${catalina.home}/logs/padronLogs/recibidos/hoy-recibidos.log" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
                value="%d{dd-MM-yyyy HH:mm:ss} %-5p - %m%n" />
        </layout>
    </appender>    

    <!-- Limitar la categoria y especificar la prioridad -->
    <category name="com.ingartek.accion">
        <priority value="ACCION" class="com.ingartek.log4j.CustomLog4jLevel" />
        <appender-ref ref="file-daily" />
    </category>

    <category name="com.ingartek.enviados">
        <priority value="RESULTADOS_ENVIADOS" class="com.ingartek.log4j.ResultadosEnviadosLevel" />
        <appender-ref ref="file-results-sent"/>
    </category>
    <category name="com.ingartek.recibidos">
        <priority value="RESULTADOS_RECIBIDOS" class="com.ingartek.log4j.ResultadosRecibidosLevel" />
        <appender-ref ref="file-results-received"/>
    </category>
    <root>
        <level value="info" />
<!--        Solamente mostraremos info relacionada con solicitudes y consultas -->
        <appender-ref ref="file-daily" />
        <appender-ref ref="file-results-sent" />
        <appender-ref ref="file-results-received" />
    </root>

</log4j:configuration>

Any hint? Thank you :)

**EDIT: ** I wouldn't care migrating from Log4j 1.x to 2.x as long as the goal is feasible (indeed, I've started using 2.x in another project).


回答1:


I am getting the things working by this small settings:

IN JAVA file:

1.By defining the Level;

Level TEST = Level.forName("TEST", 250);

2.Creating the logger;

Logger test_logger = LogManager.getLogger();

3.Calling log method to append the logs in file.

test_logger.log(TEST, "test log message");

My log4j2.xml file is like this:

<Configuration status="WARN">

<CustomLevels>
    <CustomLevel name="TEST" intLevel="150" />
</CustomLevels>

<Appenders>
    <File name="TestFile" fileName="/var/tmp/logs/test.log">
        <PatternLayout pattern="%d %-7level %logger{36} - %msg%n" />
    </File>
</Appenders>

<Loggers>
    <Root level="WARN">
        <AppenderRef ref="TestFile" level="test" />
    </Root>
</Loggers>

</Configuration>

The log4j2.xml file is placed in the src folder. One more thing; I am using log4j-api-2.3.jar, log4j-core-2.3.jar

Try using this configuration, may be it help you. :)



来源:https://stackoverflow.com/questions/33566555/how-to-log-messages-in-separate-files-depending-on-their-level

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!