42 this.fullInfo = s.substring(ibegin, iend);
对于通过字符串查找到的fullInfo值,在获取其他单个值时还需要做相应的字符串解析:
className:
1 // Starting the search from '(' is safer because there is
2 // potentially a dot between the parentheses.
3 int iend = fullInfo.lastIndexOf('(');
4 if (iend == -1)
5 className = NA;
6 else {
7 iend = fullInfo.lastIndexOf('.', iend);
8
9 // This is because a stack trace in VisualAge looks like:
10
11 // java.lang.RuntimeException
12 // java.lang.Throwable()
13 // java.lang.Exception()
14 // java.lang.RuntimeException()
15 // void test.test.B.print()
16 // void test.test.A.printIndirect()
17 // void test.test.Run.main(java.lang.String [])
18 int ibegin = 0;
19 if (inVisualAge) {
20 ibegin = fullInfo.lastIndexOf(' ', iend) + 1;
21 }
22
23 if (iend == -1)
24 className = NA;
25 else
26 className = this.fullInfo.substring(ibegin, iend);
fileName:
1
2 int iend = fullInfo.lastIndexOf(':');
3 if (iend == -1)
4 fileName = NA;
5 else {
6 int ibegin = fullInfo.lastIndexOf('(', iend - 1);
7 fileName = this.fullInfo.substring(ibegin + 1, iend);
8 }lineNumber:
1 int iend = fullInfo.lastIndexOf(')');
2 int ibegin = fullInfo.lastIndexOf(':', iend - 1);
3 if (ibegin == -1)
4 lineNumber = NA;
5 else
6 lineNumber = this.fullInfo.substring(ibegin + 1, iend);methodName:
1 int iend = fullInfo.lastIndexOf('(');
2 int ibegin = fullInfo.lastIndexOf('.', iend);
3 if (ibegin == -1)
4 methodName = NA;
5 else
6 methodName = this.fullInfo.substring(ibegin + 1, iend);
ObjectRender接口
Log4J中,对传入的message实例,如果是非String类型,会先使用注册的ObjectRender(在LogRepository中查找注册的ObjectRender信息)处理成String后返回,若没有找到相应的ObjectRender,则使用默认的ObjectRender,它只是调用该消息实例的toString()方法。
1 public Object getMessage() {
2 if (message != null) {
3 return message;
4 } else {
5 return getRenderedMessage();
6 }
7 }
8 public String getRenderedMessage() {
9 if (renderedMessage == null && message != null) {
10 if (message instanceof String)
11 renderedMessage = (String) message;
12 else {
13 LoggerRepository repository = logger.getLoggerRepository();
14
15 if (repository instanceof RendererSupport) {
16 RendererSupport rs = (RendererSupport) repository;
17 renderedMessage = rs.getRendererMap()
18 .findAndRender(message);
19 } else {
20 renderedMessage = message.toString();
21 }
22 }
23 }
24 return renderedMessage;
25 }
ThrowableInformation类
ThrowableInformation类用以处理异常栈信息,即通过Throwable实例获取异常栈字符串数组。同时还支持自定义的ThrowableRender(在LogRepository中设置),默认的ThrowableRender通过系统printStackTrace()方法来获取信息:
1 if (throwable != null) {
2 this.throwableInfo = new ThrowableInformation(throwable, logger);
3 }
4 ThrowableRenderer renderer = null;
5 if (category != null) {
6 LoggerRepository repo = category.getLoggerRepository();
7 if (repo instanceof ThrowableRendererSupport) {
8 renderer = ((ThrowableRendererSupport) repo)
9 .getThrowableRenderer();
10 }
11 }
12 if (renderer == null) {
13 rep = DefaultThrowableRenderer.render(throwable);
14 } else {
15 rep = renderer.doRender(throwable);
16 }
17 public static String[] render(f