【问题标题】:How to hide Level in Log4jevent in Java如何在 Java 中的 Log4jevent 中隐藏级别
【发布时间】:2015-01-30 11:04:31
【问题描述】:
    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:。

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

【问题讨论】:

    标签: java apache log4j logfile


    【解决方案1】:

    我发现这个解决方法(我正在使用 log4j2)采用自定义级别。

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

    在这种情况下,name 的值将出现在日志消息(空格)中,隐藏日志级别名称(例如“WARN”、“INFO”)。您不能使用空字符串。 看看Level.forName官方java文档。

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

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

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我正在使用 org.apache.logging.log4j.Level 这似乎没有方法 Level.forName();
    • 可能您的版本较旧。我将用这种情况更新答案。
    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多