Skip to content

Commit

Permalink
Added simple log4j logger (with class name) retrieval for any class/c…
Browse files Browse the repository at this point in the history
…ompanion object, with some utility extension functions
  • Loading branch information
T0mexX committed Aug 12, 2024
1 parent ae73520 commit 28cce05
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 0 deletions.
4 changes: 4 additions & 0 deletions opendc-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,9 @@ plugins {
dependencies {
api(libs.kotlinx.coroutines)

api(libs.log4j.core)
api(libs.log4j.slf4j)
api(libs.kotlin.logging)

testImplementation(projects.opendcSimulator.opendcSimulatorCore)
}
131 changes: 131 additions & 0 deletions opendc-common/src/main/kotlin/org/opendc/common/logger/Logger.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/*
* Copyright (c) 2024 AtLarge Research
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package org.opendc.common.logger

import mu.KotlinLogging
import org.slf4j.Logger

/**
* @return a slf4j logger named as the calling class simple name.
* Can also be used in the companion object to limit the instances of loggers.
*
*
* ```kotlin
* class Foo {
* val LOG by logger() // Same as: KotlinLogging.logger(name = "Foo")
*
* companion object {
* val LOG by logger() // Same as: KotlinLogging.logger(name = "Foo")
* val LOG by logger("smth") // Same as: KotlinLogging.logger(name = "smth")
* }
* }
* ```
*/
public fun <T : Any> T.logger(name: String? = null): Lazy<Logger> {
return lazy {
KotlinLogging.logger(
name
?: runCatching { this::class.java.enclosingClass.simpleName }
.getOrNull()
?: "unknown",
)
}
}

/**
* Logs [msg] with WARN level and returns null.
* ```kotlin
* // Replace
* LOG.warn(<msg>)
* return null
* // With
* return LOG.warnAndNull(<msg>)
*/
public fun Logger.warnAndNull(msg: String): Nothing? {
this.warn(msg)
return null
}

/**
* Logs [msg] with ERROR level and returns null.
* ```kotlin
* // Replace
* LOG.error(<msg>)
* return null
* // With
* return LOG.errAndNull(<msg>)
*/
public fun Logger.errAndNull(msg: String): Nothing? {
this.error(msg)
return null
}

/**
* Logs [msg] with *WARN* level and returns [obj].
*
*
* ```kotlin
* // Replace
* if (<key> !in map) {
* LOG.warn("warn-message")
* return <default-value>
* } else map[<key>]
* // With
* map.getOrDefault(<key>, LOG.withWarn(<default-value>, "<warn-message>"))
* ```
*/
public fun <T> Logger.withWarn(
obj: T,
msg: String,
): T {
this.warn(msg)
return obj
}

/**
* Logs [msg] with *ERROR* level and returns [obj].
*/
public fun <T> Logger.withErr(
obj: T,
msg: String,
): T {
this.error(msg)
return obj
}

/**
* Logs [msg] with *INFO* level on a new line.
* ```console
*
* 09:28:08.830 [INFO] ScenariosSpec -
* | === Compute Export Config ===
* | Host Fields (columns) : timestamp,
* ...
* // Instead of
* 09:28:08.830 [INFO] ScenariosSpec - | === Compute Export Config ===
* | Host Fields (columns) : timestamp,
* ```
*/
public fun Logger.infoNewLine(msg: String) {
info("\n" + msg)
}
43 changes: 43 additions & 0 deletions opendc-common/src/main/resources/log4j2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ MIT License
~
~ Copyright (c) 2020 atlarge-research
~
~ Permission is hereby granted, free of charge, to any person obtaining a copy
~ of this software and associated documentation files (the "Software"), to deal
~ in the Software without restriction, including without limitation the rights
~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
~ copies of the Software, and to permit persons to whom the Software is
~ furnished to do so, subject to the following conditions:
~
~ The above copyright notice and this permission notice shall be included in all
~ copies or substantial portions of the Software.
~
~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
~ SOFTWARE.
-->

<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%highlight{%-5level}] %logger{36} - %msg%n" disableAnsi="false"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.opendc" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.apache.hadoop" level="warn" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="warn">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

0 comments on commit 28cce05

Please sign in to comment.