CatLogbackAppender.java 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package com.dianping.cat.logback;
  2. import ch.qos.logback.classic.Level;
  3. import ch.qos.logback.classic.spi.ILoggingEvent;
  4. import ch.qos.logback.classic.spi.ThrowableProxy;
  5. import ch.qos.logback.core.AppenderBase;
  6. import ch.qos.logback.core.LogbackException;
  7. import com.dianping.cat.Cat;
  8. import java.io.PrintWriter;
  9. import java.io.StringWriter;
  10. public class CatLogbackAppender extends AppenderBase<ILoggingEvent> {
  11. @Override
  12. protected void append(ILoggingEvent event) {
  13. try {
  14. boolean isTraceMode = Cat.getManager().isTraceMode();
  15. Level level = event.getLevel();
  16. if (level.isGreaterOrEqual(Level.ERROR)) {
  17. logError(event);
  18. } else if (isTraceMode) {
  19. logTrace(event);
  20. }
  21. } catch (Exception ex) {
  22. throw new LogbackException(event.getFormattedMessage(), ex);
  23. }
  24. }
  25. private void logError(ILoggingEvent event) {
  26. ThrowableProxy info = (ThrowableProxy) event.getThrowableProxy();
  27. if (info != null) {
  28. Throwable exception = info.getThrowable();
  29. Object message = event.getFormattedMessage();
  30. if (message != null) {
  31. Cat.logError(String.valueOf(message), exception);
  32. } else {
  33. Cat.logError(exception);
  34. }
  35. }
  36. }
  37. private void logTrace(ILoggingEvent event) {
  38. String type = "Logback";
  39. String name = event.getLevel().toString();
  40. Object message = event.getFormattedMessage();
  41. String data;
  42. if (message instanceof Throwable) {
  43. data = buildExceptionStack((Throwable) message);
  44. } else {
  45. data = event.getFormattedMessage().toString();
  46. }
  47. ThrowableProxy info = (ThrowableProxy) event.getThrowableProxy();
  48. if (info != null) {
  49. data = data + '\n' + buildExceptionStack(info.getThrowable());
  50. }
  51. Cat.logTrace(type, name, "0", data);
  52. }
  53. private String buildExceptionStack(Throwable exception) {
  54. if (exception != null) {
  55. StringWriter writer = new StringWriter(2048);
  56. exception.printStackTrace(new PrintWriter(writer));
  57. return writer.toString();
  58. } else {
  59. return "";
  60. }
  61. }
  62. }