标签: log4j2

如何使用 log4j2 向自定义附加程序发送一些额外信息(对象)?

我在我的项目中使用 log4j2,比如控制塔。并使用一些自定义日志附加程序来发送 websocket 事件、snmp 陷阱事件、插入到数据库。

我想向自定义日志附加程序发送更多信息,例如错误代码、源节点、snmp Oid、作业 ID 等...

使用 log4j2,有没有办法向日志附加程序发送更多信息?

像这样:

记录部分:logger.info(customObject);

snmp追加器:从customObject获取oid,从customObject获取消息

websocketappender:从customObject获取jobid,从customObject获取消息

数据库appender:从customObject获取错误代码,从customObject获取消息

抱歉我的英语不好。任何帮助将不胜感激。

java logging log4j2

1
推荐指数
1
解决办法
1475
查看次数

SpringBoot 测试模块不会在正确的类路径中搜索 log4j2 配置

我在 SpringBoot 项目中运行测试时遇到了一些问题。

项目结构如下:

项目结构图

我可以毫无问题地启动 resourceService,但是如果我什至尝试运行 SpringBoot 项目的标准测试......

package com.pcsystem;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ResourceserviceApplicationTests {

    @Test
    public void contextLoads() {
    }

}
Run Code Online (Sandbox Code Playgroud)

程序响应此错误:

Logging system failed to initialize using configuration from 'resourceservice/log4j2.xml'
java.io.FileNotFoundException: C:\java\IntelliJ_projects\baseprojectoauth2\resourceservice\resourceservice\log4j2.xml (Unable to find the specified classpath)
Run Code Online (Sandbox Code Playgroud)

所以我试图改变 application.properties 的特定属性

logging.config=resourceservice/log4j2.xml
Run Code Online (Sandbox Code Playgroud)

logging.config=log4j2.xml
Run Code Online (Sandbox Code Playgroud)

更改后,我注意到 resourceserviceApplication 将无法启动,因为它找不到 log4j2.xml:

Logging system failed to initialize using configuration from 'log4j2.xml'
java.io.FileNotFoundException: C:\java\IntelliJ_projects\baseprojectoauth2\log4j2.xml (Unable to find the specified classpath)
Run Code Online (Sandbox Code Playgroud)

我尝试通过多种方式解决问题并进行了大量研究,但目前我仍然被困在这里。

任何的想法?

ps:似乎 …

java testing logging log4j2 spring-boot

1
推荐指数
1
解决办法
7497
查看次数

如何在运行时选择 log4j2 Appender

我使用log4j 2.9

我在 log4j2.xml 中配置了文件附加程序。

例如 :

 all_log_appender, device_appender, sql_appender
Run Code Online (Sandbox Code Playgroud)

所有附加程序都登录不同的文件。

在运行时选择我的附加程序以便决定在哪里(在哪个文件中)记录的正确方法是什么?

老实说,我在文档中找不到示例。我还尝试扩展 Logger 类,但据我了解, 扩展 log4j2 记录器类是不正确的,因为“某些布局要求 Log4j 遍历堆栈跟踪以报告记录器代码中的哪个类和行被调用”

我找不到任何如何在运行时选择附加程序的示例。

你能给我一个简单的例子吗?

java logging log4j log4j2

1
推荐指数
1
解决办法
2275
查看次数

Spring Boot slf4j + log4j2 日志记录被 logback 依赖阻止

我将创建我的第一个 spring boot 应用程序,我正在创建一个类似 helloworld 的应用程序来测试一些功能。其中之一是通过 slf4j 外观进行日志记录。

我想将 log4j2 与 log4j2.json 配置文件一起使用。不幸的是 slf4j 也发现了一个 logback-classic 依赖并开始使用它。查看我的依赖项,只有 spring-boot-starter-parent 依赖于 logback,但 maven 排除语法在父 pom 上不起作用。

我使用本教程使用 slf4j 设置 log4j2。这是我的整个 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.helloworld</groupId>
<artifactId>helloworld</artifactId>
<version>0.1.0</version>

<name>helloworld</name>

    <parent>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

        <!-- Database -->

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
        </dependency> …
Run Code Online (Sandbox Code Playgroud)

logback slf4j maven log4j2 spring-boot

1
推荐指数
1
解决办法
5555
查看次数

Log4J2不输出调试信息

我已经安装了 log4j2 并设置了属性文件,但无法将 log4j2 输出调试信息发送到控制台。我怀疑我的配置有问题。

这是我的源代码:

package com.smt.trimble.poc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

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

public class NMEAReader {

      private static final String hostName = "192.168.0.2";
      private static final int portNumber = 5017;
      private static Socket nmeaSocket;

      private static final Logger logger = LogManager.getLogger(NMEAReader.class);


