Springwebflux
提供处理程序,它接受ServerRequest
并且是我们实现代码的地方。根据下面的文章,Spring有一个logid
概念,它似乎是我所说的uniqueRequestId
。当抛出异常时,框架将通过AbstracTerrorWebExceptionHandler
/ServerWebExchange
将LogID
放入日志条目。我的情况涉及到有许多服务相互调用并共享一个uniqueRequestId
。因此,我们不希望Spring生成这个ID,而是希望通过HTTP请求头(例如x-request-id)来设置logid
。我的理由是,一个服务的日志可以与另一个服务的日志相关。我找不到关于如何实现这一点的文章。
一些相关的背景:我管理了一个90%的替代解决方案,通过将UniqueRequestId
设置到MDC(ThreadLocal
)中,然后基于此特性通过反应链传递UniqueRequestId
到日志中(https://projectreactor.io/docs/core/release/reference/#context->请参见“Adding a Context to a reactive sequence”)。这适用于在我的反应序列+处理程序中处理的代码,但如果我的代码抛出exception
或mono.error(...)
,那么似乎Spring WebFlux框架将日志分派到异步线程,因此MDC和上下文都丢失了。因此,我希望通过将我的UniqueRequestId
插入LogID
来解决最后的问题。
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-logging-id
Spring:Boot:2.4.1,Web+WebFlux:5.3.2
您是否希望使用uniqueRequestId
为自己实现相关部分?
如果您只希望能够跟踪服务上或跨服务的处理,那么您应该查看跟踪
解决方案,这些解决方案通常可以在应用程序性能监视
库中找到。
我认为您可以使用spring-cloud-sleuth
,只使用日志相关性(https://cloud.spring.io/spring-cloud-sleuth/reference/html/#only-sleuth-log-correlation)
Sleuth支持reactor(spring webflux),它会自动添加一些数据到日志中
trace.id
跟踪
表示可能发生在多个服务上的操作或数据流。对我来说,这是您正在寻找的,该跟踪被发送到其他服务,以便它们在日志中重用它。允许您通过多个服务跟踪特定呼叫。transaction.id
事务
表示同一服务内的操作或数据流。例如(下面的代码不起作用,它只是给你一个想法):
public class serviceA() {
private final ServiceBClient serviceBClient;
@Get
public Flux<Cat> getSomething() {
log.info('Calling serviceB');
return serviceBClient
.listAllCats()
.then(() -> { log.info('Called serviceB') });
}
}
public class serviceB() {
private final CatRepository catRepository;
@Get
public Flux<Cat> listCats() {
log.info('Asking for cats');
return catRepository.listAll()
.doOnSuccess(() -> { log.info('Request success!') })
}
}
[INFO] .... Calling serviceB, trace.id=1321313543121, transaction.id=123546
[INFO] .... Called serviceB, trace.id=1321313543121, transaction.id=123546
[INFO] .... Asking for cats, trace.id=1321313543121, transaction.id=224465
[INFO] .... Called serviceB, trace.id=1321313543121, transaction.id=224465
Sleuth还应该将trace.id添加到错误日志中
问题内容: 我需要与执行日志记录使用。 我在没有基本示例的情况下实现了日志记录? 也有小的样本在不使用日志的情况下使用(只是制作了)? 我不知道如何整合它? 问题答案: Spring使我们使用AOP变得非常容易。这是一个简单的日志记录示例: 然后只需配置你的applicationContext.xml(或等效文件): 你会在MyLogger类中注意到我@After在方法上方指定的内容。这被称为建议
从docker容器中将结构化日志写入journald的最佳方式是什么? 例如,我有一个使用sd_journal_send而不是更改应用程序的应用程序,我尝试通过 -v/var/log/systemd/journal:/var/log/systemd/journal docker journald输出日志记录选项有哪些限制?它似乎不支持应用程序编写不仅仅是消息字段。 -- 所以我发现我需要 C程序可
问题内容: 我想将“跟踪”消息添加到我的所有公共方法中,如下所示: 现在,我想使用AOP(和字节码检测)将所有这些自动添加到我的方法中。我在想。是否有意义?您知道任何开放源代码吗? 问题答案: 我创建了一个简单的方面来捕获公共方法的执行。该AspectJ代码的核心是切入点定义: 在这里,我们将捕获任何包,任何类,具有任意数量的参数,具有任何返回类型的所有公共方法。 建议执行可以在下面的代码段中可视
null
我正在尝试使用PostSharp和multicastAttribute实现日志记录。使用PostSharp诊断库中的日志功能。 我有一个GlboalAspects。启动项目目录中的cs。内容如下。 右键单击我的项目并选择属性,默认命名空间是“alp_generator” 我不知道“PostSharp.Patterns.Diagnostics.LogAttribute”是否正确。 我根本没有日志记录
问题内容: 我有一个要登录的Maven&Spring应用程序。我热衷于使用SLF4J。 我想将所有配置文件放入包含log4j.xml的目录{classpath} / config中,然后使用spring bean进行初始化。 例如 但是,我得到此警告,没有日志记录。 log4j:WARN找不到记录器的附加程序(org.springframework.context.support.ClassPat