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