01 /*
02 * Copyright 2009-2012 the original author or authors.
03 *
04 * Licensed under the Apache License, Version 2.0 (the "License");
05 * you may not use this file except in compliance with the License.
06 * You may obtain a copy of the License at
07 *
08 * http://www.apache.org/licenses/LICENSE-2.0
09 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.codehaus.griffon.runtime.logging;
17
18 import griffon.core.GriffonApplication;
19 import griffon.util.ApplicationHolder;
20 import org.apache.log4j.AppenderSkeleton;
21 import org.apache.log4j.Layout;
22 import org.apache.log4j.Level;
23 import org.apache.log4j.spi.LoggingEvent;
24 import org.apache.log4j.spi.ThrowableInformation;
25
26 import java.util.Arrays;
27
28
29 /**
30 * A Log4j Appender that triggers Griffon application events.
31 *
32 * @author Andres Almiray
33 * @since 0.9.3
34 */
35 public class GriffonApplicationEventAppender extends AppenderSkeleton {
36 private static final String EVENT_NAME = "LogEvent";
37
38 public GriffonApplicationEventAppender(Layout layout) {
39 this.layout = layout;
40 }
41
42 @Override
43 protected void append(LoggingEvent event) {
44 Throwable throwable = null;
45 ThrowableInformation throwableInfo = event.getThrowableInformation();
46 if (throwableInfo != null) {
47 throwable = throwableInfo.getThrowable();
48 }
49 fireApplicationEvent(event.getLevel(), asString(event), throwable);
50 }
51
52 private String asString(LoggingEvent event) {
53 StringBuilder builder = new StringBuilder(layout.format(event));
54
55 if (layout.ignoresThrowable()) {
56 String[] s = event.getThrowableStrRep();
57 if (s != null) {
58 int len = s.length;
59 for (int i = 0; i < len; i++) {
60 builder.append(s[i]);
61 builder.append(Layout.LINE_SEP);
62 }
63 }
64 }
65
66 return builder.toString();
67 }
68
69 public void close() {
70 }
71
72 public boolean requiresLayout() {
73 return true;
74 }
75
76 private void fireApplicationEvent(Level level, String message, Throwable throwable) {
77 GriffonApplication app = ApplicationHolder.getApplication();
78 if (app != null) {
79 app.eventAsync(EVENT_NAME, Arrays.asList(level.toString(), message, throwable));
80 }
81 }
82 }
|