2015-01-30 3 views
0
Hi, 

    I am writing logs to an external file in LogfileAppender. When the logs are written, the level gets appended to the logs. I want to hide the level in my file. 

아래 로그에서 생성 된 로그에서 "INFO :"을 제거하고 싶습니다. 이를 위해 Log4jEvent에서 Level을 제거하고 싶습니다. 레벨을 OFF, null 등으로 변경하려고 시도했습니다. 레벨은 여전히 ​​OFF : 및 null :로 표시됩니다.Log4jevent in Java에서 레벨을 숨기는 방법

My logs in my file look like this: 

    "INFO: 


    ************************************************* 
    Show Logs1 
    ************************************************* 


    INFO: Log1 
    INFO: Log2 
    INFO: 


    ************************************************* 
    Show Logs2 
    ************************************************* 
    INFO: Log3 
    INFO: Log4" 


    My code is: 

    public class Main{ 

    private LogFileAppender appender; 
     MessageFilter messageFilter; 

//These are just dummy data I add to make my log look good 
    String logMessageDummy = " \n \n \n*************************************************\n"; 
     String logMessageDummy1 = "\n*************************************************\n"; 

//This method is used to set appender values 
     public void initialiseAppender() { 


     this.messageFilter = MessageFilter.createFilter("Error", Result.ACCEPT.name(), Result.DENY.name()); 
     this.appender = LogFileAppender.createAppender("test", this.messageFilter, null); 
    setAppender(this.appender); 

    } 

//This method sets my appender 
    public void setAppender(final LogFileAppender fileAppender) { 

     this.appender = fileAppender; 
     } 

    private void logMessage(final String message, final Level level, final String exceptionMessage) { 
     if (this.appender != null) { 
      this.appender.append(new Log4jLogEvent("test", null, "test", level, new SimpleMessage(message + 
       exceptionMessage), null, ThreadContext.getContext(), null, "TestThread", null, System.currentTimeMillis())); 
     } 

//This method is used to generate logs 
    public void generateLogs(){  
    logMessage(this.logMessageDummy + "Logs1" + this.logMessageDummy1, Level.INFO, ""); 

      logMessage("Log 1" , Level.INFO, ""); 
    logMessage("Log 2" , Level.INFO, ""); 

      logMessage(this.logMessageDummy + "Logs2" + this.logMessageDummy1, Level.INFO, ""); 
    logMessage("Log 3" , Level.INFO, ""); 
    logMessage("Log 4" , Level.INFO, ""); 
    } 
    } 

답변

0

나는이 work-around (나는 log4j2를 사용하고있다)가 맞춤 레벨을 채택하고 있음을 발견했다. name 값이 로그 메시지 (공간) 로그 레벨 이름을 숨기고로 나타난다이 경우

final String name = " "; 
final Level VERBOSE = Level.forName(name, 300); 

final Logger logger = LogManager.getLogger(Test.class); 
logger.log(VERBOSE, "this is a message without "); 

(예컨대, "정보", "WARN"). 빈 문자열은 사용할 수 없습니다. Level.forName 공식 자바 문서를 살펴보십시오.

log4j의 이전 버전을 제공 한 경우 (예 : 1.2.17) 접근 방법은 비슷합니다. 첫째로 당신은 log4j에에서 레벨 클래스를 확장 사용자 지정 수준의 클래스를 작성해야합니다

import org.apache.log4j.Level; 

    public class CustomLevel extends Level { 

    private static final String logLevelName = ""; 
    public static final Level CUSTOM_LEVEL = new CustomLevel(DEBUG_INT, logLevelName, 10); 

    protected CustomLevel(int level, String levelStr, int syslogEquivalent) { 
     super(level, levelStr, syslogEquivalent); 
     } 
    } 

당신은 제대로 log4j를 구성 할 수 있습니다

:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" 
        debug="false"> 

    <!-- CONSOLE Appender --> 
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] %m%n" /> 
     </layout> 
    </appender> 

    <!-- Limit Category and Specify Priority --> 
    <category name="custom"> 
     <priority value="CUSTOM_LEVEL" class="CustomLevel" /> 
     <appender-ref ref="CONSOLE" /> 
    </category> 

    <!-- Setup the Root category --> 
    <root> 
     <appender-ref ref="CONSOLE" /> 
    </root> 
</log4j:configuration> 

그래서 당신은 단순히 사용자 지정 수준을 사용할 수 있습니다

import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 

public class TestLog { 

    public static void main(String args[]){ 
     Logger logger = Logger.getLogger(TestLog.class); 
     logger.log(CustomLevel.CUSTOM_LEVEL, "I am custom log"); 
     logger.log(Level.DEBUG, "I am a DEBUG message"); 
     logger.log(Level.INFO, "I am a INFO message"); 
    } 
} 

이 도움이 되었기를 바랍니다.

+0

답변 해 주셔서 감사합니다. org.apache.logging.log4j.Level을 사용하고 있는데이 메서드는 Level.forName(); – Madhu

+0

아마도 이전 버전입니다. 나는이 시나리오로 대답을 업데이트 할 것이다. – beimax