log4j - log4j 在模式中设置类和方法摘要长度
问题描述
目前我有这样的:
%d{HH:mm:ss.SSS} | %-5.5p | %-15.15t | %-30.70C.%-5.20M:%-3.5L | %msg%n
但这使得 full.class.Name.method:line 的长度不同 - 是否可以制作 calss.method:line 的固定长度?
我喜欢
%-60.60CML(但这当然行不通)
我想让 calss.method.line 在所有日志行上具有相同的长度。(所以实际消息在同一个地方开始)
是否可以 ?
换句话说,是否可以使用一个转换说明符格式化多个转换字符?看着
https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
每个转换说明符都以百分号 (%) 开头,后跟可选的格式修饰符和转换字符。转换字符指定数据类型
模式解析器在读取转换字符时知道何时到达转换说明符的末尾。
现在写的是多个转换字符,所以也许根本不可能?
正如@Remko Popma 解释的那样,我想要的现在不可能:
不,每个修饰符都适用于一次转换。但是 Log4j 可以添加一个新的转换器,这意味着你想要什么。您可以在邮件列表或问题跟踪器上提出这样的新转换器。
解决方案
基于@Remko-Popma 的帮助
https://issues.apache.org/jira/browse/LOG4J2-2339
以下是对我有用的:
<property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5.5p | %-15.15t | %-70.70CML | %-10.70X | %msg%n</property>
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.NamePatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;
@Plugin(name = "ClassMethodLinePatternConverter", category = PatternConverter.CATEGORY)
@ConverterKeys({"CML", "classmethodline"})
public class ClassMethodLinePatternConverter extends NamePatternConverter {
private static final String NA = "?";
private ClassMethodLinePatternConverter(
final String[] options) {
super("Class Name", "class name", options);
}
public static ClassMethodLinePatternConverter newInstance(final String[] options) {
return new ClassMethodLinePatternConverter(options);
}
/**
* Format a logging event.
*
* @param event event to format.
* @param toAppendTo string buffer to which class name, method name and line will be appended.
*/
@Override
public void format(final LogEvent event, final StringBuilder toAppendTo) {
final StackTraceElement element = event.getSource();
if (element == null) {
toAppendTo.append(NA);
} else {
toAppendTo.append(element.getClassName()).append(".").append(element.getMethodName()).append(":").append(element.getLineNumber());
}
}
}
推荐阅读
- spring - 如果处理程序中发生异常,则无法将消息路由到标头中定义的错误通道
- python - 如何修复“字典对象没有属性键”
- django - 如果在 Django 中间件中检测到未知 GET,如何阻止黑客访问
- javascript - 来自父类对象的javascript构造函数
- visual-studio - 意外关闭文档窗口 Microsoft Visual Studio 2017
- javascript - 何时使用 res.locals 发送响应?
- python-3.x - 如何可视化pdf文件模式,因为我想解析它?
- vue.js - 从热模块更换中排除软件包
- go - 将结构接口转换为相同的结构
- javascript - 为什么 mocha 中事务的测试结果是错误的,但在 REST 测试中可以正常工作?