Skip to content

Commit 9852d0c

Browse files
committed
Merge branch 'dev' into ms/#53-upgrate-to-scala3
# Conflicts: # src/main/scala/edu/ie3/simona/config/OutputConfig.scala
2 parents 92b408c + c8fdf61 commit 9852d0c

File tree

12 files changed

+107
-31
lines changed

12 files changed

+107
-31
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7171
- Add conversion utils between `ComparableQuantity` and `Squants` [#1313](https://github.com/ie3-institute/simona/issues/1313)
7272
- Implementing auto-merge for dependabot PRs [#1339](https://github.com/ie3-institute/simona/issues/1339)
7373
- Introduce operatingPoints also to `ThermalGrid` [#1338](https://github.com/ie3-institute/simona/issues/1338)
74+
- Added configuration for console log level [#1364](https://github.com/ie3-institute/simona/issues/1364)
7475

7576
### Changed
7677
- Adapted to changed data source in PSDM [#435](https://github.com/ie3-institute/simona/issues/435)

docs/readthedocs/config.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,24 @@ simona.output.thermal.individualConfigs = [
181181
Further model classes which can be used to load the outcome of a system simulation are described in [PSDM](https://powersystemdatamodel.readthedocs.io/en/latest/models/models.html#result).
182182
Data sources and data sinks are explained in the [I/O-capabilities](https://powersystemdatamodel.readthedocs.io/en/latest/io/basiciousage.html) section of the PSDM.
183183

184+
## Logging level configuration
185+
186+
To specify which log statements should be logged in the `simona.log` file and which log statements should be printed to
187+
the console, SIMONA offers the user two configuration options.
188+
189+
The first options sets the default log level for the log file as well as the console.
190+
191+
```
192+
simona.output.log.level = "INFO"
193+
```
194+
195+
If the console should use a different log level, this level must be selected in the following example.
196+
197+
```
198+
simona.output.log.consoleLevel = "DEBUG"
199+
```
200+
201+
184202
## Runtime configuration
185203

186204
Specification of the runtime of subgrids and voltage levels:

input/samples/vn_simona/vn_simona.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ simona.output.thermal = {
101101
}
102102

103103
simona.output.log.level = "INFO"
104+
simona.output.log.consoleLevel = "INFO"
104105

105106
##################################################################
106107
# Runtime Configuration // todo refactor as this naming is misleading and partly unneeded

src/main/resources/logback.xml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,6 @@
66
-->
77

88
<configuration>
9-
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
10-
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
11-
<!-- encoders are assigned the type
12-
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
13-
<encoder>
14-
<pattern>%highlight%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
15-
</encoder>
16-
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
17-
<level>INFO</level>
18-
</filter>
19-
</appender>
209
<!-- File appender is configured and added by edu.ie3.simona.logging.logback.LogbackConfiguration -->
21-
<root level="debug">
22-
<appender-ref ref="STDOUT"/>
23-
</root>
10+
<!-- Console appender is configured and added by edu.ie3.simona.logging.logback.LogbackConfiguration -->
2411
</configuration>

src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,13 @@ object ConfigFailFast extends LazyLogging {
766766
throw new InvalidConfigParameterException(
767767
s"Invalid log level \"${subConfig.level}\". Valid log levels: ${validLogLevels.mkString(", ")}"
768768
)
769+
770+
subConfig.consoleLevel.foreach { level =>
771+
if (!validLogLevels.contains(level))
772+
throw new InvalidConfigParameterException(
773+
s"Invalid console log level \"$level\". Valid log levels: ${validLogLevels.mkString(", ")}"
774+
)
775+
}
769776
}
770777

771778
/** Checks resolution of power flow calculation

src/main/scala/edu/ie3/simona/config/OutputConfig.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,14 @@ object OutputConfig {
124124

125125
/** The configuration for the logger.
126126
* @param level
127-
* Of the logger.
127+
* Of the logger (default: INFO).
128+
* @param consoleLevel
129+
* Option for a separate console log level (default: None -> uses file
130+
* level).
128131
*/
129132
final case class Log(
130-
level: String = "INFO"
133+
level: String = "INFO",
134+
consoleLevel: Option[String] = None,
131135
) derives ConfigConvert
132136

133137
/** Configuration for output sink.

src/main/scala/edu/ie3/simona/logging/logback/LogbackConfiguration.scala

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@ import ch.qos.logback.classic.LoggerContext
1010
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
1111
import ch.qos.logback.classic.filter.ThresholdFilter
1212
import ch.qos.logback.classic.spi.ILoggingEvent
13-
import ch.qos.logback.core.FileAppender
13+
import ch.qos.logback.core.{ConsoleAppender, FileAppender}
1414
import com.typesafe.scalalogging.LazyLogging
1515
import org.slf4j.LoggerFactory
1616

1717
import java.nio.file.Path
1818

1919
object LogbackConfiguration extends LazyLogging {
2020

21-
def default(logLevel: String)(logPath: Path): Unit = {
21+
def default(logLevel: String, console: Option[String] = None)(
22+
logPath: Path
23+
): Unit = {
24+
// if no config log level is given, we use the log level of the file
25+
val consoleLogLevel = console.getOrElse(logLevel)
26+
2227
LoggerFactory.getILoggerFactory match {
2328
case loggerContext: LoggerContext =>
2429
val rootLogger = loggerContext.getLogger("root")
@@ -35,30 +40,26 @@ object LogbackConfiguration extends LazyLogging {
3540
)
3641
)
3742

43+
rootLogger.addAppender(
44+
createConsoleAppender(consoleLogLevel, loggerContext)
45+
)
46+
3847
case factory =>
3948
logger.error(
4049
s"Cannot configure simulation run logger! Invalid factory: $factory"
4150
)
4251
}
4352
}
4453

45-
/** Creates a FileAppender that logs to given path
54+
/** Creates a FileAppender that logs to given path.
4655
*/
4756
private def createFileAppender(
4857
logPath: Path,
4958
logLevel: String,
5059
appenderName: String,
5160
loggerContext: LoggerContext,
5261
): FileAppender[ILoggingEvent] = {
53-
54-
val layoutEncoder = new PatternLayoutEncoder
55-
layoutEncoder.setPattern("%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n")
56-
layoutEncoder.setContext(loggerContext)
57-
layoutEncoder.start()
58-
59-
val filter = new ThresholdFilter()
60-
filter.setLevel(logLevel)
61-
filter.start()
62+
val (layoutEncoder, filter) = configure(logLevel, loggerContext)
6263

6364
val fileAppender = new FileAppender[ILoggingEvent]
6465
fileAppender.setFile(logPath.toString)
@@ -71,4 +72,43 @@ object LogbackConfiguration extends LazyLogging {
7172
fileAppender
7273
}
7374

75+
/** Creates a ConsoleAppender that logs to the console.
76+
*/
77+
private def createConsoleAppender(
78+
logLevel: String,
79+
loggerContext: LoggerContext,
80+
): ConsoleAppender[ILoggingEvent] = {
81+
val (layoutEncoder, filter) = configure(logLevel, loggerContext)
82+
83+
val consoleAppender = new ConsoleAppender[ILoggingEvent]
84+
consoleAppender.setEncoder(layoutEncoder)
85+
consoleAppender.setContext(loggerContext)
86+
consoleAppender.setName("STDOUT")
87+
consoleAppender.addFilter(filter)
88+
consoleAppender.start()
89+
consoleAppender
90+
}
91+
92+
/** Basic configuration for an appender.
93+
* @param logLevel
94+
* The log level to use.
95+
* @param loggerContext
96+
* The context of the logger.
97+
*/
98+
private def configure(
99+
logLevel: String,
100+
loggerContext: LoggerContext,
101+
): (PatternLayoutEncoder, ThresholdFilter) = {
102+
val layoutEncoder = new PatternLayoutEncoder
103+
layoutEncoder.setPattern("%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n")
104+
layoutEncoder.setContext(loggerContext)
105+
layoutEncoder.start()
106+
107+
val filter = new ThresholdFilter()
108+
filter.setLevel(logLevel)
109+
filter.start()
110+
111+
(layoutEncoder, filter)
112+
}
113+
74114
}

src/main/scala/edu/ie3/simona/sim/setup/SetupHelper.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ trait SetupHelper extends LazyLogging {
242242
val modelsToWrite =
243243
SetupHelper.allResultEntitiesToWrite(simonaConfig.simona.output)
244244

245+
val simonaLogConfig = simonaConfig.simona.output.log
246+
245247
ResultFileHierarchy(
246248
simonaConfig.simona.output.base.dir,
247249
simonaConfig.simona.simulationName,
@@ -252,8 +254,8 @@ trait SetupHelper extends LazyLogging {
252254
simonaConfig.simona.simulationName,
253255
),
254256
),
255-
configureLogger =
256-
LogbackConfiguration.default(simonaConfig.simona.output.log.level),
257+
configureLogger = LogbackConfiguration
258+
.default(simonaLogConfig.level, simonaLogConfig.consoleLevel),
257259
config = Some((typeSafeConfig, simonaConfig)),
258260
addTimeStampToOutputDir =
259261
simonaConfig.simona.output.base.addTimestampToOutputDir,

src/test/scala/edu/ie3/simona/event/listener/ResultEventListenerSpec.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import edu.ie3.simona.event.ResultEvent.{
2222
}
2323
import edu.ie3.simona.io.result.ResultSinkType.Csv
2424
import edu.ie3.simona.io.result.{ResultEntitySink, ResultSinkType}
25+
import edu.ie3.simona.logging.logback.LogbackConfiguration
2526
import edu.ie3.simona.test.common.result.PowerFlowResultData
2627
import edu.ie3.simona.test.common.{IOTestCommons, UnitSpec}
2728
import edu.ie3.simona.util.ResultFileHierarchy
@@ -35,6 +36,7 @@ import org.apache.pekko.actor.testkit.typed.scaladsl.{
3536
import org.apache.pekko.testkit.TestKit.awaitCond
3637

3738
import java.io.{File, FileInputStream}
39+
import java.nio.file.Path
3840
import java.util.UUID
3941
import java.util.zip.GZIPInputStream
4042
import scala.concurrent.ExecutionContext.Implicits.global
@@ -84,6 +86,7 @@ class ResultEventListenerSpec
8486
classes,
8587
resultSinkType,
8688
),
89+
configureLogger = LogbackConfiguration.default("INFO", Some("ERROR"))(_),
8790
)
8891
}
8992

src/test/scala/edu/ie3/simona/integration/RunSimonaStandaloneIT.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ class RunSimonaStandaloneIT
5555
"simona.time.endDateTime",
5656
ConfigValueFactory.fromAnyRef("2011-01-01T02:00:00Z"),
5757
)
58+
.withFallback(
59+
ConfigFactory.parseString("""
60+
|simona.output.log.level = "INFO"
61+
|simona.output.log.consoleLevel = "ERROR"
62+
|""".stripMargin)
63+
)
5864
.withFallback(
5965
ConfigFactory
6066
.parseString("""

src/test/scala/edu/ie3/simona/io/file/ResultFileHierarchySpec.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ package edu.ie3.simona.io.file
88

99
import java.io.File
1010
import java.nio.file.{Files, Path}
11-
1211
import edu.ie3.datamodel.models.result.system.PvResult
1312
import edu.ie3.simona.io.result.ResultSinkType
13+
import edu.ie3.simona.logging.logback.LogbackConfiguration
1414
import edu.ie3.simona.test.common.{IOTestCommons, UnitSpec}
1515
import edu.ie3.simona.util.ResultFileHierarchy
1616
import edu.ie3.simona.util.ResultFileHierarchy.ResultEntityPathConfig
@@ -49,6 +49,8 @@ class ResultFileHierarchySpec
4949
Set(classOf[PvResult]),
5050
ResultSinkType.Csv("csv", "pref", "suff"),
5151
),
52+
configureLogger =
53+
LogbackConfiguration.default("INFO", Some("ERROR"))(_),
5254
)
5355

5456
validOutputFileHierarchy.tmpDir.toString shouldBe validOutputFileHierarchy.runOutputDir.toString + fileSeparator + "tmp"
@@ -75,6 +77,8 @@ class ResultFileHierarchySpec
7577
Set(classOf[PvResult]),
7678
ResultSinkType.Csv("csv", "pref", "suff"),
7779
),
80+
configureLogger =
81+
LogbackConfiguration.default("INFO", Some("ERROR"))(_),
7882
)
7983

8084
// check for existence of run output dir

src/test/scala/edu/ie3/simona/io/result/ResultEntityKafkaSpec.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import edu.ie3.simona.event.ResultEvent.PowerFlowResultEvent
1212
import edu.ie3.simona.event.listener.ResultEventListener
1313
import edu.ie3.simona.io.result.plain.PlainResult.PlainNodeResult
1414
import edu.ie3.simona.io.result.plain.PlainWriter
15+
import edu.ie3.simona.logging.logback.LogbackConfiguration
1516
import edu.ie3.simona.test.KafkaSpecLike
1617
import edu.ie3.simona.test.KafkaSpecLike.Topic
1718
import edu.ie3.simona.util.ResultFileHierarchy
@@ -103,6 +104,8 @@ class ResultEntityKafkaSpec
103104
20,
104105
),
105106
),
107+
configureLogger =
108+
LogbackConfiguration.default("INFO", Some("ERROR"))(_),
106109
)
107110
)
108111
)

0 commit comments

Comments
 (0)