我在我的项目中使用 log4j2,比如控制塔。并使用一些自定义日志附加程序来发送 websocket 事件、snmp 陷阱事件、插入到数据库。
我想向自定义日志附加程序发送更多信息,例如错误代码、源节点、snmp Oid、作业 ID 等...
使用 log4j2,有没有办法向日志附加程序发送更多信息?
像这样:
记录部分:logger.info(customObject);
snmp追加器:从customObject获取oid,从customObject获取消息
websocketappender:从customObject获取jobid,从customObject获取消息
数据库appender:从customObject获取错误代码,从customObject获取消息
抱歉我的英语不好。任何帮助将不胜感激。
我在 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:似乎 …
我使用log4j 2.9
我在 log4j2.xml 中配置了文件附加程序。
例如 :
all_log_appender, device_appender, sql_appender
Run Code Online (Sandbox Code Playgroud)
所有附加程序都登录不同的文件。
在运行时选择我的附加程序以便决定在哪里(在哪个文件中)记录的正确方法是什么?
老实说,我在文档中找不到示例。我还尝试扩展 Logger 类,但据我了解, 扩展 log4j2 记录器类是不正确的,因为“某些布局要求 Log4j 遍历堆栈跟踪以报告记录器代码中的哪个类和行被调用”
我找不到任何如何在运行时选择附加程序的示例。
你能给我一个简单的例子吗?
我将创建我的第一个 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) 我已经安装了 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) 我在一个应用程序中使用 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) 我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文件已在文件系统上创建,但它是空的。我尝试了所有日志级别。
我的应用程序使用 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 个问题:
我的 lambda 在 Java8 下运行了几年,我刚刚将其更新到 Java 11。它立即崩溃了,给了我这样的错误:
\nCaused 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\nRun Code Online (Sandbox Code Playgroud)\n所讨论的类并不是特别令人兴奋,并且具有在我的类中常见的简单静态初始化:
\npublic 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) 我正在尝试将 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) log4j2 ×10
java ×9
logging ×5
spring-boot ×3
slf4j ×2
apache-kafka ×1
aws-lambda ×1
helidon ×1
log4j ×1
logback ×1
maven ×1
spring ×1
testing ×1