ch.qos.logback.classic.encoder.PatternLayoutEncoder
public void start() { if(pattern == null || pattern.length() == 0) { addError("Empty or null pattern."); return; } try { Parser<E> p = new Parser<E>(pattern); if (getContext() != null) { p.setContext(getContext()); } Node t = p.parse(); this.head = p.compile(t, getEffectiveConverterMap()); if (postCompileProcessor != null) { postCompileProcessor.process(head); } ConverterUtil.setContextForConverters(getContext(), head); ConverterUtil.startConverters(this.head); super.start(); } catch (ScanException sce) { StatusManager sm = getContext().getStatusManager(); sm.add(new ErrorStatus("Failed to parse pattern "" + getPattern() + "".", this, sce)); } }
<pattern> </pattern> 内容结构
... + Token.PERCENT + Token.FORMAT_MODIFIER + Token.SIMPLE_KEYWORD + Token.OPTION + ...
例如:
%-5level
%logger{36}
... 代表 任意多个Token.LITERAL 或者 自身
oken.PERCENT 是 %
Token.FORMAT_MODIFIER 必须是数字,正数代表当前位置(即文本左侧)填充空格,负数代表当前位置相反方向填充空格,数值代表“填充空格至N个字符”,字符串本身长度大于等于N时,不需要填充。
Token.SIMPLE_KEYWORD 是PatternLayout 中定义的字符(对应各自的Converter类)
Token.OPTION 是由第一个“{”开启,第一个“}”结束,例如:
%logger{36}} 中的第二个“}”视为 Token.LITERAL 普通文本
传递多个参数用英文“,”分割,例如:
{opt1,opt2}
Converter 详解
http://logback.qos.ch/manual/layouts.html#conversionWord
1. d/date
DateConverter.class
%date{} yyyy-MM-dd HH:mm:ss,SSS
%date{ISO8601} yyyy-MM-dd HH:mm:ss,SSS
%date{SimpleDateFormat} SimpleDateFormat
2. r/relative
3. level/le/p
级别名称 TRACE DEBUG INFO WARN ERROR
4. t/thread
线程名称
Thread.currentThread().getName();
5. lo/logger/c
loggerName
6. m/msg/message
String s = "sdfsdf"; int i = 111; double d = 22.0; Date date = new Date(); logger.trace("It is trace{}&{}&{}&{}",s,i,d,date);
打印:
It is tracesdfsdf&111&22.0&Wed Sep 09 09:35:55 CST 2015
7. C/class
logger 位于的类名
8. M/method
打印本次log的直接方法名
9. L/line
new Throwable().getStackTrace()[1].getLineNumber();
logger调用打印方法的位置(.java文件中)
10.F/file
该logger位于哪个.java文件
11. X/mdc
Mapped Diagnostic Contexts (MDC)
映射 诊断 上下文
12. 等等