http://git-wip-us.apache.org/repos/asf/logging-log4j-scala/blob/72fe94f7/api/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala ---------------------------------------------------------------------- diff --git a/api/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala b/api/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala deleted file mode 100644 index bd12742..0000000 --- a/api/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala +++ /dev/null @@ -1,552 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache license, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the license for the specific language governing permissions and - * limitations under the license. - */ -package org.apache.logging.log4j.scala - -import org.apache.logging.log4j.message.{DefaultFlowMessageFactory, Message, ParameterizedMessage, ParameterizedMessageFactory} -import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger} -import org.apache.logging.log4j.{Level, Marker, MarkerManager} -import org.junit.runner.RunWith -import org.mockito.Matchers.{any, anyString, eq => eqv} -import org.mockito.Mockito._ -import org.scalatest.junit.JUnitRunner -import org.scalatest.mockito.MockitoSugar -import org.scalatest.{FunSuite, Matchers} - -import scala.language.reflectiveCalls // needed for Mockito mocking - -case class Custom(i: Int) - -trait Manager { - def fetchValue(): Int -} - -@RunWith(classOf[JUnitRunner]) -class LoggerTest extends FunSuite with Matchers with MockitoSugar { - - val msg = new ParameterizedMessage("msg {}", 17) - val entryMsg = new DefaultFlowMessageFactory().newEntryMessage(msg) - val cseqMsg: CharSequence = new StringBuilder().append("cseq msg") - val objectMsg = Custom(17) - val cause = new RuntimeException("cause") - val marker = MarkerManager.getMarker("marker") - val result = "foo" - - def fixture = - new { - val mockLogger = { - val mockLogger = mock[ExtendedLogger] - when(mockLogger.getMessageFactory).thenReturn(new ParameterizedMessageFactory) - mockLogger - } - val manager = { - val mockManager = mock[Manager] - when(mockManager.fetchValue()).thenReturn(4711) - mockManager - } - } - - test("fatal enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.FATAL)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.fatal(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.FATAL), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("fatal disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.FATAL)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.fatal(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("error enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.ERROR)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.error(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.ERROR), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("error disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.ERROR)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.error(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("warn enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.WARN)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.warn(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.WARN), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("warn disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.WARN)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.warn(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("info enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.info(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("info disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.info(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("debug enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.DEBUG)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.debug(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.DEBUG), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("debug disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.DEBUG)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.debug(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("trace enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.trace(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.TRACE), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("trace disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.trace(s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - - test("log enabled with Message message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, msg) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), eqv(msg), eqv(null)) - } - - test("log disabled with Message message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, msg) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with String message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("log disabled with String message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("log enabled with CharSequence message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, cseqMsg) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), any[Message], eqv(null)) - } - - test("log disabled with CharSequence message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, cseqMsg) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Object message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, objectMsg) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), any[Message], eqv(null)) - } - - test("log disabled with Object message and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, objectMsg) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Message message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, msg, cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), eqv(msg), eqv(cause)) - } - - test("log disabled with Message message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, msg, cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with String message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, s"string msg with value: ${f.manager.fetchValue()}", cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), any[Message], eqv(cause)) - verify(f.manager).fetchValue() - } - - test("log disabled with String message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, s"string msg with value: ${f.manager.fetchValue()}", cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("log enabled with CharSequence message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, cseqMsg, cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), any[Message], eqv(cause)) - } - - test("log disabled with CharSequence message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, cseqMsg, cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Object message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, objectMsg, cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(marker), any[Message], eqv(cause)) - } - - test("log disabled with Object message and cause and Marker") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO, marker)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, marker, objectMsg, cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Message message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, msg) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), eqv(msg), eqv(null)) - } - - test("log disabled with Message message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, msg) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(null)) - verify(f.manager).fetchValue() - } - - test("log disabled with String message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, s"string msg with value: ${f.manager.fetchValue()}") - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("log enabled with CharSequence message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, cseqMsg) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(null)) - } - - test("log disabled with CharSequence message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, cseqMsg) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Object message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, objectMsg) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(null)) - } - - test("log disabled with Object message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, objectMsg) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Message message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, msg, cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), eqv(msg), eqv(cause)) - } - - test("log disabled with Message message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, msg, cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with String message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, s"string msg with value: ${f.manager.fetchValue()}", cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(cause)) - verify(f.manager).fetchValue() - } - - test("log disabled with String message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, s"string msg with value: ${f.manager.fetchValue()}", cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - verify(f.manager, never).fetchValue() - } - - test("log enabled with CharSequence message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, cseqMsg, cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(cause)) - } - - test("log disabled with CharSequence message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, cseqMsg, cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - test("log enabled with Object message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger(Level.INFO, objectMsg, cause) - verify(f.mockLogger).logMessage(anyString(), eqv(Level.INFO), eqv(null), any[Message], eqv(cause)) - } - - test("log disabled with Object message and cause") { - val f = fixture - when(f.mockLogger.isEnabled(Level.INFO)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger(Level.INFO, objectMsg, cause) - verify(f.mockLogger, never).logMessage(anyString(), any[Level], any[Marker], any[Message], any[Throwable]) - } - - - test("traceEntry") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceEntry() - verify(f.mockLogger).traceEntry() - } - - test("traceEntry enabled with params") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceEntry("foo", "bar") - verify(f.mockLogger).traceEntry(null: String, "foo", "bar") - } - - test("traceEntry disabled with params") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.traceEntry("foo", "bar") - verify(f.mockLogger, never).traceEntry(anyString(), anyString(), anyString()) - } - - test("traceEntry enabled with message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceEntry(msg) - verify(f.mockLogger).traceEntry(eqv(msg)) - } - - test("traceEntry disabled with message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null.asInstanceOf[AnyRef], null)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.traceEntry(msg) - verify(f.mockLogger, never).traceEntry(any[Message]) - } - - test("traceExit") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceExit() - verify(f.mockLogger).traceExit() - } - - test("traceExit with result") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceExit(result) - verify(f.mockLogger).traceExit(result) - } - - test("traceExit with entrymessage") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceExit(entryMsg) - verify(f.mockLogger).traceExit(entryMsg) - } - - test("traceExit with entrymessage and result") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceExit(entryMsg, result) - verify(f.mockLogger).traceExit(entryMsg, result) - } - - test("traceExit enabled with message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(true) - val logger = Logger(f.mockLogger) - logger.traceExit(msg, result) - verify(f.mockLogger).traceExit(eqv(msg), eqv(result)) - } - - test("traceExit disabled with message") { - val f = fixture - when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, msg, null)).thenReturn(false) - val logger = Logger(f.mockLogger) - logger.traceExit(msg, result) - verify(f.mockLogger, never).traceExit(any[Message], any[AnyRef]) - } - - test("throwing") { - val f = fixture - val logger = Logger(f.mockLogger) - logger.throwing(cause) - verify(f.mockLogger).throwing(eqv(cause)) - } - - test("throwing with level") { - val f = fixture - val logger = Logger(f.mockLogger) - logger.throwing(Level.INFO, cause) - verify(f.mockLogger).throwing(eqv(Level.INFO), eqv(cause)) - } - - test("catching") { - val f = fixture - val logger = Logger(f.mockLogger) - logger.catching(cause) - verify(f.mockLogger).catching(eqv(cause)) - } - - test("catching with level") { - val f = fixture - val logger = Logger(f.mockLogger) - logger.catching(Level.INFO, cause) - verify(f.mockLogger).catching(eqv(Level.INFO), eqv(cause)) - } - -}
http://git-wip-us.apache.org/repos/asf/logging-log4j-scala/blob/72fe94f7/api/src/test/scala/org/apache/logging/log4j/scala/LoggingContextTest.scala ---------------------------------------------------------------------- diff --git a/api/src/test/scala/org/apache/logging/log4j/scala/LoggingContextTest.scala b/api/src/test/scala/org/apache/logging/log4j/scala/LoggingContextTest.scala deleted file mode 100644 index 80ca940..0000000 --- a/api/src/test/scala/org/apache/logging/log4j/scala/LoggingContextTest.scala +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache license, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the license for the specific language governing permissions and - * limitations under the license. - */ -package org.apache.logging.log4j.scala - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.{FunSuite, Matchers} - -import scala.collection.mutable - -@RunWith(classOf[JUnitRunner]) -class LoggingContextTest extends FunSuite with Matchers { - - test("put single, contains, get") { - LoggingContext += "key" -> "value" - - LoggingContext.contains("key") shouldBe true - LoggingContext.get("key") shouldBe Some("value") - LoggingContext.contains("bogus") shouldBe false - LoggingContext.get("bogus") shouldBe None - } - - test("put multiple 1") { - LoggingContext += ("key1" -> "value1", "key2" -> "value2") - - LoggingContext.get("key1") shouldBe Some("value1") - LoggingContext.get("key2") shouldBe Some("value2") - } - - test("put multiple 2") { - LoggingContext ++= Seq("key1" -> "value1", "key2" -> "value2") - - LoggingContext.get("key1") shouldBe Some("value1") - LoggingContext.get("key2") shouldBe Some("value2") - } - - test("remove single") { - LoggingContext += ("key1" -> "value1") - LoggingContext += ("key2" -> "value2") - LoggingContext += ("key3" -> "value3") - - LoggingContext -= "key1" - - LoggingContext.get("key1") shouldBe None - LoggingContext.get("key2") shouldBe Some("value2") - LoggingContext.get("key3") shouldBe Some("value3") - } - - test("remove multiple 1") { - LoggingContext += ("key1" -> "value1") - LoggingContext += ("key2" -> "value2") - LoggingContext += ("key3" -> "value3") - - LoggingContext -= ("key1", "key2") - - LoggingContext.get("key1") shouldBe None - LoggingContext.get("key2") shouldBe None - LoggingContext.get("key3") shouldBe Some("value3") - } - - test("remove multiple 2") { - LoggingContext += ("key1" -> "value1") - LoggingContext += ("key2" -> "value2") - LoggingContext += ("key3" -> "value3") - - LoggingContext --= Seq("key1", "key2") - - LoggingContext.get("key1") shouldBe None - LoggingContext.get("key2") shouldBe None - LoggingContext.get("key3") shouldBe Some("value3") - } - - test("clear, size, isEmpty") { - LoggingContext += ("key" -> "value") - - LoggingContext.clear() - - LoggingContext.contains("key") shouldBe false - LoggingContext.size shouldBe 0 - LoggingContext.isEmpty shouldBe true - } - - test("iterator") { - LoggingContext += ("key1" -> "value1") - LoggingContext += ("key2" -> "value2") - - LoggingContext.iterator.toSet shouldBe Set("key1" -> "value1", "key2" -> "value2") - } - - test("foreach") { - LoggingContext += ("key1" -> "value1") - LoggingContext += ("key2" -> "value2") - - val result = mutable.Set.empty[(String, String)] - - LoggingContext.foreach { result += _ } - - result shouldBe Set("key1" -> "value1", "key2" -> "value2") - } - -} http://git-wip-us.apache.org/repos/asf/logging-log4j-scala/blob/72fe94f7/build.sbt ---------------------------------------------------------------------- diff --git a/build.sbt b/build.sbt index c95f3d3..5cc1c21 100644 --- a/build.sbt +++ b/build.sbt @@ -1,64 +1,104 @@ import Dependencies._ -name := "Log4j Scala API" -organization in ThisBuild := "org.apache.logging.log4j" -organizationName in ThisBuild := "Apache Software Foundation" -organizationHomepage in ThisBuild := Some(url("https://www.apache.org/")) -homepage in ThisBuild := Some(url("https://logging.apache.org/log4j/scala/")) -licenses in ThisBuild := Seq("Apache License, Version 2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0.txt")) -scmInfo in ThisBuild := Some(ScmInfo( - url("https://git-wip-us.apache.org/repos/asf?p=logging-log4j-scala.git;a=summary"), - "scm:git:http://git-wip-us.apache.org/repos/asf/logging-log4j-scala.git", - "scm:git:https://git-wip-us.apache.org/repos/asf/logging-log4j-scala.git" -)) +lazy val metadataSettings = Seq( + organization := "org.apache.logging.log4j", + organizationName := "Apache Software Foundation", + organizationHomepage := Some(url("https://www.apache.org/")), + homepage := Some(url("https://logging.apache.org/log4j/scala/")), + licenses := Seq("Apache License, Version 2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0.txt")), + scmInfo := Some(ScmInfo( + url("https://git-wip-us.apache.org/repos/asf?p=logging-log4j-scala.git;a=summary"), + "scm:git:http://git-wip-us.apache.org/repos/asf/logging-log4j-scala.git", + "scm:git:https://git-wip-us.apache.org/repos/asf/logging-log4j-scala.git" + )), + pomExtra := { + <parent> + <groupId>org.apache.logging</groupId> + <artifactId>logging-parent</artifactId> + <version>2</version> + </parent> + <developers> + <developer> + <id>mikes</id> + <name>Mikael Ståldal</name> + </developer> + <developer> + <id>mattsicker</id> + <name>Matt Sicker</name> + </developer> + <developer> + <id>ggregory</id> + <name>Gary Gregory</name> + </developer> + </developers> + } +) -lazy val commonSettings = Seq( - scalacOptions := Seq("-feature", "-unchecked", "-deprecation") +lazy val compileSettings = Seq( + scalacOptions := Seq("-feature", "-unchecked", "-deprecation"), + scalaVersion := scala211, + crossScalaVersions := Seq(scala210, scala211, scala212, scala213) ) lazy val publishSettings = Seq( publishMavenStyle := true, publishArtifact in Test := false, publishTo := { - if (version.value.endsWith("-SNAPSHOT")) { + if (isSnapshot.value) { Some("Apache Snapshots" at "https://repository.apache.org/content/repositories/snapshots") } else { Some("Apache Releases" at "https://repository.apache.org/service/local/staging/deploy/maven2") } - } + }, + credentials += Credentials(Path.userHome / ".ivy2" / ".credentials"), +// managedResources +// resourceGenerators in Compile += inlineTask(Seq(file("LICENSE.txt"), file("NOTICE.txt"))) ) lazy val releaseSettings = Seq( releaseCrossBuild := true ) -lazy val api = (project in file("api")) - .settings(commonSettings: _*) +lazy val apiDependencies = Seq( + libraryDependencies ++= Seq( + "org.scala-lang" % "scala-reflect" % scalaVersion.value, + "org.apache.logging.log4j" % "log4j-api" % log4j, + "org.apache.logging.log4j" % "log4j-api" % log4j % Test classifier "tests", + "junit" % "junit" % junit % Test, + "org.scalatest" %% "scalatest" % scalatest % Test, + "org.mockito" % "mockito-core" % mockito % Test + ) +) + +lazy val apiInputFiles = Seq( + sources in Compile := { + val filteredFiles = { + for ((_, minor) <- CrossVersion.partialVersion(scalaVersion.value) if minor == 10) + yield ((baseDirectory.value / "src" / "main" / "scala") ** "*Macro.scala").get + }.getOrElse(Seq()) + (sources in Compile).value.filterNot(filteredFiles.contains) + } +) + +lazy val root = (project in file(".")) + .settings(name := "log4j-api-scala") + .settings(metadataSettings: _*) + .settings(compileSettings: _*) .settings(publishSettings: _*) .settings(releaseSettings: _*) - .settings( - name := "log4j-api-scala", - scalaVersion := scala211, - crossScalaVersions := Seq(scala210, scala211, scala212, scala213), - libraryDependencies ++= Seq( - "org.scala-lang" % "scala-reflect" % scalaVersion.value, - "org.apache.logging.log4j" % "log4j-api" % log4j, - "org.apache.logging.log4j" % "log4j-api" % log4j % Test classifier "tests", - "junit" % "junit" % junit % Test, - "org.scalatest" %% "scalatest" % scalatest % Test, - "org.mockito" % "mockito-core" % mockito % Test - ), - excludeFilter in Compile := new FileFilter { - // override LoggerMacro for Scala 2.10 - override def accept(pathname: File): Boolean = { - val Some((_, minor)) = CrossVersion.partialVersion(scalaVersion.value) - minor == 10 && pathname.getName == "LoggerMacro.scala" && pathname.getParent.endsWith("src/main/scala/org/apache/logging/log4j/scala") - } - } - ) + .settings(apiDependencies: _*) + .settings(apiInputFiles: _*) + +//lazy val nopublish = Seq( +// publish := {}, +// publishLocal := {}, +// publishM2 := {}, +// skip in publish := true +//) //lazy val sample = (project in file("sample")) -// .settings(commonSettings) +// .settings(metadataSettings: _*) +// .settings(nopublish: _*) // .settings( // name := "log4j-api-scala-sample", // scalaVersion := scala212, @@ -67,26 +107,5 @@ lazy val api = (project in file("api")) // "org.apache.logging.log4j" % "log4j-core" % log4j % Runtime // ) // ) -// .dependsOn(api) +// .dependsOn(root) -pomExtra in ThisBuild := { - <parent> - <groupId>org.apache.logging</groupId> - <artifactId>logging-parent</artifactId> - <version>2</version> - </parent> - <developers> - <developer> - <id>mikes</id> - <name>Mikael Ståldal</name> - </developer> - <developer> - <id>mattsicker</id> - <name>Matt Sicker</name> - </developer> - <developer> - <id>ggregory</id> - <name>Gary Gregory</name> - </developer> - </developers> -} http://git-wip-us.apache.org/repos/asf/logging-log4j-scala/blob/72fe94f7/src/main/scala-2.10/org/apache/logging/log4j/scala/LoggerMacro.scala ---------------------------------------------------------------------- diff --git a/src/main/scala-2.10/org/apache/logging/log4j/scala/LoggerMacro.scala b/src/main/scala-2.10/org/apache/logging/log4j/scala/LoggerMacro.scala new file mode 100644 index 0000000..24b3c8c --- /dev/null +++ b/src/main/scala-2.10/org/apache/logging/log4j/scala/LoggerMacro.scala @@ -0,0 +1,425 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ +package org.apache.logging.log4j.scala + +import org.apache.logging.log4j.message.{EntryMessage, Message} +import org.apache.logging.log4j.spi.AbstractLogger +import org.apache.logging.log4j.{Level, Marker} + +import scala.language.experimental.macros +import scala.reflect.macros.Context + +/** + * Inspired from [[https://github.com/typesafehub/scalalogging ScalaLogging]]. + */ +private object LoggerMacro { + + type LoggerContext = Context {type PrefixType = Logger} + + + def fatalMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = + logMarkerMsg(c)(c.universe.reify(Level.FATAL), marker, message) + + def fatalMarkerCseq(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + logMarkerCseq(c)(c.universe.reify(Level.FATAL), marker, message) + + def fatalMarkerObject(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + logMarkerObject(c)(c.universe.reify(Level.FATAL), marker, message) + + def fatalMarkerMsgThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMarkerMsgThrowable(c)(c.universe.reify(Level.FATAL), marker, message, cause) + + def fatalMarkerCseqThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logMarkerCseqThrowable(c)(c.universe.reify(Level.FATAL), marker, message, cause) + + def fatalMarkerObjectThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logMarkerObjectThrowable(c)(c.universe.reify(Level.FATAL), marker, message, cause) + + def fatalMsg(c: LoggerContext)(message: c.Expr[Message]) = + logMsg(c)(c.universe.reify(Level.FATAL), message) + + def fatalCseq(c: LoggerContext)(message: c.Expr[CharSequence]) = + logCseq(c)(c.universe.reify(Level.FATAL), message) + + def fatalObject(c: LoggerContext)(message: c.Expr[AnyRef]) = + logObject(c)(c.universe.reify(Level.FATAL), message) + + def fatalMsgThrowable(c: LoggerContext)(message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMsgThrowable(c)(c.universe.reify(Level.FATAL), message, cause) + + def fatalCseqThrowable(c: LoggerContext)(message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logCseqThrowable(c)(c.universe.reify(Level.FATAL), message, cause) + + def fatalObjectThrowable(c: LoggerContext)(message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logObjectThrowable(c)(c.universe.reify(Level.FATAL), message, cause) + + + def errorMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = + logMarkerMsg(c)(c.universe.reify(Level.ERROR), marker, message) + + def errorMarkerCseq(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + logMarkerCseq(c)(c.universe.reify(Level.ERROR), marker, message) + + def errorMarkerObject(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + logMarkerObject(c)(c.universe.reify(Level.ERROR), marker, message) + + def errorMarkerMsgThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMarkerMsgThrowable(c)(c.universe.reify(Level.ERROR), marker, message, cause) + + def errorMarkerCseqThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logMarkerCseqThrowable(c)(c.universe.reify(Level.ERROR), marker, message, cause) + + def errorMarkerObjectThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logMarkerObjectThrowable(c)(c.universe.reify(Level.ERROR), marker, message, cause) + + def errorMsg(c: LoggerContext)(message: c.Expr[Message]) = + logMsg(c)(c.universe.reify(Level.ERROR), message) + + def errorCseq(c: LoggerContext)(message: c.Expr[CharSequence]) = + logCseq(c)(c.universe.reify(Level.ERROR), message) + + def errorObject(c: LoggerContext)(message: c.Expr[AnyRef]) = + logObject(c)(c.universe.reify(Level.ERROR), message) + + def errorMsgThrowable(c: LoggerContext)(message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMsgThrowable(c)(c.universe.reify(Level.ERROR), message, cause) + + def errorCseqThrowable(c: LoggerContext)(message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logCseqThrowable(c)(c.universe.reify(Level.ERROR), message, cause) + + def errorObjectThrowable(c: LoggerContext)(message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logObjectThrowable(c)(c.universe.reify(Level.ERROR), message, cause) + + + def warnMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = + logMarkerMsg(c)(c.universe.reify(Level.WARN), marker, message) + + def warnMarkerCseq(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + logMarkerCseq(c)(c.universe.reify(Level.WARN), marker, message) + + def warnMarkerObject(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + logMarkerObject(c)(c.universe.reify(Level.WARN), marker, message) + + def warnMarkerMsgThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMarkerMsgThrowable(c)(c.universe.reify(Level.WARN), marker, message, cause) + + def warnMarkerCseqThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logMarkerCseqThrowable(c)(c.universe.reify(Level.WARN), marker, message, cause) + + def warnMarkerObjectThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logMarkerObjectThrowable(c)(c.universe.reify(Level.WARN), marker, message, cause) + + def warnMsg(c: LoggerContext)(message: c.Expr[Message]) = + logMsg(c)(c.universe.reify(Level.WARN), message) + + def warnCseq(c: LoggerContext)(message: c.Expr[CharSequence]) = + logCseq(c)(c.universe.reify(Level.WARN), message) + + def warnObject(c: LoggerContext)(message: c.Expr[AnyRef]) = + logObject(c)(c.universe.reify(Level.WARN), message) + + def warnMsgThrowable(c: LoggerContext)(message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMsgThrowable(c)(c.universe.reify(Level.WARN), message, cause) + + def warnCseqThrowable(c: LoggerContext)(message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logCseqThrowable(c)(c.universe.reify(Level.WARN), message, cause) + + def warnObjectThrowable(c: LoggerContext)(message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logObjectThrowable(c)(c.universe.reify(Level.WARN), message, cause) + + + def infoMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = + logMarkerMsg(c)(c.universe.reify(Level.INFO), marker, message) + + def infoMarkerCseq(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + logMarkerCseq(c)(c.universe.reify(Level.INFO), marker, message) + + def infoMarkerObject(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + logMarkerObject(c)(c.universe.reify(Level.INFO), marker, message) + + def infoMarkerMsgThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMarkerMsgThrowable(c)(c.universe.reify(Level.INFO), marker, message, cause) + + def infoMarkerCseqThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logMarkerCseqThrowable(c)(c.universe.reify(Level.INFO), marker, message, cause) + + def infoMarkerObjectThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logMarkerObjectThrowable(c)(c.universe.reify(Level.INFO), marker, message, cause) + + def infoMsg(c: LoggerContext)(message: c.Expr[Message]) = + logMsg(c)(c.universe.reify(Level.INFO), message) + + def infoCseq(c: LoggerContext)(message: c.Expr[CharSequence]) = + logCseq(c)(c.universe.reify(Level.INFO), message) + + def infoObject(c: LoggerContext)(message: c.Expr[AnyRef]) = + logObject(c)(c.universe.reify(Level.INFO), message) + + def infoMsgThrowable(c: LoggerContext)(message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMsgThrowable(c)(c.universe.reify(Level.INFO), message, cause) + + def infoCseqThrowable(c: LoggerContext)(message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logCseqThrowable(c)(c.universe.reify(Level.INFO), message, cause) + + def infoObjectThrowable(c: LoggerContext)(message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logObjectThrowable(c)(c.universe.reify(Level.INFO), message, cause) + + + def debugMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = + logMarkerMsg(c)(c.universe.reify(Level.DEBUG), marker, message) + + def debugMarkerCseq(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + logMarkerCseq(c)(c.universe.reify(Level.DEBUG), marker, message) + + def debugMarkerObject(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + logMarkerObject(c)(c.universe.reify(Level.DEBUG), marker, message) + + def debugMarkerMsgThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMarkerMsgThrowable(c)(c.universe.reify(Level.DEBUG), marker, message, cause) + + def debugMarkerCseqThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logMarkerCseqThrowable(c)(c.universe.reify(Level.DEBUG), marker, message, cause) + + def debugMarkerObjectThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logMarkerObjectThrowable(c)(c.universe.reify(Level.DEBUG), marker, message, cause) + + def debugMsg(c: LoggerContext)(message: c.Expr[Message]) = + logMsg(c)(c.universe.reify(Level.DEBUG), message) + + def debugCseq(c: LoggerContext)(message: c.Expr[CharSequence]) = + logCseq(c)(c.universe.reify(Level.DEBUG), message) + + def debugObject(c: LoggerContext)(message: c.Expr[AnyRef]) = + logObject(c)(c.universe.reify(Level.DEBUG), message) + + def debugMsgThrowable(c: LoggerContext)(message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMsgThrowable(c)(c.universe.reify(Level.DEBUG), message, cause) + + def debugCseqThrowable(c: LoggerContext)(message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logCseqThrowable(c)(c.universe.reify(Level.DEBUG), message, cause) + + def debugObjectThrowable(c: LoggerContext)(message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logObjectThrowable(c)(c.universe.reify(Level.DEBUG), message, cause) + + + def traceMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message]) = + logMarkerMsg(c)(c.universe.reify(Level.TRACE), marker, message) + + def traceMarkerCseq(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + logMarkerCseq(c)(c.universe.reify(Level.TRACE), marker, message) + + def traceMarkerObject(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + logMarkerObject(c)(c.universe.reify(Level.TRACE), marker, message) + + def traceMarkerMsgThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMarkerMsgThrowable(c)(c.universe.reify(Level.TRACE), marker, message, cause) + + def traceMarkerCseqThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logMarkerCseqThrowable(c)(c.universe.reify(Level.TRACE), marker, message, cause) + + def traceMarkerObjectThrowable(c: LoggerContext)(marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logMarkerObjectThrowable(c)(c.universe.reify(Level.TRACE), marker, message, cause) + + def traceMsg(c: LoggerContext)(message: c.Expr[Message]) = + logMsg(c)(c.universe.reify(Level.TRACE), message) + + def traceCseq(c: LoggerContext)(message: c.Expr[CharSequence]) = + logCseq(c)(c.universe.reify(Level.TRACE), message) + + def traceObject(c: LoggerContext)(message: c.Expr[AnyRef]) = + logObject(c)(c.universe.reify(Level.TRACE), message) + + def traceMsgThrowable(c: LoggerContext)(message: c.Expr[Message], cause: c.Expr[Throwable]) = + logMsgThrowable(c)(c.universe.reify(Level.TRACE), message, cause) + + def traceCseqThrowable(c: LoggerContext)(message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + logCseqThrowable(c)(c.universe.reify(Level.TRACE), message, cause) + + def traceObjectThrowable(c: LoggerContext)(message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + logObjectThrowable(c)(c.universe.reify(Level.TRACE), message, cause) + + + def logMarkerMsg(c: LoggerContext)(level: c.Expr[Level], marker: c.Expr[Marker], message: c.Expr[Message]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice, marker.splice)) { + c.prefix.splice.logMessage(level.splice, marker.splice, message.splice, null) + } + ) + + def logMarkerCseq(c: LoggerContext)(level: c.Expr[Level], marker: c.Expr[Marker], message: c.Expr[CharSequence]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice, marker.splice)) { + c.prefix.splice.logMessage(level.splice, marker.splice, message.splice, null) + } + ) + + def logMarkerObject(c: LoggerContext)(level: c.Expr[Level], marker: c.Expr[Marker], message: c.Expr[AnyRef]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice, marker.splice)) { + c.prefix.splice.logMessage(level.splice, marker.splice, message.splice, null) + } + ) + + def logMarkerMsgThrowable(c: LoggerContext)(level: c.Expr[Level], marker: c.Expr[Marker], message: c.Expr[Message], cause: c.Expr[Throwable]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice, marker.splice)) { + c.prefix.splice.logMessage(level.splice, marker.splice, message.splice, cause.splice) + } + ) + + def logMarkerCseqThrowable(c: LoggerContext)(level: c.Expr[Level], marker: c.Expr[Marker], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice, marker.splice)) { + c.prefix.splice.logMessage(level.splice, marker.splice, message.splice, cause.splice) + } + ) + + def logMarkerObjectThrowable(c: LoggerContext)(level: c.Expr[Level], marker: c.Expr[Marker], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice, marker.splice)) { + c.prefix.splice.logMessage(level.splice, marker.splice, message.splice, cause.splice) + } + ) + + def logMsg(c: LoggerContext)(level: c.Expr[Level], message: c.Expr[Message]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice)) { + c.prefix.splice.logMessage(level.splice, null, message.splice, null) + } + ) + + def logCseq(c: LoggerContext)(level: c.Expr[Level], message: c.Expr[CharSequence]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice)) { + c.prefix.splice.logMessage(level.splice, null, message.splice, null) + } + ) + + def logObject(c: LoggerContext)(level: c.Expr[Level], message: c.Expr[AnyRef]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice)) { + c.prefix.splice.logMessage(level.splice, null, message.splice, null) + } + ) + + def logMsgThrowable(c: LoggerContext)(level: c.Expr[Level], message: c.Expr[Message], cause: c.Expr[Throwable]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice)) { + c.prefix.splice.logMessage(level.splice, null, message.splice, cause.splice) + } + ) + + def logCseqThrowable(c: LoggerContext)(level: c.Expr[Level], message: c.Expr[CharSequence], cause: c.Expr[Throwable]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice)) { + c.prefix.splice.logMessage(level.splice, null, message.splice, cause.splice) + } + ) + + def logObjectThrowable(c: LoggerContext)(level: c.Expr[Level], message: c.Expr[AnyRef], cause: c.Expr[Throwable]) = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(level.splice)) { + c.prefix.splice.logMessage(level.splice, null, message.splice, cause.splice) + } + ) + + + def traceEntry(c: LoggerContext)(): c.Expr[EntryMessage] = + c.universe.reify( + c.prefix.splice.delegate.traceEntry() + ) + + def traceEntryParams(c: LoggerContext)(params: c.Expr[AnyRef]*): c.Expr[EntryMessage] = { + import c.universe._ + val isEnabled = Apply( + Select(Select(c.prefix.tree, newTermName("delegate")), newTermName("isEnabled")), + List( + reify(Level.TRACE).tree, + reify(AbstractLogger.ENTRY_MARKER).tree, + reify(null: AnyRef).tree, + reify(null).tree + ) + ) + + val log = Apply( + Select(Select(c.prefix.tree, newTermName("delegate")), newTermName("traceEntry")), + reify(null: String).tree :: (params map (_.tree)).toList + ) + c.Expr[EntryMessage](If(isEnabled, log, reify(null).tree)) + } + + + def traceEntryMessage(c: LoggerContext)(message: c.Expr[Message]): c.Expr[EntryMessage] = + c.universe.reify( + if (c.prefix.splice.delegate.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, null: AnyRef, null)) { + c.prefix.splice.delegate.traceEntry(message.splice) // TODO should not do ifEnabled check + } else { + null + } + ) + + def traceExit(c: LoggerContext)(): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.traceExit() + ) + + def traceExitResult[R: c.WeakTypeTag](c: LoggerContext)(result: c.Expr[R]): c.Expr[R] = + c.universe.reify( + c.prefix.splice.delegate.traceExit(result.splice) + ) + + def traceExitEntryMessage(c: LoggerContext)(entryMessage: c.Expr[EntryMessage]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.traceExit(entryMessage.splice) + ) + + def traceExitEntryMessageResult[R: c.WeakTypeTag](c: LoggerContext)(entryMessage: c.Expr[EntryMessage], result: c.Expr[R]): c.Expr[R] = + c.universe.reify( + c.prefix.splice.delegate.traceExit(entryMessage.splice, result.splice) + ) + + def traceExitMessageResult[R: c.WeakTypeTag](c: LoggerContext)(message: c.Expr[Message], result: c.Expr[R]): c.Expr[R] = + c.universe.reify( + { + if (message.splice != null && c.prefix.splice.delegate.isEnabled(Level.TRACE, AbstractLogger.EXIT_MARKER, message.splice, null)) { + c.prefix.splice.delegate.traceExit(message.splice, result.splice) // TODO should not do ifEnabled check + } + result.splice + } + ) + + def throwing[T <: Throwable: c.WeakTypeTag](c: LoggerContext)(t: c.Expr[T]): c.Expr[T] = + c.universe.reify( + c.prefix.splice.delegate.throwing(t.splice) + ) + + def throwingLevel[T <: Throwable: c.WeakTypeTag](c: LoggerContext)(level: c.Expr[Level], t: c.Expr[T]): c.Expr[T] = + c.universe.reify( + c.prefix.splice.delegate.throwing(level.splice, t.splice) + ) + + def catching(c: LoggerContext)(t: c.Expr[Throwable]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.catching(t.splice) + ) + + def catchingLevel(c: LoggerContext)(level: c.Expr[Level], t: c.Expr[Throwable]): c.Expr[Unit] = + c.universe.reify( + c.prefix.splice.delegate.catching(level.splice, t.splice) + ) + +} http://git-wip-us.apache.org/repos/asf/logging-log4j-scala/blob/72fe94f7/src/main/scala/org/apache/logging/log4j/scala/Logger.scala ---------------------------------------------------------------------- diff --git a/src/main/scala/org/apache/logging/log4j/scala/Logger.scala b/src/main/scala/org/apache/logging/log4j/scala/Logger.scala new file mode 100644 index 0000000..b42cd5a --- /dev/null +++ b/src/main/scala/org/apache/logging/log4j/scala/Logger.scala @@ -0,0 +1,592 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ +package org.apache.logging.log4j.scala + +import org.apache.logging.log4j.message.{EntryMessage, Message, MessageFactory2} +import org.apache.logging.log4j.spi.ExtendedLogger +import org.apache.logging.log4j.{Level, LogManager, Marker} + +import scala.language.experimental.macros + +/** + * Factory for [[Logger]]s. + * + * The [[Logging]] trait provides a simple way to get a properly named logger into a class. + */ +object Logger { + + final val FQCN = getClass.getName + + /** + * Create a properly named [[Logger]] for a given class. + * + * @param clazz the class + */ + def apply(clazz: Class[_]): Logger = Logger(LogManager.getContext(clazz.getClassLoader, false).getLogger(clazz.getName)) + + /** + * Create a [[Logger]] wrapping the given Log4j logger. + * + * @param delegate the Log4j logger to wrap + */ + def apply(delegate: ExtendedLogger): Logger = new Logger(delegate) + +} + +/** + * Scala wrapper for the Log4j `Logger` interface. + * + * Frequently the purpose of logging is to provide information about what is happening in the system, + * which requires including information about the objects being manipulated. In Scala, you can use + * [[http://docs.scala-lang.org/overviews/core/string-interpolation.html string interpolation]] + * to achieve this: + * + * {{{ + * logger.debug(s"Logging in user ${user.getName} with birthday ${user.calcBirthday}") + * }}} + * + * Since this wrapper is implemented with macros, the String construction and method invocations + * will only occur when debug logging is enabled. + */ +class Logger private(val delegate: ExtendedLogger) extends AnyVal { + + def fatal(marker: Marker, message: Message): Unit = + macro LoggerMacro.fatalMarkerMsg + + def fatal(marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.fatalMarkerCseq + + def fatal(marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.fatalMarkerObject + + def fatal(marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.fatalMarkerMsgThrowable + + def fatal(marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.fatalMarkerCseqThrowable + + def fatal(marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.fatalMarkerObjectThrowable + + def fatal(message: Message): Unit = + macro LoggerMacro.fatalMsg + + def fatal(message: CharSequence): Unit = + macro LoggerMacro.fatalCseq + + def fatal(message: AnyRef): Unit = + macro LoggerMacro.fatalObject + + def fatal(message: Message, cause: Throwable): Unit = + macro LoggerMacro.fatalMsgThrowable + + def fatal(message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.fatalCseqThrowable + + def fatal(message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.fatalObjectThrowable + + + def error(marker: Marker, message: Message): Unit = + macro LoggerMacro.errorMarkerMsg + + def error(marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.errorMarkerCseq + + def error(marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.errorMarkerObject + + def error(marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.errorMarkerMsgThrowable + + def error(marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.errorMarkerCseqThrowable + + def error(marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.errorMarkerObjectThrowable + + def error(message: Message): Unit = + macro LoggerMacro.errorMsg + + def error(message: CharSequence): Unit = + macro LoggerMacro.errorCseq + + def error(message: AnyRef): Unit = + macro LoggerMacro.errorObject + + def error(message: Message, cause: Throwable): Unit = + macro LoggerMacro.errorMsgThrowable + + def error(message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.errorCseqThrowable + + def error(message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.errorObjectThrowable + + + def warn(marker: Marker, message: Message): Unit = + macro LoggerMacro.warnMarkerMsg + + def warn(marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.warnMarkerCseq + + def warn(marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.warnMarkerObject + + def warn(marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.warnMarkerMsgThrowable + + def warn(marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.warnMarkerCseqThrowable + + def warn(marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.warnMarkerObjectThrowable + + def warn(message: Message): Unit = + macro LoggerMacro.warnMsg + + def warn(message: CharSequence): Unit = + macro LoggerMacro.warnCseq + + def warn(message: AnyRef): Unit = + macro LoggerMacro.warnObject + + def warn(message: Message, cause: Throwable): Unit = + macro LoggerMacro.warnMsgThrowable + + def warn(message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.warnCseqThrowable + + def warn(message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.warnObjectThrowable + + + def info(marker: Marker, message: Message): Unit = + macro LoggerMacro.infoMarkerMsg + + def info(marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.infoMarkerCseq + + def info(marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.infoMarkerObject + + def info(marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.infoMarkerMsgThrowable + + def info(marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.infoMarkerCseqThrowable + + def info(marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.infoMarkerObjectThrowable + + def info(message: Message): Unit = + macro LoggerMacro.infoMsg + + def info(message: CharSequence): Unit = + macro LoggerMacro.infoCseq + + def info(message: AnyRef): Unit = + macro LoggerMacro.infoObject + + def info(message: Message, cause: Throwable): Unit = + macro LoggerMacro.infoMsgThrowable + + def info(message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.infoCseqThrowable + + def info(message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.infoObjectThrowable + + + def debug(marker: Marker, message: Message): Unit = + macro LoggerMacro.debugMarkerMsg + + def debug(marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.debugMarkerCseq + + def debug(marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.debugMarkerObject + + def debug(marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.debugMarkerMsgThrowable + + def debug(marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.debugMarkerCseqThrowable + + def debug(marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.debugMarkerObjectThrowable + + def debug(message: Message): Unit = + macro LoggerMacro.debugMsg + + def debug(message: CharSequence): Unit = + macro LoggerMacro.debugCseq + + def debug(message: AnyRef): Unit = + macro LoggerMacro.debugObject + + def debug(message: Message, cause: Throwable): Unit = + macro LoggerMacro.debugMsgThrowable + + def debug(message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.debugCseqThrowable + + def debug(message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.debugObjectThrowable + + + def trace(marker: Marker, message: Message): Unit = + macro LoggerMacro.traceMarkerMsg + + def trace(marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.traceMarkerCseq + + def trace(marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.traceMarkerObject + + def trace(marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.traceMarkerMsgThrowable + + def trace(marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.traceMarkerCseqThrowable + + def trace(marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.traceMarkerObjectThrowable + + def trace(message: Message): Unit = + macro LoggerMacro.traceMsg + + def trace(message: CharSequence): Unit = + macro LoggerMacro.traceCseq + + def trace(message: AnyRef): Unit = + macro LoggerMacro.traceObject + + def trace(message: Message, cause: Throwable): Unit = + macro LoggerMacro.traceMsgThrowable + + def trace(message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.traceCseqThrowable + + def trace(message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.traceObjectThrowable + + + /** + * Logs a `Message` with the specific `Marker` at the given `Level`. + * + * @param level the logging level + * @param marker the marker data specific to this log statement + * @param message the message to be logged + */ + def apply(level: Level, marker: Marker, message: Message): Unit = + macro LoggerMacro.logMarkerMsg + + /** + * Logs a string with the specific `Marker` at the given `Level`. + * + * @param level the logging level + * @param marker the marker data specific to this log statement + * @param message the message to be logged + */ + def apply(level: Level, marker: Marker, message: CharSequence): Unit = + macro LoggerMacro.logMarkerCseq + + /** + * Logs an object with the specific `Marker` at the given `Level`. + * + * @param level the logging level + * @param marker the marker data specific to this log statement + * @param message the message to be logged + */ + def apply(level: Level, marker: Marker, message: AnyRef): Unit = + macro LoggerMacro.logMarkerObject + + /** + * Logs a `Message` with the specific `Marker` at the given `Level` including the stack trace + * of the given `Throwable`. + * + * @param level the logging level + * @param marker the marker data specific to this log statement + * @param message the message to be logged + * @param cause the cause + */ + def apply(level: Level, marker: Marker, message: Message, cause: Throwable): Unit = + macro LoggerMacro.logMarkerMsgThrowable + + /** + * Logs a string with the specific `Marker` at the given `Level` including the stack trace + * of the given `Throwable`. + * + * @param level the logging level + * @param marker the marker data specific to this log statement + * @param message the message to be logged + * @param cause the cause + */ + def apply(level: Level, marker: Marker, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.logMarkerCseqThrowable + + /** + * Logs an object with the specific `Marker` at the given `Level` including the stack trace + * of the given `Throwable`. + * + * @param level the logging level + * @param marker the marker data specific to this log statement + * @param message the message to be logged + * @param cause the cause + */ + def apply(level: Level, marker: Marker, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.logMarkerObjectThrowable + + /** + * Logs a `Message` at the given `Level`. + * + * @param level the logging level + * @param message the message to be logged + */ + def apply(level: Level, message: Message): Unit = + macro LoggerMacro.logMsg + + /** + * Logs a string at the given `Level`. + * + * @param level the logging level + * @param message the message to be logged + */ + def apply(level: Level, message: CharSequence): Unit = + macro LoggerMacro.logCseq + + /** + * Logs an object at the given `Level`. + * + * @param level the logging level + * @param message the message to be logged + */ + def apply(level: Level, message: AnyRef): Unit = + macro LoggerMacro.logObject + + /** + * Logs a `Message` at the given `Level` including the stack trace of the given `Throwable`. + * + * @param level the logging level + * @param message the message to be logged + * @param cause a `Throwable` + */ + def apply(level: Level, message: Message, cause: Throwable): Unit = + macro LoggerMacro.logMsgThrowable + + /** + * Logs a string at the given `Level` including the stack trace of the given `Throwable`. + * + * @param level the logging level + * @param message the message to be logged + * @param cause a `Throwable` + */ + def apply(level: Level, message: CharSequence, cause: Throwable): Unit = + macro LoggerMacro.logCseqThrowable + + /** + * Logs an object at the given `Level` including the stack trace of the given `Throwable`. + * + * @param level the logging level + * @param message the message to be logged + * @param cause a `Throwable` + */ + def apply(level: Level, message: AnyRef, cause: Throwable): Unit = + macro LoggerMacro.logObjectThrowable + + + /** + * Logs entry to a method. Used when the method in question has no parameters or when the parameters should not be + * logged. + * + * @return The built `EntryMessage` + */ + def traceEntry(): EntryMessage = + macro LoggerMacro.traceEntry + + /** + * Logs entry to a method along with its parameters. + * + * {{{ + * def doSomething(foo: String, bar: Int): Unit = { + * logger.traceEntry(foo, bar) + * // do something + * } + * }}} + * + * @param params the parameters to the method. + * @return The built `EntryMessage` + */ + def traceEntry(params: AnyRef*): EntryMessage = + macro LoggerMacro.traceEntryParams + + /** + * Logs entry to a method using a `Message` to describe the parameters. + * + * {{{ + * def doSomething(foo: Request): Unit = { + * logger.traceEntry(JsonMessage(foo)) + * // do something + * } + * }}} + * + * @param message the message + * @return The built `EntryMessage` + */ + def traceEntry(message: Message): EntryMessage = + macro LoggerMacro.traceEntryMessage + + /** + * Logs exit from a method with no result. + */ + def traceExit(): Unit = + macro LoggerMacro.traceExit + + /** + * Logs exiting from a method with result. + * + * @param result The result being returned from the method call + * @return `result` + */ + def traceExit[R](result: R): R = + macro LoggerMacro.traceExitResult[R] + + /** + * Logs exiting from a method with no result. + * + * @param entryMessage the `EntryMessage` returned from one of the `traceEntry` methods + */ + def traceExit(entryMessage: EntryMessage): Unit = + macro LoggerMacro.traceExitEntryMessage + + /** + * Logs exiting from a method with result. + * + * {{{ + * def doSomething(foo: String, bar: Int): Int = { + * val entryMessage = logger.traceEntry(foo, bar) + * // do something + * traceExit(entryMessage, value) + * } + * }}} + * + * @param entryMessage the `EntryMessage` returned from one of the `traceEntry` methods + * @param result The result being returned from the method call + * @return `result` + */ + def traceExit[R](entryMessage: EntryMessage, result: R): R = + macro LoggerMacro.traceExitEntryMessageResult[R] + + /** + * Logs exiting from a method with result. Allows custom formatting of the result. + * + * @param message the Message containing the formatted result + * @param result The result being returned from the method call. + * @return `result` + */ + def traceExit[R](message: Message, result: R): R = + macro LoggerMacro.traceExitMessageResult[R] + + /** + * Logs an exception or error to be thrown. + * + * {{{ + * throw logger.throwing(myException) + * }}} + * + * @param t the Throwable + * @return `t` + */ + def throwing[T <: Throwable](t: T): T = + macro LoggerMacro.throwing[T] + + /** + * Logs an exception or error to be thrown to a specific logging level. + * + * {{{ + * throw logger.throwing(Level.DEBUG, myException) + * }}} + * + * @param level the logging Level. + * @param t the Throwable + * @return `t` + */ + def throwing[T <: Throwable](level: Level, t: T): T = + macro LoggerMacro.throwingLevel[T] + + /** + * Logs an exception or error that has been caught. + * + * @param t the Throwable. + */ + def catching(t: Throwable): Unit = + macro LoggerMacro.catching + + /** + * Logs an exception or error that has been caught to a specific logging level. + * + * @param level The logging Level. + * @param t The Throwable. + */ + def catching(level: Level, t: Throwable): Unit = + macro LoggerMacro.catchingLevel + + + /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified + * level is enabled. + * + * Should normally not be used directly from application code, but needs to be public for access by macros. + * + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` + */ + def logMessage(level: Level, marker: Marker, message: Message, cause: Throwable): Unit = { + delegate.logMessage(Logger.FQCN, level, marker, message, cause) + } + + /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified + * level is enabled. + * + * Should normally not be used directly from application code, but needs to be public for access by macros. + * + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` + */ + def logMessage(level: Level, marker: Marker, message: CharSequence, cause: Throwable): Unit = { + delegate.logMessage(Logger.FQCN, level, marker, delegate.getMessageFactory.asInstanceOf[MessageFactory2].newMessage(message), cause) + } + + /** Always logs a message at the specified level. It is the responsibility of the caller to ensure the specified + * level is enabled. + * + * Should normally not be used directly from application code, but needs to be public for access by macros. + * + * @param level log level + * @param marker marker or `null` + * @param message message + * @param cause cause or `null` + */ + def logMessage(level: Level, marker: Marker, message: AnyRef, cause: Throwable): Unit = { + delegate.logMessage(Logger.FQCN, level, marker, delegate.getMessageFactory.asInstanceOf[MessageFactory2].newMessage(message), cause) + } + +}
