简单来说,Log4j SyslogAppender是否支持MDC和NDC,因为输出是结构化数据,即使用协议的结构化数据功能?
此外,对于可以放入MDC并成功附加到日志中的内容是否有任何限制?
有没有办法通过slf4j传递适用于当前日志事件的更多信息?可以通过MDC存储和访问基于请求的信息,如用户,IP地址或应用程序名称.稍后我可以在布局或转换器中访问该信息,而不必解析日志消息.如果我使用基于JSON的格式,我有另一个字段,"appName":myApp如果我在plaint文本中使用log4j登录,我可以通过%{appName}符号访问它.有没有办法通过适用于一个日志事件的信息来实现这一目标?例如,我想传递一个异常ID(即使是我不拥有的异常).最好但仍然难看的解决方案是将id传递给MDC,记录异常并在之后删除它.有谁知道更好的解决方案?
我正在尝试使用 logback 的替换功能,以免在我的 MDC 日志模式中打印空值。 http://logback.qos.ch/manual/layouts.html#replace
我试图遵循这里的示例 http://logogin.blogspot.com/2013/04/logback-mdc-and-empty-values.html
90% 的时间我的日志模式都会打印
2014-08-28 11:30:27,014 emp:Peter org:IT Expense submitted
Run Code Online (Sandbox Code Playgroud)
打印时间的 5%
2014-08-28 11:30:27,014 emp: org: Cleanup jobs.
Run Code Online (Sandbox Code Playgroud)
这是因为在后一种情况下,不需要在 MDC 上提供 emp 和 org。对于这些情况,我希望 emp: 和 org: 根本不出现在日志行中。
2014-08-28 11:30:27,014 Cleanup jobs.
Run Code Online (Sandbox Code Playgroud)
这是我的变量和我正在使用的附加器。这个想法是,对于没有 emp 和 org 值的情况, mdcPattern 将解析为空字符串。
<variable scope="context" name="mdcPattern" value="%replace( emp:%X{empName} org:%X{orgName} ) {'[a-z]+:( |$)', ''}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d ${mdcPattern} %thread %-5level %logger{25} - %msg%n</pattern>
</encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)
但是替换正则表达式不起作用。我看到日志行为:
2014-08-28 11:30:27,014 emp: org: {'[a-z]+:( |$
Run Code Online (Sandbox Code Playgroud)
我的正则表达式有点弱。我似乎无法理解为什么替换模式会按原样出现在我的日志行中。任何帮助是极大的赞赏。
当使用 http 调用它们时,我想将从X-Request-IdNginx 接收到的信息传播到 k8s 中的其他服务。
现在,我正在使用请求过滤器来捕获该X-Request-Id标头并将其放入 MDC。
final String nginxRequestId = requestContext.getHeaderString("X-Request-Id");
if (nginxRequestId != null) {
MDC.put("infra_request", nginxRequestId);
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在 k8s 内调用服务 B 的端点(因此没有 Nginx 的阻碍),我想获取它X-Request-Id以将其放入请求的标头中。我在这里可以看到两个选项:
我可能会使用 MDC 来完成此操作,但我不确定这是否是最佳实践,或者是否存在一些问题/问题。
现在我正在使用这样的结构:Appender:
<RollingFile name="user.log" append="true" fileName="users/%MDC{USERNAME}.txt"
filePattern="users/archive/%MDC{USERNAME}-%d{MM-dd-yyyy}-%i.txt.gz">
<PatternLayout pattern="%-5p %d{MMMM-dd HH:mm:ss} %X: %c - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
</RollingFile>
Run Code Online (Sandbox Code Playgroud)
记录仪:
<appender-ref ref="user.log">
<ThreadContextMapFilter onMatch="ACCEPT" onMismatch="DENY" operator="or">
<KeyValuePair key="USERNAME" value="%X{USERNAME}"/>
<KeyValuePair key="IP" value="%X{IP}"/>
</ThreadContextMapFilter>
</appender-ref>
Run Code Online (Sandbox Code Playgroud)
但它不适用于MDC密钥.我如何在xml中使用MDC密钥来配置RollingFileAppender?
Logback MDC(映射诊断上下文)正在利用 threadLocal(据我所知),以便可以在同一线程执行的所有日志语句上访问它。
我的问题是,logback MDC 是否可以在非阻塞 IO 服务器端运行时(如 Netty 或 Undertow)中工作,因为它曾经在例如 tomcat 中工作?如果是,它是如何工作的,因为 Netty/Undertow 不像 tomcat 那样遵循每个请求一个线程。
我正在尝试在 MDC 中放置一个 traceID,以便我可以在 Splunk/ELK 等集中式日志记录系统中跨多个微服务/管道侦听器的一个事务跟踪中跟踪我的所有日志
我正在尝试为log4j生成支持MDC的纯文本文件找到日志查看器.我看过像Chainsaw,LogSaw,Otros这样的一些人,但他们似乎只支持NDC.
谁能指出我正确的方向?
Akka和Scala新手在这里,请随时编辑这个问题,以便清楚地表达我在Scala和Akka领域的意图.
在我展示代码片段之前,这是我想要解决的问题:我本质上想要为我的团队开发一个通用模块,以便在他们使用Akka actor开发应用程序时使用.我想让它们混合一个特性,它将在运行时扩展它们的接收功能,主要用于记录目的.我遇到了编译错误,我很快就会解释.
但首先,举一个简单的主要内容:
object Test extends App {
val system = ActorSystem("system")
val myActor = system.actorOf(Props(new MyActor), "myActor")
myActor ! "Hello world!"
}
Run Code Online (Sandbox Code Playgroud)
以下是团队成员可能在其应用程序中实现的actor的示例实现:
class MyActor extends Actor with ActorLogger {
override def receive: Receive = {
case msg => {
log.info("testing ...")
}
case _ => throw new RuntimeException("Runtime Ex")
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个如何为他们提供混合的共同特征的例子:
trait ActorLogger extends Actor {
val log: DiagnosticLoggingAdapter = Logging(this)
abstract override def receive: Receive = {
case msg: Any => {
if (msg.isInstanceOf[String]) { …Run Code Online (Sandbox Code Playgroud) 如何在GoLang中实现 MDC日志记录(Java)?
我需要在所有服务器日志中添加UUID,以便能够跟踪并发请求。
在我的spring-boot项目中,我使用 Logback-"Mapped Diagnostic Context" MDC来记录诊断上下文。
默认情况下不记录 MDC 数据(到控制台或文件)。
有没有办法仅使用应用程序属性将此 MDC 日志记录到输出日志中?
我是Golang的初学者,我想在Go中实现类似于Java中的映射诊断上下文(MDC)的东西,这是通过线程本地存储来实现的。但是,我发现很难在网上找到有关 Go 中全局线程本地存储的信息。
我有几个问题:
是否可以为Go中的每个goroutine创建一种全局线程本地存储来存储数据和上下文?
尝试实现全局线程局部存储是否被认为是 Go 中的反模式?
是否建议通过在 Go 中实现全局线程本地存储来替代传递上下文的方式?
假设您的选择是,您更喜欢使用传递上下文的方法,还是尝试实现线程本地存储来保存和管理上下文?
我找到了一些对此的参考,但我无法得出结论来决定是否实施它。
我正在使用 MDC Logger,除了一种情况外,它对我来说非常有用。无论我们在代码中的何处使用 CompletableFuture,对于创建的线程,MDC 数据都不会传递到下一个线程,因此日志失败。例如,在我使用以下代码段创建新线程的代码中。
CompletableFuture.runAsync(() -> getAcountDetails(user));
Run Code Online (Sandbox Code Playgroud)
日志结果如下
2019-04-29 11:44:13,690 INFO | /app/rest/controller/userdetails | f80fdc1f-8123-3932-a405-dda2dc2a80d5 |[http-nio-8182-exec-5] RestServiceExecutor: service:
2019-04-29 11:44:13,690 INFO | /app/rest/controller/userdetails | f80fdc1f-8123-3932-a405-dda2dc2a80d5 |[http-nio-8182-exec-5] RestServiceExecutor:
2019-04-29 11:44:13,779 INFO | /app/rest/controller/userdetails | f80fdc1f-8123-3932-a405-dda2dc2a80d5 |[http-nio-8182-exec-5] UserDetailsRepoImpl:
2019-04-29 11:44:13,950 INFO [ForkJoinPool.commonPool-worker-3] RestServiceExecutor: header:
2019-04-29 11:44:13,950 INFO [ForkJoinPool.commonPool-worker-3] RestServiceExecutor: service:
2019-04-29 11:44:14,012 INFO [ForkJoinPool.commonPool-worker-3] CommonMasterDataServiceImpl: Cache: Retrieving Config Data details.
2019-04-29 11:44:14,028 INFO [ForkJoinPool.commonPool-worker-3] CommonMasterDataServiceImpl: Cache: Retrieved Config Data details : 1
2019-04-29 11:44:14,028 INFO [ForkJoinPool.commonPool-worker-3] CommonMasterDataServiceImpl: Cache: Retrieving Config Data …Run Code Online (Sandbox Code Playgroud) mdc ×12
java ×5
logback ×3
logging ×3
slf4j ×3
spring-boot ×3
go ×2
log4j ×2
ndc ×2
akka ×1
dropwizard ×1
goroutine ×1
interceptor ×1
log4j2 ×1
netty ×1
regex ×1
scala ×1
syslog ×1
thread-local ×1
viewer ×1