2015-11-06 38 views
1

我想要做的是創建自定義日誌級別(例如SentLevel,ReceivedLevel和ReadLevel),並將使用它們記錄的消息存儲在單獨的文件中。如何根據消息級別在單獨的文件中記錄消息

讓我通過一個例子更清楚地解釋我自己。每個LOC應該放置在單獨的日誌文件:的

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

內容今天發送: 發送的數據:)的

內容今天收到: 接收數據:-)

內容今天行動: 行動!

我調查了一下,我使用Log4j 1.2.17。我正在使用DailyRollingFileAppender。問題是我記錄的每條消息都存儲在三個文件中。

下列方式我創建等級:

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); 
    } 
} 

我的log4j.xml如下:

<?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> 

任何提示?謝謝:)

**編輯:**我不會在意從Log4j 1.x遷移到2.x,只要目標是可行的(事實上,我已經開始在另一個項目中使用2.x )。

回答

1

我得到這個小環境中工作的事情:

在Java文件:

1.By定義級別;

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

2.創建記錄器;

Logger test_logger = LogManager.getLogger(); 

3.調用日誌方法將日誌追加到文件中。

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

我log4j2.xml文件是這樣的:

<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> 

的log4j2.xml文件放置在src文件夾中。 還有一件事;我正在使用log4j-api-2.3.jar,log4j-core-2.3.jar

嘗試使用此配置,可能會對您有所幫助。 :)

+0

謝謝@Shivam,我會在星期一測試它:),但它似乎工作作爲魅力:D – russellhoff

+0

我在這裏得到一些問題... Log4j2甚至沒有創建的文件夾,我會放置日誌。任何提示? – russellhoff

+0

我的項目是一個web應用程序,打包爲WAR。 – russellhoff