      public static void main(String[] args) {

        try {

        nmeaSocket = new Socket(hostName, portNumber);
        logger.debug("Creating socket");
        PrintWriter out = new PrintWriter(nmeaSocket.getOutputStream(), true);
        BufferedReader in = 
          new BufferedReader(new InputStreamReader(nmeaSocket.getInputStream()));

        String userInput;

        while (true) …
Run Code Online (Sandbox Code Playgroud)

java log4j2

1
推荐指数
1
解决办法
8472
查看次数

如何将日志时间戳转换为 log4j2 中的特定时区?

我在一个应用程序中使用 log4j2 进行日志记录,并且该应用程序部署在从伦敦、东京、纽约等地运行的服务器中。

我稍后汇总日志以供分析。为了使其统一,我想将日志的时间戳转换为单个时区,例如 GMT 或 EST。我怎样才能在 log4j2 中做到这一点?

<Appenders>
    <RollingRandomAccessFile name="RandomAccessFileOutput" fileName="${sys:host.log}" 
        filePattern="${sys:host.log}.%d{yyyy-MM-dd-hh-mm-ss}.gz">
        <PatternLayout pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) - %m%n"/>
        <Policies>
            <SizeBasedTriggeringPolicy size="10 MB"/>
            <CronTriggeringPolicy schedule="0 0 0 * * ?"/>
        </Policies>
    </RollingRandomAccessFile>
    <File name="File" fileName="console.log" append="false" >
        <PatternLayout pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) - %m%n"/>
    </File>
    <Console name="STDOUT" target="SYSTEM_OUT">
        <PatternLayout pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>

</Appenders>
Run Code Online (Sandbox Code Playgroud)

java logging log4j2

1
推荐指数
1
解决办法
2543
查看次数

Log4j2 记录到文件和控制台

Log4j2 2.11.1在我的Java项目中使用它来登录到控制台和文本文件。我将其初始化如下:

private static Logger logger = LogManager.getLogger(readAllLinks.class);
Run Code Online (Sandbox Code Playgroud)

我创建了resources/log4j2.properties 文件来设置首选项。

name=PropertiesConfig
property.filename = logs
appenders = console, file
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=${filename}/propertieslogs.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
loggers=file
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
Run Code Online (Sandbox Code Playgroud)

/logs/propertieslogs.log文件已在文件系统上创建,但它是空的。我尝试了所有日志级别。

java log4j2

1
推荐指数
1
解决办法
4102
查看次数

登录 json 文件

我的应用程序使用 Angular 7 和 Spring Boot 2 运行。每次用户与应用程序交互(单击某些按钮或链接)时,我都需要在 json 文件中存储一些数据。json 应如下所示(仅作为示例):

[
 "event": {

   userid : 1
   ipAddress : x.x.x.x
   lastConnectionDateTime : ...,
   action : "click on link 1"
 },
 "event": {

   userid : 2
   ipAddress : y.y.y.y
   lastConnectionDateTime : ...,
   action : "click on button THE_BUTTON" 
 },
 ...
]
Run Code Online (Sandbox Code Playgroud)

我看到两个选项:

  • 使用异步调用 Web 服务的角度拦截器手动执行此操作。然后,Web 服务将调用异步 spring 服务,将数据附加到 json 文件中。使用这个解决方案,我将不得不擦除自己一周以上的数据,这感觉就像重新造轮子。

  • 使用 log4j2 或 logback 等日志库。在 log4j2 中,有 JsonLayout 可以帮助我使用包含“KeyValuePairs”列表的“loggerFields”来完成此操作,以将自定义字段放入我的 json 中,但我有 3 个问题:

    • 如何将我自己的值放入不是预定义的 %c、%t...等中。也许是这样的: Logger.info("event", "userid", "1", "ipAddress", "xxxx"...etc); ? …

java logging spring log4j2 spring-boot

1
推荐指数
1
解决办法
7112
查看次数

AWS Lambda 使用多版本 JAR 中的错​​误类文件?

我的 lambda 在 Java8 下运行了几年,我刚刚将其更新到 Java 11。它立即崩溃了,给了我这样的错误:

\n
Caused by: java.lang.ExceptionInInitializerError\n    at com.mycompany.rest.providers.JsonProvider.writeTo(JsonProvider.java:80)\n    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:242)\n    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)\n    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)\n    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1116)\n    at org.glassfish.jersey.client.ClientRequest.doWriteEntity(ClientRequest.java:461)\n    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:443)\n    at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:367)\n    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:265)\n    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:297)\n    ... 15 more\nCaused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.\n    at org.apache.logging.log4j.LogManager.callerClass(LogManager.java:571)\n    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:596)\n    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:583)\n    at com.mycompany.rest.util.NonClosingOutputStream.<clinit>(NonClosingOutputStream.java:11)\n    ... 25 more\n
Run Code Online (Sandbox Code Playgroud)\n

所讨论的类并不是特别令人兴奋,并且具有在我的类中常见的简单静态初始化:

\n
public class NonClosingOutputStream extends ProxyOutputStream {\n    private static final Logger log = LogManager.getLogger(); // Line 11\n\n    public NonClosingOutputStream(final OutputStream proxy) …
Run Code Online (Sandbox Code Playgroud)

java log4j2 aws-lambda multi-release-jar

1
推荐指数
1
解决办法
2860
查看次数

Helidon MP:如何将 slf4j 日志消息发送到 Kafka 代理?

我正在尝试将 Helidon MP 应用程序中的 slf4j 日志消息发送到在端口 9092 上运行的 Kafka 服务器。我有以下类作为示例:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Service {

  private final ConfigProvider configProvider;

  @Inject
  public Service(ConfigProvider configProvider) {
    this.configProvider = configProvider;
  }

  public String getString() {
    String msg = String.format("%s %s !", configProvider.getString());
    log.info("Entered getString() method");
    return msg;
  }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个logging.xml文件,它将Appender指定为KafkaAppender:

<Configuration>
    <Appenders>
        <Kafka name="KafkaAppender" topic="app-logs"
               syncSend="false">
            <Property name="bootstrap.servers"
                      value="localhost:9092"/>
        </Kafka>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.kafka" level="WARN"/> <!-- avoid recursive logging -->
        <Root level="INFO">
            <AppenderRef ref="KafkaAppender"/>
        </Root>
    </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该应用程序时,出现以下错误:

2022-11-28 14:23:17,358 main …
Run Code Online (Sandbox Code Playgroud)

java slf4j apache-kafka log4j2 helidon

1
推荐指数
1
解决办法
477
查看次数