目前我还是喜欢:
%d {HH:mm:ss.SSS} | %-5.5p | %-15.15t | %-30.70C。% - 5.20M:% - 3.5L | %MSG%N
但是这使得full.class.Name.method:不同长度的行 - 是否可以制作calss.method:固定长度的行?
我想要......
% - 60.60CML(但这当然不起作用)
我想让calss.method.line在所有日志行上具有相同的长度。 (以便实际消息在同一个地方开始)
有可能吗?
其他人说,是否可以使用一个转换说明符格式化多个转换字符?看着
https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
每个转化说明符都以百分号(%)开头,而且是 其次是可选的格式修饰符和转换字符 er 。该 转换标识 er 指定数据类型
模式解析器在读取转换标识 er 时知道它何时到达转换说明符的末尾。
现在写的是关于多个转换字符,所以也许这根本不可能?
正如@Remko Popma解释的那样,我现在想要的是不可能的:
不,每个修饰符适用于一次转换。但Log4j可以添加一个新的转换器,意味着你想要的。您可以在邮件列表或问题跟踪器上提出这样的新转换器。
答案 0 :(得分:0)
基于@ 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());
}
}
}