Log4j2无法正确记录到Graylog服务器

Nooby Noob先生

现在,我正在尝试使用log4j2将具有I NFO或更高级别的所有内容(警告,错误和严重)记录到服务器上,并将具有INFO级别的所有内容记录控制台上我能够将内容记录到控制台,但是,在正确地将正确级别记录到服务器时遇到了问题。

到目前为止,这是我尝试过的:

爪哇

import java.time.Instant;

import org.apache.log4j.PropertyConfigurator;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class App {
    private static final Logger log4j = LogManager.getLogger(App.class.getName());

    public static void main(String[] args) {
        try {
            String log4jConfPath = "src/main/resources/log4j2.xml";
            PropertyConfigurator.configure(log4jConfPath);
            log4j.info("this is a testmessage " + Instant.now().toString());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

XML格式

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" packages="org.graylog2.log4j2">

    <Properties>
        <Property name="default_pattern">%d{MM/dd/yyyy hh:mm:ss} %5p %c{1} - %m%n
        </Property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${default_pattern}" />
        </Console>
        <GELF name="gelfAppender" server="graylog.x.something.com"
            hostName="some.host" port="12201">
            <PatternLayout pattern="%d{dd MMM yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n" />
            <KeyValuePair key="extractStacktrace" value="true" />
            <KeyValuePair key="addExtendedInformation" value="true" />
            <KeyValuePair key="facility" value="gelf-java" />
            <KeyValuePair key="environment" value="TEST" />
            <KeyValuePair key="application" value="MyApp" />
            <KeyValuePair key="additionalFields" value="{'environment': 'TEST', 'application': 'MyAPP'}" />
        </GELF>
    </Appenders>

    <Loggers>
        <Root level="error">
            <AppenderRef ref="gelfAppender" />
            <AppenderRef ref="console" />
        </Root>
        <Root level="info">
            <AppenderRef ref="gelfAppender" />
            <AppenderRef ref="console" />

        </Root>
    </Loggers>
</Configuration>

上面的代码没有输出我想要的,而是将INFO级别输出到控制台,将INFO级别输出到服务器

相反,我可以输出:控制台的所有内容(跟踪)和服务器的信息。

我把XML文件弄乱了,我注意到当我更改时

status="trace"

status="off"

它仅将INFO记录到控制台,而不记录到服务器。

最后,可能是最奇怪的事情,如果我删除

Instant.now().toString()

从我的打印语句中,无论状态如何(无论是TRACE还是OFF),什么都不会记录到服务器,但仍会记录到控制台。我以为这与我的GELF附加程序的图案布局有关,所以我改变了

<PatternLayout pattern="%d{dd MMM yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n" />

<PatternLayout pattern="${default_pattern}" />

但这并没有改变输出...

这是我当前的依赖项:

在此处输入图片说明

简而言之,我只想将INFO级别记录到控制台,并将INFO或更高级别记录到服务器。

Raniz

如您所知,您应该使用阈值过滤器WARN从控制台附加程序中过滤级别和更高级别的消息

为不同的附加程序指定不同级别的正确方法是在这样的<Appender>元素上进行指定

<Loggers>
    <Root level="trace">
        <Appender ref="console"/>
        <Appender ref="file" level="info"/>
    </Root>
</Logger>

至于解决您的问题,这里有一个简单的例子程序和配置输出INFO级消息控制台,所有日志消息everything.logINFO和高达infoAndUp.log

LogTest.java

public class LogTest {

    public static void main(String[] args) {
        final Logger log = LogManager.getLogger();

        log.trace("This is a trace message");
        log.debug("This is a debug message");
        log.info("This is an info message");
        log.warn("This is a warning message");
        log.error("This is an error message");
        log.fatal("This is a fatal message");
    }
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="console">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Filters>
                <!-- Exclude messages logged above INFO -->
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
        </Console>
        <File name="everything" fileName="everything.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <File name="infoAndUp" fileName="infoAndUp.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="console" level="info"/>
            <AppenderRef ref="everything" />
            <AppenderRef ref="infoAndUp" level="info"/>
        </Root>
    </Loggers>
</Configuration>

结果

控制台输出

09:29:35.331 [main] INFO  LogTest - This is an info message

everything.log

09:29:35.330 [main] TRACE LogTest - This is a trace message
09:29:35.331 [main] DEBUG LogTest - This is a debug message
09:29:35.331 [main] INFO  LogTest - This is an info message
09:29:35.332 [main] WARN  LogTest - This is a warning message
09:29:35.332 [main] ERROR LogTest - This is an error message
09:29:35.332 [main] FATAL LogTest - This is a fatal message

infoAndUp.log

09:29:35.331 [main] INFO  LogTest - This is an info message
09:29:35.332 [main] WARN  LogTest - This is a warning message
09:29:35.332 [main] ERROR LogTest - This is an error message
09:29:35.332 [main] FATAL LogTest - This is a fatal message

您应该能够以此为基础来修复自己的配置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Log4J2 - 如何设定referince我的新记录器

Log4j2 - 写入特定的记录器在XML声明

Log4j2通配符记录器名称

如何验证log4j2是否通过LMAX干扰器异步记录?

使用root以外的多个记录器时的log4j2类名称

使用pax记录的log4j2:无法使用来自StructuredDataMessage的值

从Docker容器将Log4j2日志写入远程服务器会出错

Log4j2记录到文件和控制台

如何刷新Log4J2中的异步记录器(使用中断器)

如何将查询语句记录到Neo4j服务器,可能吗?

Log4j直接记录到Elasticsearch服务器

无法使用log4j2获取所有记录器

如何定义Log4j2附加程序仅记录特定的命名记录器?

Log4j2:如何定义多个记录器

在本地运行时如何登录到控制台,在使用log4j2在服务器上运行时如何登录到滚动日志文件?

Log4j2无GC异步记录器:传递可变对象

编年史队列+ log4j2异步记录器

无法更改Apache Jena日志记录级别(使用log4J2)

如何在Log4j2中设置特定的记录器级别

log4j2异步记录器线程未终止

在控制台中禁用自定义记录器打印(Log4j2)

使用log4j2在Tomcat 6中记录服务器类

Log4J2同步记录器比混合异步/同步记录器更快

在Eclipse中打包成jar后,为什么log4j2无法登录到文件?

Log4j2同步记录

log4j2 配置记录到文件但不记录到控制台

为特定的 Log4j2 记录器设置属性

Log4j2:将错误级别记录到特定文件中

将 log4j2 配置文件配置为仅将错误记录到文件中