当前位置: 首页 > 知识库问答 >
问题:

Log4j2未正确登录到graylog服务器

侯英达
2023-03-14

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

以下是我迄今为止尝试过的:

Java

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"

它只向控制台记录信息,而不向服务器记录任何信息。

最后,也许是最奇怪的事情,如果我删除

Instant.now().toString()

从我的print语句中,无论状态如何(如果是TRACE或OFF),都不会将任何内容记录到服务器,但它仍然会记录到控制台。我以为这和我的GELF appender的图案布局有关,所以我改变了

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

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

但这并没有改变产量。。。

以下是我目前的依赖关系:

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

共有1个答案

陆俊智
2023-03-14

您似乎已经知道应该使用阈值过滤器来过滤级别WARN和控制台附加程序上的消息。

为不同的appender指定不同级别的正确方法是在

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

至于解决您的问题,这里有一个简单的示例程序和配置,它将INFO级别的消息输出到控制台,将所有日志消息输出到所有内容。记录和<代码>信息<代码>和最多到信息和最多。日志

日志测试。爪哇:

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

信息和行动。日志:

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

你应该能够用它作为基础来修复你自己的配置。

 类似资料:
  • 我正试图以这种方式使用passport local设置登录页面,但它不起作用: 节点服务器端: 角度客户端: 下面是mongoDB的用户行: {"_id": ObjectId("53df7b3b769827786b32dafe"),"标识符":"123","motDePasse":"123","__v": 0} 我想它来自本地战略。我不知道console.log.结果 有什么好主意吗? 请问怎么了

  • 本文向大家介绍Django 登录到Syslog服务,包括了Django 登录到Syslog服务的使用技巧和注意事项,需要的朋友参考一下 示例 可以将Django配置为将日志输出到本地或远程syslog服务。此配置使用python内置的SysLogHandler。            

  • 我们希望将所有java应用程序日志集中在Graylog服务器上。我们使用apache tomcat作为容器,使用log4j作为日志框架。log4j2.xml 伐木工人 日志详细信息 正如你们所见,我的应用程序与gray log server创建了一个套接字连接。但是我们在灰色日志服务器上没有看到任何日志 版本:tomcat-9.0.16.0 jdk-1.8.0_201-b09(64位) log4j

  • 我遇到了一个奇怪的问题,我不明白: 当我删除我的文件appender时,它会阻止我登录到我的服务器,即使文件appender不应该负责将任何内容登录到服务器;这项任务应该只属于我的GELF appender。 下面的代码可以很好地登录到我的控制台和服务器 JAVA XML 但是,当我删除这个 和 它不再向我的服务器记录任何内容。 文件附件和记录器不应该只登录到文件而不是服务器吗?如果是这样,为什么

  • 我们可以在远程Windows桌面中使用Java执行. bat文件吗?批处理文件检查系统服务,如果它关闭了,它应该Java本地机器中的程序进行通信,然后它应该再次执行并运行服务,并再次联系Java程序: 我的批处理文件当前只是检查服务是否启动,然后它会启动服务: 所以两个问题: 我们可以通过我的Java代码远程执行批处理文件吗: 如果可以的话: 该代码是否可以与基于特定条件的批处理文件通信(这里我的

  • 我正在尝试使用PHPMyAdmin登录MySQL服务器,但它不起作用, 我插入了true和,但它仍然不起作用,我不知道原因是什么 错误: mysql_real_connect():(HY000/1045):配置中定义的控制用户“root”@“localhost”(使用密码“是”)连接的访问被拒绝失败 无法进入PHPMyAdmin