Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中隐藏Log4jevent中的级别_Java_Apache_Log4j_Logfile - Fatal编程技术网

如何在Java中隐藏Log4jevent中的级别

如何在Java中隐藏Log4jevent中的级别,java,apache,log4j,logfile,Java,Apache,Log4j,Logfile,在下面生成的日志中,我想删除我生成的日志中的“INFO:”。为此,我想从Log4jEvent中删除级别。 我试着将level更改为OFF、null等,但是level仍然分别显示为OFF:和null: 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

在下面生成的日志中,我想删除我生成的日志中的“INFO:”。为此,我想从Log4jEvent中删除级别。 我试着将level更改为OFF、null等,但是level仍然分别显示为OFF:和null:

    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.

我发现这项工作(我使用log4j2)采用了自定义级别

    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, "");
    }
    }
在这种情况下,
name
的值将出现在日志消息(一个空格)中,隐藏日志级别名称(例如,“WARN”、“INFO”)。不能使用空字符串。 看看官方的java文档

如果您提供了一个较旧版本的log4j(例如1.2.17),那么方法是类似的。首先,您需要创建一个自定义级别类,从log4j扩展该级别类:

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 ");
然后您必须正确配置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);
      }
    }

我希望这能有所帮助。

谢谢你的回答。我使用的是org.apache.logging.log4j.Level,它似乎没有方法Level.forName();可能你有一个旧版本。我将用这个场景更新答案。
<?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");
    }
}