Skip to content

Commit 83983b9

Browse files
authored
airspec (feature): Support setting log level with -l (loglevel) (#3338)
1 parent 18cb3af commit 83983b9

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

airspec/src/main/scala/wvlet/airspec/runner/AirSpecLogger.scala

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ private[airspec] class AirSpecLogger() extends AnsiColorPalette {
5252
private val airSpecLogger = {
5353
// Use a different spec logger for each AirSpecRunner
5454
val l = Logger(f"wvlet.airspec.runner.AirSpecLogger_${hashCode()}%x")
55+
// Airspec logger needs to report at least INFO level log regardless of the global log level
56+
l.setLogLevel(wvlet.log.LogLevel.INFO)
5557
l.setFormatter(BareFormatter)
5658
l
5759
}

airspec/src/main/scala/wvlet/airspec/runner/AirSpecSbtRunner.scala

+24-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ package wvlet.airspec.runner
1515

1616
import sbt.testing.{Task, TaskDef}
1717
import wvlet.airspec.runner.AirSpecSbtRunner.AirSpecConfig
18-
import wvlet.log.{LogSupport, Logger}
18+
import wvlet.log.{LogSupport, Logger, LogLevel}
1919

2020
import scala.util.matching.Regex
2121

@@ -39,6 +39,7 @@ private[airspec] class AirSpecSbtRunner(config: AirSpecConfig, val remoteArgs: A
3939
// use airframe's code before sbt detaches the class loader
4040
taskLogger.clearHandlers
4141
Logger.clearAllHandlers
42+
Logger.setDefaultLogLevel(LogLevel.INFO)
4243
""
4344
}
4445

@@ -55,18 +56,31 @@ private[airspec] class AirSpecSbtRunner(config: AirSpecConfig, val remoteArgs: A
5556
private[airspec] object AirSpecSbtRunner extends LogSupport {
5657
def newRunner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader): AirSpecSbtRunner = {
5758

58-
// Set log levels given in the command line args: -L(package)=(log level)
59-
args.filter(_.startsWith("-L")).foreach { l =>
60-
l.stripPrefix("-L").split("=") match {
61-
case Array(pkg, level) =>
62-
val logLevel = wvlet.log.LogLevel(level)
63-
wvlet.log.Logger(pkg).setLogLevel(logLevel)
64-
case _ =>
65-
warn(s"Ignoring invalid argument: ${l}. Use -L(package)=(log level) to set log levels")
59+
// Set log level with -l (log level)
60+
val remaining = Array.newBuilder[String]
61+
var i = 0
62+
var logLevel: LogLevel = Logger.getDefaultLogLevel
63+
while (i < args.length) {
64+
args(i) match {
65+
case "-l" if i < args.length - 1 =>
66+
val logLevel = LogLevel(args(i + 1))
67+
Logger.setDefaultLogLevel(logLevel)
68+
i += 1
69+
case arg if arg.startsWith("-L") =>
70+
arg.stripPrefix("-L").split("=") match {
71+
case Array(pkg, level) =>
72+
val logLevel = LogLevel(level)
73+
Logger(pkg).setLogLevel(logLevel)
74+
case _ =>
75+
warn(s"Ignoring invalid argument: ${arg}. Use -L(package)=(log level) to set log levels")
76+
}
77+
case other =>
78+
remaining += other
6679
}
80+
i += 1
6781
}
6882

69-
new AirSpecSbtRunner(AirSpecConfig(args), remoteArgs, testClassLoader)
83+
new AirSpecSbtRunner(AirSpecConfig(remaining.result()), remoteArgs, testClassLoader)
7084
}
7185

7286
case class AirSpecConfig(args: Array[String]) {

docs/airspec.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ $ sbt
170170
> testOnly -- (pattern)/(pattern) # Run nested tests matching the nested pattern (/ is a dlimiter)
171171

172172
# Configure log levels of airframe-log
173+
> testOnly -- -l (level) # Set the default log level
173174
> testOnly -- -L(package):(level) # Set log level for a package
174175

175176
# sbt's default test functionalities:
@@ -192,7 +193,13 @@ Test names will be checked as case-insensitive partial match, so you only need t
192193

193194
### Configure Log Levels
194195

195-
AirSpec natively supports [airframe-log](https://wvlet.org/airframe/docs/airframe-log.html) for logging. To temporally change the log level of your test classes, use `-L` option:
196+
AirSpec natively supports [airframe-log](https://wvlet.org/airframe/docs/airframe-log.html) for logging. To temporally change the log level, use `-l (log level)` option:
197+
198+
```scala
199+
> testOnly -- -l debug
200+
```
201+
202+
To change the log level only for a specific package or a class, use `-L(package or class)=(log level)` option:
196203

197204
```scala
198205
> testOnly -- -Lorg.mydomain.myapp:debug

0 commit comments

Comments
 (0)