[英]Math operations inside log4j2.xml
我想在log4j2.xml
中添加自定義模式。 在那里我需要做一些數學運算,比如日志 output 的multiplication (*)
、 modulo(%)
。
例如,假設我得到 Unix 時間(以秒為單位)作為日志 output。如果我需要multiply it by 1000
,我應該怎么做?
我嘗試了不同的方法來做到這一點。 但它將數學運算輸出為純文本。
這是我在log4j2.xml
中使用的示例模式。 我在那里嘗試了不同的乘法方式。
<Console name="stdout" target="SYSTEM_OUT">
<PatternLayout>
<pattern>%d{UNIX} %{1000*%d{UNIX}} (%d{UNIX})*1000 1000*(%d{UNIX}) %n</pattern>
</PatternLayout>
</Console>
它輸出純文本值。 不是乘法后的值。
1645687086 %{1000*1645687086} (1645687086)*1000 1000*(1645687086)
那么有沒有一種方法可以讓我在 xml 標簽本身內部進行乘法運算(*)和取模運算(%)?
您的問題可能是經典的XY 問題。
如果您想從 Epoch 打印以毫秒為單位的時間戳,請使用%d{UNIX_MILLIS}
。
另一方面,如果您正在尋找執行算術替換的PatternConverter
,則沒有。 可以在文檔中找到可用模式的列表。
然而 Log4j 2.x 具有很強的可擴展性,您可以編寫和注冊自己的模式轉換器。
編輯:要創建一個新的PatternConverter
,您可以從這樣的事情開始:
@Plugin(name = "math", category = "Converter")
@ConverterKeys({ "math" })
public class MathPatternConverter extends LogEventPatternConverter {
private final List<PatternFormatter> patterns;
public static MathPatternConverter newInstance(Configuration config, String[] options) {
if (options.length < 1) {
LOGGER.error("Incorrect number of options. Expected at least 1, received " + options.length);
return null;
}
if (options[0] == null) {
LOGGER.error("No pattern supplied.");
return null;
}
final PatternParser parser = PatternLayout.createPatternParser(config);
return new MathPatternConverter(parser.parse(options[0]));
}
protected MathPatternConverter(List<PatternFormatter> patterns) {
super("math", "math");
this.patterns = patterns;
}
@Override
public void format(LogEvent event, StringBuilder toAppendTo) {
final StringBuilder sb = new StringBuilder();
patterns.stream().forEach(f -> f.format(event, sb));
// sb contains a mathematical expression. You need to evaluate it.
... put your code here ...
}
}
並將其用作%math{10 + 20}
。 要使用 Log4j 2.x 注冊此插件,請按照插件文檔中的說明進行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.