/src/main/scala/com/codahale/logula/Log.scala

http://github.com/codahale/logula · Scala · 174 lines · 69 code · 30 blank · 75 comment · 4 complexity · f48ff7c16e648c47663858db4a750a60 MD5 · raw file

  1. package com.codahale.logula
  2. import org.apache.log4j.{Level, Logger}
  3. import reflect.NameTransformer
  4. /**
  5. * Log's companion object.
  6. */
  7. object Log {
  8. /**
  9. * Returns a log for a given class.
  10. */
  11. def forClass[A](implicit mf: Manifest[A]) = forName(mf.erasure.getCanonicalName)
  12. /**
  13. * Returns a log for a given class.
  14. */
  15. def forClass(klass: Class[_]) = forName(klass.getCanonicalName)
  16. /**
  17. * Returns a log with the given name.
  18. */
  19. def forName(name: String) = new Log(Logger.getLogger(clean(name)))
  20. private def clean(s: String) = NameTransformer.decode(if (s.endsWith("$")) {
  21. s.substring(0, s.length - 1)
  22. } else {
  23. s
  24. }.replaceAll("\\$", "."))
  25. protected val CallerFQCN = classOf[Log].getCanonicalName
  26. }
  27. /**
  28. * <b>In general, use the Logging trait rather than using Log directly.</b>
  29. *
  30. * A wrapper for org.apache.log4j which allows for a smoother interaction with
  31. * Scala classes. All messages are treated as format strings:
  32. * <pre>
  33. * log.info("We have this many threads: %d", thread.size)
  34. * </pre>
  35. * Each log level has two methods: one for logging regular messages, the other
  36. * for logging messages with thrown exceptions.
  37. *
  38. * The log levels here are those of org.apache.log4j.
  39. *
  40. * @author coda
  41. */
  42. class Log(private val logger: Logger) {
  43. import Log._
  44. /**
  45. * Logs a message with optional parameters at level TRACE.
  46. */
  47. def trace(message: String, params: Any*) {
  48. log(Level.TRACE, None, message, params)
  49. }
  50. /**
  51. * Logs a thrown exception and a message with optional parameters at level
  52. * TRACE.
  53. */
  54. def trace(thrown: Throwable, message: String, params: Any*) {
  55. log(Level.TRACE, Some(thrown), message, params)
  56. }
  57. /**
  58. * Logs a message with optional parameters at level DEBUG.
  59. */
  60. def debug(message: String, params: Any*) {
  61. log(Level.DEBUG, None, message, params)
  62. }
  63. /**
  64. * Logs a thrown exception and a message with optional parameters at level
  65. * DEBUG.
  66. */
  67. def debug(thrown: Throwable, message: String, params: Any*) {
  68. log(Level.DEBUG, Some(thrown), message, params)
  69. }
  70. /**
  71. * Logs a message with optional parameters at level INFO.
  72. */
  73. def info(message: String, params: Any*) {
  74. log(Level.INFO, None, message, params)
  75. }
  76. /**
  77. * Logs a thrown exception and a message with optional parameters at level
  78. * INFO.
  79. */
  80. def info(thrown: Throwable, message: String, params: Any*) {
  81. log(Level.INFO, Some(thrown), message, params)
  82. }
  83. /**
  84. * Logs a message with optional parameters at level WARN.
  85. */
  86. def warn(message: String, params: Any*) {
  87. log(Level.WARN, None, message, params)
  88. }
  89. /**
  90. * Logs a thrown exception and a message with optional parameters at level
  91. * WARN.
  92. */
  93. def warn(thrown: Throwable, message: String, params: Any*) {
  94. log(Level.WARN, Some(thrown), message, params)
  95. }
  96. /**
  97. * Logs a message with optional parameters at level ERROR.
  98. */
  99. def error(message: String, params: Any*) {
  100. log(Level.ERROR, None, message, params)
  101. }
  102. /**
  103. * Logs a thrown exception and a message with optional parameters at level
  104. * ERROR.
  105. */
  106. def error(thrown: Throwable, message: String, params: Any*) {
  107. log(Level.ERROR, Some(thrown), message, params)
  108. }
  109. /**
  110. * Logs a message with optional parameters at level FATAL.
  111. */
  112. def fatal(message: String, params: Any*) {
  113. log(Level.FATAL, None, message, params)
  114. }
  115. /**
  116. * Logs a thrown exception and a message with optional parameters at level
  117. * FATAL.
  118. */
  119. def fatal(thrown: Throwable, message: String, params: Any*) {
  120. log(Level.FATAL, Some(thrown), message, params)
  121. }
  122. /**
  123. * Returns the log's current level.
  124. */
  125. def level = logger.getLevel
  126. /**
  127. * Sets the log's current level.
  128. */
  129. def level_=(level: Level) {
  130. logger.setLevel(level)
  131. }
  132. def isTraceEnabled = logger.isEnabledFor(Level.TRACE)
  133. def isDebugEnabled = logger.isEnabledFor(Level.DEBUG)
  134. def isInfoEnabled = logger.isEnabledFor(Level.INFO)
  135. def isWarnEnabled = logger.isEnabledFor(Level.WARN)
  136. def isErrorEnabled = logger.isEnabledFor(Level.ERROR)
  137. def isFatalEnabled = logger.isEnabledFor(Level.FATAL)
  138. private def log(level: Level, thrown: Option[Throwable], message: String, values: Seq[Any]) {
  139. if (logger.isEnabledFor(level)) {
  140. val statement = if (values.isEmpty) message else message.format(values:_*)
  141. logger.log(CallerFQCN, level, statement, thrown.orNull)
  142. }
  143. }
  144. }