- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下 Log4J2 配置 XML:
<Routing name="myAppender">
<Routes pattern="$${ctx:workId}">
<Route>
<File fileName="${my-path}/sites/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log" name="myAppender-${ctx:workId}">
<MarkerFilter marker="TELEMETRIC" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>[%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X%m%n</Pattern>
</PatternLayout>
</File>
</Route>
</Routes>
</Routing>
<Async name="Async">
<AppenderRef ref="myAppender" level="info"/>
</Async>
但是,每当 log4j2 appender 写入文件时,它在写入指定文件路径时不会使用正确的 ${ctx:employeeId}
字符串。
log4j2 appender 第一次写入文件时,它会写入由 ${ctx:employeeId}
指定的正确文件路径。但是,每当有关具有另一个 Id 的员工的信息被放入线程上下文时,appender 仍会记录到旧文件路径。
例如,appender 第一次记录它写入正确的路径:
D:/example/logs/sites/1/2015-08-22/2/emp.log
但是当记录器正在记录下一个员工 ID(使用新的 ThreadContext)时,它仍在登录
D:/example/logs/sites/1/2015-08-22/2/emp.log
而不是例如:
D:/example/logs/sites/1/2015-08-22/3/emp.log
(注意员工 Id 不同。)
在日志输出模式中,我记录了当前的 employeeId [$${ctx:employeeId}]
,以及当前线程上下文 %X
中的内容.输出显示正在使用正确的 employeeId 并且在 ThreadContext 中,但附加程序未记录到该 ${ctx:employeeId}
文件路径。
有谁知道我是否遗漏了什么?或者如果我做错了什么?或者这可能是 Log4j2 的错误?感谢您的帮助!
最佳答案
好吧,我知道这个答案是在问题被提出很久之后才出现的,但如果这仍然对您或其他人有帮助,我会分享我的发现。
首先,我无法重现问题,但我确实有实现您想要的代码,所以我将分享我的代码,希望通过查看它您可以确定哪里出错了.如果不是,请提供 Minimal, Complete, and Verifiable Example这样任何试图帮助您的人都可以重现该问题。
这是我的工作代码:
package pkg;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.ThreadContext;
public class Log4j2DiffFilePerCtxVarMain {
private static final Marker TELEMETRIC = MarkerManager.getMarker("TELEMETRIC");
public static void main(String[] args){
Logger log = LogManager.getLogger();
ThreadContext.put("workId", "mainWorkId");
ThreadContext.put("employeeId", "mainEmployeeId");
log.info(TELEMETRIC, "Hey here's some info log from main!");
Thread t1 = new Thread(new Runnable(){
public void run(){
Logger log = LogManager.getLogger();
ThreadContext.put("workId", "thread1WorkId");
ThreadContext.put("employeeId", "thread1EmployeeId");
log.info(TELEMETRIC, "Hey here's some info log from thread1!");
}
});
t1.start();
}
}
这是 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Routing name="myAppender">
<Routes pattern="$${ctx:workId}">
<Route>
<File
fileName="logs/${ctx:workId}/${date:yyyy-MM-dd}/${ctx:employeeId}/emp.log"
name="myAppender-${ctx:workId}">
<MarkerFilter marker="TELEMETRIC" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout>
<Pattern>[%date{ISO8601}][%-5level][%logger{1.}][%marker][$${ctx:employeeId}] %X %m%n</Pattern>
</PatternLayout>
</File>
</Route>
</Routes>
</Routing>
<Async name="Async">
<AppenderRef ref="myAppender" level="info" />
</Async>
</Appenders>
<Loggers>
<Root level="trace">
<appender-ref ref="Async" />
</Root>
</Loggers>
</Configuration>
当我使用此 log4j2.xml 运行此代码时,我看到以下结果:
第一个日志包含这个:
[2017-04-13T20:42:49,814][INFO ][p.Log4j2DiffFilePerCtxVarMain][TELEMETRIC][mainEmployeeId] {employeeId=mainEmployeeId, workId=mainWorkId} Hey here's some info log from main!
第二个日志包含这个:
[2017-04-13T20:42:49,822][INFO ][p.Log4j2DiffFilePerCtxVarMain$1][TELEMETRIC][thread1EmployeeId] {employeeId=thread1EmployeeId, workId=thread1WorkId} Hey here's some info log from thread1!
希望这对您有所帮助!
关于java - Log4J2 appender 没有记录到 ThreadContext 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32158882/
Racket 的 pict , 有几个 combinators for combining other pictures .这些文档包含一个很好的表格,说明其 *-append 组合器的工作方式: 这
我看过 Insert content into iFrame和他们的 fiddle http://jsfiddle.net/8VP4y/3/提出以下我遇到问题的代码。 我已经为下面的问题创建了一个 j
我有一个显示非常奇怪结果的微基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations =
我想知道是否有人可以回答我使用 StringBuilder 对象在 java 中执行这些语句中的哪一个会更好: 使用 .append(string1 + string 2) 对比 .append(st
假设我有两个相同类型的流。是否可以将一个流 append 到另一个流而无需事先将它们转换为列表? 例子: Stream ms = ...; Stream ns = ...; return ms.app
我有以下有效的 jQuery 代码,但它让我思考是否可以对正在 append 的内容执行 append 操作,而无需指定我想要 append 的内容。 append().append() 并没有达到目
这是为了显示诊断页面的检查。我有一个 .append(not_ok) 但当 swf 文件加载 100% 时,我想删除 not_ok 附加,然后添加一个 .append(ok)。 function ca
x = [[1,2],[2,3],[10,1],[10,10]] def duplicatingRows(x, l): severity = x[l][1] if severity =
我有一个列表,我正在尝试将数据注入(inject)其中。列表如下所示 data2 = ['TECH2_HELP', 'TECH2_1507', 'TECH2_1189', 'TECH2_4081',
为了有效地进行一些 DOM 操作,我分离了一个元素。在这个过程中,我遇到了一个有趣的情况: var $holder = $("#d"); var $wrapper = $("").css("borde
我遇到了图片在移动设备上加载速度不够快的问题。我的元素有一个图像和一个按钮。单击该按钮时,图像向下滑动,另一幅图像从顶部滑动以取代它。这是代码 html CSS .moveF
我正在编写一个包含 10 个遗愿 list 的简单哈希表。使用内置的 hash() 计算索引,然后对表大小取模。但是,当我尝试将该对象 append 到该索引处的存储桶列表时,它会 append 到每
我是 LISP 的新手,我正在尝试处理类的 cond 语句。目前,我正在尝试检查传递的值是否为列表,如果是,则将字母 d append 到列表中。 这是我的代码: (defun test(L) (li
我正在使用 Jquery 将数据 append 到 div。但是,append 语句之后页面上没有显示任何内容。 我尝试使用 $(window).load 来确保页面已加载,但这仍然不起作用。 HTM
我有以下代码; function SetupDropdowns() { var PrevType; dropdown1 = document.getElemen
我想在 smarty 中创建一个数组并在其中执行 append 功能!就像我在 smarty 模板中声明一个变量(如 {assign var=sizearr value=''} )然后我想在循环中向其
请考虑以下代码片段: var ul = $(".list_b").find("li").remove().end(); $.each(Sites, functi
我的日志记录配置中有两个 appenders。其中之一在 ERROR 事件上发送电子邮件。 一个类,我无法控制,垃圾邮件 ERROR 消息。所以我仍然想要那些消息,但不是在两个 appenders 中
我正在尝试制作 editText,我要在其中插入一些文本。在每三个字符之后,我想插入破折号。 例子: 类型:123 结果:123- 现在当光标在破折号后面并且你按下删除键时,我想删除破折号和破折号
当我尝试 append 简单的“hello”时,它会被 append ,但很快就会自动删除。仅当我在下面给出的表单中使用它时,才会出现此问题,如果删除该表单,则不会出现问题,并且 hello 会正确
我是一名优秀的程序员,十分优秀!