mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-13 19:30:10 +08:00
增强 log 模块功能
This commit is contained in:
parent
57ac925bd7
commit
b3313f030d
@ -1,4 +1,6 @@
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.3.61'
|
implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.3.61'
|
||||||
api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.29'
|
api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.29'
|
||||||
|
api group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
|
||||||
|
api 'ch.qos.logback:logback-classic:1.2.3'
|
||||||
}
|
}
|
87
log/src/main/kotlin/cn/tursom/log/LogbackPattern.kt
Normal file
87
log/src/main/kotlin/cn/tursom/log/LogbackPattern.kt
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
package cn.tursom.log
|
||||||
|
|
||||||
|
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||||
|
object LogbackPattern {
|
||||||
|
enum class ColorEnum(val code: String) {
|
||||||
|
BLACK("black"), RED("red"), GREEN("green"), YELLOW("yellow"), BLUE("blue"),
|
||||||
|
MAGENTA("magenta"), CYAN("cyan"), WHITE("white"), GRAY("gray"),
|
||||||
|
BOLD_RED("boldRed"), BOLD_GREEN("boldGreen"), BOLD_YELLOW("boldYellow"),
|
||||||
|
BOLD_BLUE("boldBlue"), BOLD_MAGENTA("boldMagenta"), BOLD_CYAN("boldCyan"),
|
||||||
|
BOLD_WHITE("boldWhite"), HIGHLIGHT("highlight");
|
||||||
|
|
||||||
|
operator fun unaryPlus() = "%$this"
|
||||||
|
operator fun invoke(content: String) = "$this($content)"
|
||||||
|
operator fun get(content: String) = "$this{$content}"
|
||||||
|
override fun toString(): String = code
|
||||||
|
}
|
||||||
|
|
||||||
|
object Color {
|
||||||
|
val black = ColorEnum.BLACK
|
||||||
|
val red = ColorEnum.RED
|
||||||
|
val green = ColorEnum.GREEN
|
||||||
|
val yellow = ColorEnum.YELLOW
|
||||||
|
val blue = ColorEnum.BLUE
|
||||||
|
val magenta = ColorEnum.MAGENTA
|
||||||
|
val cyan = ColorEnum.CYAN
|
||||||
|
val white = ColorEnum.WHITE
|
||||||
|
val gray = ColorEnum.GRAY
|
||||||
|
val boldRed = ColorEnum.BOLD_RED
|
||||||
|
val boldGreen = ColorEnum.BOLD_GREEN
|
||||||
|
val boldYellow = ColorEnum.BOLD_YELLOW
|
||||||
|
val boldBlue = ColorEnum.BOLD_BLUE
|
||||||
|
val boldMagenta = ColorEnum.BOLD_MAGENTA
|
||||||
|
val boldCyan = ColorEnum.BOLD_CYAN
|
||||||
|
val boldWhite = ColorEnum.BOLD_WHITE
|
||||||
|
val highlight = ColorEnum.HIGHLIGHT
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun color(action: Color.() -> ColorEnum) = Color.action()
|
||||||
|
|
||||||
|
const val nextLine = "n"
|
||||||
|
const val logger = "c"
|
||||||
|
const val logger_ = "lo"
|
||||||
|
const val logger__ = "logger"
|
||||||
|
const val clazz = "C"
|
||||||
|
const val class_ = "class"
|
||||||
|
const val date = "d"
|
||||||
|
const val date_ = "date"
|
||||||
|
const val caller = "caller"
|
||||||
|
const val line = "L"
|
||||||
|
const val line_ = "line"
|
||||||
|
const val message = "m"
|
||||||
|
const val message_ = "msg"
|
||||||
|
const val message__ = "message"
|
||||||
|
const val method = "M"
|
||||||
|
const val method_ = "method"
|
||||||
|
const val level = "p"
|
||||||
|
const val level_ = "le"
|
||||||
|
const val level__ = "level"
|
||||||
|
const val relative = "r"
|
||||||
|
const val relative_ = "relative"
|
||||||
|
const val thread = "t"
|
||||||
|
const val thread_ = "thread"
|
||||||
|
const val mdc = "X"
|
||||||
|
const val mdc_ = "mdc"
|
||||||
|
const val throwable = "throwable"
|
||||||
|
const val exception = "ex"
|
||||||
|
const val exception_ = "exception"
|
||||||
|
const val exception_short = "ex{short}"
|
||||||
|
const val exception_full = "ex{full}"
|
||||||
|
|
||||||
|
fun String.finish() = +this
|
||||||
|
operator fun String.unaryPlus() = "%$this"
|
||||||
|
operator fun String.invoke(content: Any) = "$this($content)"
|
||||||
|
operator fun String.get(content: Any) = "$this{$content}"
|
||||||
|
|
||||||
|
fun String.size(min: Int) = "$min$this"
|
||||||
|
fun String.size(min: Int? = null, max: Int) = "${min?.toString() ?: ""}.$max$this"
|
||||||
|
|
||||||
|
fun String.left() = "-$this"
|
||||||
|
fun String.left(min: Int) = "-$min$this"
|
||||||
|
fun String.left(min: Int? = null, max: Int) = "-${min?.toString() ?: ""}.$max$this"
|
||||||
|
fun String.right() = this
|
||||||
|
fun String.right(min: Int) = "$min$this"
|
||||||
|
fun String.right(min: Int? = null, max: Int) = "${min?.toString() ?: ""}.$max$this"
|
||||||
|
|
||||||
|
inline fun make(action: LogbackPattern.() -> String) = this.action()
|
||||||
|
}
|
@ -1,6 +1,89 @@
|
|||||||
package cn.tursom.log
|
package cn.tursom.log
|
||||||
|
|
||||||
|
import ch.qos.logback.classic.LoggerContext
|
||||||
|
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
|
||||||
|
import ch.qos.logback.classic.spi.ILoggingEvent
|
||||||
|
import ch.qos.logback.core.ConsoleAppender
|
||||||
|
import ch.qos.logback.core.OutputStreamAppender
|
||||||
|
import ch.qos.logback.core.rolling.RollingFileAppender
|
||||||
|
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
|
||||||
|
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
|
||||||
|
import ch.qos.logback.core.util.FileSize
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
import org.slf4j.event.Level
|
||||||
|
|
||||||
inline fun <reified T> T.slf4jLogger(): Logger = LoggerFactory.getLogger(T::class.java)
|
inline fun <reified T> T.slf4jLogger(): Logger = LoggerFactory.getLogger(T::class.java)
|
||||||
|
|
||||||
|
fun setLogLevel(level: Level, pkg: String = Logger.ROOT_LOGGER_NAME) {
|
||||||
|
val root = LoggerFactory.getLogger(pkg) as ch.qos.logback.classic.Logger
|
||||||
|
root.level = ch.qos.logback.classic.Level.toLevel(level.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setLogLevel(level: String, pkg: String = Logger.ROOT_LOGGER_NAME) = setLogLevel(Level.valueOf(level.toUpperCase()), pkg)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* desc: 策略:每份日志文件最大1000KB,真实大小可能会略大,且最多保存7天
|
||||||
|
* author: Xubin
|
||||||
|
* date: 2017/4/17 16:06
|
||||||
|
* update: 2017/4/17
|
||||||
|
*/
|
||||||
|
fun configureLogbackDirectly(logDir: String, filePrefix: String) {
|
||||||
|
val context: LoggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
|
||||||
|
val rollingFileAppender = RollingFileAppender<ILoggingEvent>().also { rollingFileAppender ->
|
||||||
|
rollingFileAppender.isAppend = true
|
||||||
|
rollingFileAppender.context = context
|
||||||
|
rollingFileAppender.encoder = PatternLayoutEncoder().also { encoder ->
|
||||||
|
encoder.pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
|
||||||
|
encoder.context = context
|
||||||
|
encoder.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val rollingPolicy = TimeBasedRollingPolicy<ILoggingEvent>()
|
||||||
|
rollingPolicy.fileNamePattern = "$logDir/${filePrefix}_%d{yyyyMMdd}_%i.log"
|
||||||
|
rollingPolicy.maxHistory = 7
|
||||||
|
rollingPolicy.setParent(rollingFileAppender)
|
||||||
|
rollingPolicy.context = context
|
||||||
|
val sizeAndTimeBasedFNATP = SizeAndTimeBasedFNATP<ILoggingEvent>()
|
||||||
|
sizeAndTimeBasedFNATP.setMaxFileSize(FileSize.valueOf("1000KB"))
|
||||||
|
sizeAndTimeBasedFNATP.context = context
|
||||||
|
sizeAndTimeBasedFNATP.setTimeBasedRollingPolicy(rollingPolicy)
|
||||||
|
rollingPolicy.timeBasedFileNamingAndTriggeringPolicy = sizeAndTimeBasedFNATP
|
||||||
|
rollingPolicy.start()
|
||||||
|
sizeAndTimeBasedFNATP.start()
|
||||||
|
rollingFileAppender.rollingPolicy = rollingPolicy
|
||||||
|
rollingFileAppender.start()
|
||||||
|
|
||||||
|
val root = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as ch.qos.logback.classic.Logger
|
||||||
|
root.addAppender(rollingFileAppender)
|
||||||
|
}
|
||||||
|
|
||||||
|
val defaultColorfulPattern = LogbackPattern.make {
|
||||||
|
+color { green }(+date)["yyyy-MM-dd HH:mm:ss.SSS"] + " " +
|
||||||
|
+color { magenta }("[${+thread}]") + " " +
|
||||||
|
+color { highlight }(+level.left(5)) + " " +
|
||||||
|
+color { cyan }("[${+logger["20"].right(20, 20)}]") + " - " +
|
||||||
|
+color { highlight }(+message) + " " +
|
||||||
|
+nextLine
|
||||||
|
}
|
||||||
|
|
||||||
|
fun colorfulConsoleLogger(appender: OutputStreamAppender<*>, pattern: String = defaultColorfulPattern) {
|
||||||
|
LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME).warn("change console color: {}", pattern)
|
||||||
|
val context: LoggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
|
||||||
|
appender.encoder = PatternLayoutEncoder().also { encoder ->
|
||||||
|
encoder.pattern = pattern
|
||||||
|
encoder.context = context
|
||||||
|
encoder.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun colorfulConsoleLogger(pattern: String = defaultColorfulPattern) {
|
||||||
|
(LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as ch.qos.logback.classic.Logger)
|
||||||
|
.iteratorForAppenders()
|
||||||
|
.forEach {
|
||||||
|
if (it is ConsoleAppender) {
|
||||||
|
colorfulConsoleLogger(it, pattern)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user