From 6c6d3d246b3e057d36e9f6adcbbeef0ddeb12ada Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 6 Aug 2010 16:03:36 +0200 Subject: [PATCH] Closing ticket 337 --- akka-core/src/main/scala/util/Logging.scala | 127 +++++++++++++++++++- config/akka-reference.conf | 14 --- config/log4j.properties | 2 +- project/build/AkkaProject.scala | 15 ++- 4 files changed, 136 insertions(+), 22 deletions(-) diff --git a/akka-core/src/main/scala/util/Logging.scala b/akka-core/src/main/scala/util/Logging.scala index 8c6ea0fb99..9be0ba6087 100644 --- a/akka-core/src/main/scala/util/Logging.scala +++ b/akka-core/src/main/scala/util/Logging.scala @@ -4,7 +4,7 @@ package se.scalablesolutions.akka.util -import net.lag.logging.Logger +import org.slf4j.{Logger => SLFLogger,LoggerFactory => SLFLoggerFactory} import java.io.StringWriter import java.io.PrintWriter @@ -17,9 +17,132 @@ import java.net.UnknownHostException * @author Jonas Bonér */ trait Logging { - @sjson.json.JSONProperty(ignore = true) @transient lazy val log = Logger.get(this.getClass.getName) + @sjson.json.JSONProperty(ignore = true) @transient lazy val log = Logger(this.getClass.getName) } +/** + * Scala SLF4J wrapper + * + * ex. + * + * class Foo extends Logging { + * log.info("My foo is %s","alive") + * log.error(new Exception(),"My foo is %s","broken") + * } + */ +class Logger(val logger: SLFLogger) +{ + def name = logger.getName + + def trace_? = logger.isTraceEnabled + def debug_? = logger.isDebugEnabled + def info_? = logger.isInfoEnabled + def warning_? = logger.isWarnEnabled + def error_? = logger.isErrorEnabled + + //Trace + def trace(t: => Throwable,msg: => String,args: Any*){ + ifTrace(t,message(msg,args:_*)) + } + + def trace(msg: => String,args: Any*){ + ifTrace(message(msg,args:_*)) + } + + def ifTrace(msg: => String): Unit = if (trace_?) logger trace msg + + def ifTrace(t: => Throwable,msg: => String): Unit = { + if(trace_?) logger.trace(msg,t) + } + + //Debug + def debug(t: => Throwable,msg: => String,args: Any*){ + ifDebug(t,message(msg,args:_*)) + } + + def debug(msg: => String,args: Any*){ + ifDebug(message(msg,args:_*)) + } + + def ifDebug(msg: => String): Unit = if (debug_?) logger debug msg + + def ifDebug(t: => Throwable,msg: => String): Unit = { + if(debug_?) logger.debug(msg,t) + } + + //Info + def info(t: => Throwable,msg: => String,args: Any*){ + ifInfo(t,message(msg,args:_*)) + } + + def info(msg: => String,args: Any*){ + ifInfo(message(msg,args:_*)) + } + + def ifInfo(msg: => String): Unit = if (info_?) logger info msg + + def ifInfo(t: => Throwable,msg: => String): Unit = { + if(info_?) logger.info(msg,t) + } + + //Warning + def warning(t: => Throwable,msg: => String,args: Any*){ + ifWarning(t,message(msg,args:_*)) + } + + def warning(msg: => String,args: Any*){ + ifWarning(message(msg,args:_*)) + } + + def ifWarning(msg: => String): Unit = if (warning_?) logger warn msg + + def ifWarning(t: => Throwable,msg: => String): Unit = { + if(warning_?) logger.warn(msg,t) + } + + //Error + def error(t: => Throwable,msg: => String,args: Any*){ + ifError(t,message(msg,args:_*)) + } + + def error(msg: => String,args: Any*){ + ifError(message(msg,args:_*)) + } + + def ifError(msg: => String): Unit = if (error_?) logger error msg + + def ifError(t: => Throwable,msg: => String): Unit = { + if(error_?) logger.error(msg,t) + } + + protected def message(msg: String, args: Any*) : String = { + if(args.isEmpty || (args eq null)) + msg + else + msg.format(args:_*) + } +} + +/** + * Logger factory + * + * ex. + * + * val logger = Logger("my.cool.logger") + * val logger = Logger(classOf[Banana]) + * val rootLogger = Logger.root + */ +object Logger +{ + def apply(logger: String) : Logger = new Logger(SLFLoggerFactory getLogger logger) + + def apply(clazz: Class[_]) : Logger = apply(clazz.getName) + + def root : Logger = apply(SLFLogger.ROOT_LOGGER_NAME) +} + + + /** * LoggableException is a subclass of Exception and can be used as the base exception * for application specific exceptions. diff --git a/config/akka-reference.conf b/config/akka-reference.conf index 3b80953fe6..cda3f01d6d 100644 --- a/config/akka-reference.conf +++ b/config/akka-reference.conf @@ -5,20 +5,6 @@ # This file has all the default settings, so all these could be removed with no visible effect. # Modify as needed. -log { - filename = "./logs/akka.log" - roll = "daily" # Options: never, hourly, daily, sunday/monday/... - level = "debug" # Options: fatal, critical, error, warning, info, debug, trace - console = on - # syslog_host = "" - # syslog_server_name = "" - - akka { # example of package level logging settings - node = "se.scalablesolutions.akka" - level = "debug" - } -} - akka { version = "0.10" diff --git a/config/log4j.properties b/config/log4j.properties index 76d3661163..9ea188f8c4 100755 --- a/config/log4j.properties +++ b/config/log4j.properties @@ -17,4 +17,4 @@ log4j.appender.R.layout.ConversionPattern=%5p [%t] %d{ISO8601} %F (line %L) %m%n # Edit the next line to point to your logs directory log4j.appender.R.File=./logs/akka.log -log4j.logger.org.atmosphere=DEBUG +log4j.logger.se.scalablesolutions=INFO diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 02f72d7f0e..c247f475af 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -266,7 +266,12 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { ) // Exclude slf4j1.5.11 from the classpath, it's conflicting... - override def runClasspath = super.runClasspath --- (super.runClasspath ** "slf4j*1.5.11.jar") + override def runClasspath = super.runClasspath +++ + descendents(info.projectPath / "config", "*") --- + (super.runClasspath ** "slf4j*1.5.11.jar") + + override def mainResources = super.mainResources +++ + descendents(info.projectPath / "config", "*") // ------------------------------------------------------------ // publishing @@ -343,6 +348,9 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { val sjson = Dependencies.sjson val werkz = Dependencies.werkz val werkz_core = Dependencies.werkz_core + val slf4j = Dependencies.slf4j + val slf4j_log4j = Dependencies.slf4j_log4j + val log4j = Dependencies.log4j // testing val junit = Dependencies.junit @@ -453,9 +461,6 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaCassandraProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val cassandra = Dependencies.cassandra - val log4j = Dependencies.log4j - val slf4j = Dependencies.slf4j - val slf4j_log4j = Dependencies.slf4j_log4j // testing val cassandra_clhm = Dependencies.cassandra_clhm @@ -634,6 +639,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { } class AkkaSampleCamelProject(info: ProjectInfo) extends AkkaDefaultProject(info, deployPath) with CodeFellowPlugin { + //Must be like this to be able to exclude the geronimo-servlet_2.4_spec which is a too old Servlet spec override def ivyXML = @@ -701,7 +707,6 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { ((outputPath ##) / defaultJarName) +++ mainResources +++ mainDependencies.scalaJars +++ - descendents(info.projectPath, "*.conf") +++ descendents(info.projectPath / "scripts", "run_akka.sh") +++ descendents(info.projectPath / "dist", "*.jar") +++ descendents(info.projectPath / "deploy", "*.jar") +++