IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> kotlin重定向log4j2的输出到jline3 -> 正文阅读

[移动开发]kotlin重定向log4j2的输出到jline3

kotlin重定向log4j2的输出到jline3

1. 实现思路

遇到同时要用log4j2jline3的情况, 如果把log4j2直接重定向到System.out会中断jline3的输入栏,必须要找方法用lineReader.printAbove()才可以避免

解决方法就是通过自定义Appender, 实现这个只需要在写一个Appender类然后在log4j2.xml里指明就好了

2. Console类

首先先实现Jline3, 这个不是本文重点,就大概写下要提供什么
要提供lineReader主要是用到里面的printAbove方法(输出就不会打断下面的输入栏)

object Console{
	private val terminal: Terminal = /*complie code*/
	internal val lineReader: LineReader by lazy {
        LineReaderBuilder.builder().terminal(terminal).completer(NullCompleter()).build()
    }
}

3. Appender类

模板来着于Remko Popma的stackoverflow回答

package tech.eritquearcus.xxx.xxx.xxx

import org.apache.logging.log4j.core.AbstractLifeCycle
import org.apache.logging.log4j.core.Filter
import org.apache.logging.log4j.core.Layout
import org.apache.logging.log4j.core.LogEvent
import org.apache.logging.log4j.core.appender.AbstractAppender
import org.apache.logging.log4j.core.config.plugins.Plugin
import org.apache.logging.log4j.core.config.plugins.PluginAttribute
import org.apache.logging.log4j.core.config.plugins.PluginElement
import org.apache.logging.log4j.core.config.plugins.PluginFactory
import org.fusesource.jansi.Ansi
// 这个可能要手动import, 不然可能会报错Serializable是kotlin.io internal object
import java.io.Serializable

// 类名可以改,不用和name一样, name也可以改, 大概照抄下就行, 主要是append方法
@Plugin(name = "Jline3Appender", category = "Core", elementType = "appender", printObject = true)
class Jline3AppenderImpl protected constructor(
    name: String, filter: Filter?,
    layout: Layout<Serializable>, ignoreExceptions: Boolean
) : AbstractAppender(name, filter, layout, ignoreExceptions, null) {

    override fun append(event: LogEvent) {
    	// Console类在上面提供了, Ansi是色彩相关
        Console.lineReader.printAbove(String(layout.toByteArray(event)) + Ansi().reset().toString())
    }

    companion object {
		// 一定要这2个注释,不然可能会报错找不到Factory method
        @PluginFactory
        @JvmStatic 
        fun createAppender(
            @PluginAttribute("name") name: String?,
            @PluginElement("Layout") layout: Layout<Serializable>,
            @PluginElement("Filter") filter: Filter?
        ): Jline3AppenderImpl? {
            if (name == null) {
                AbstractLifeCycle.LOGGER.error("No name provided for MyCustomAppenderImpl")
                return null
            }
            return Jline3AppenderImpl(name, filter, layout, true)
        }
    }
}

4. log4j2.xml

这个文件要放在src/main/resource

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" packages="tech.eritquearcus.xxx.xxx.xxx">
    <Appenders>
        <Jline3Appender name="jline">
            <PatternLayout
                    pattern="%highlight{%d{YYYY.MM.dd HH:mm:ss} [%-5level] %logger{36} - %message}{FATAL=bg_red, ERROR=red, WARN=yellow, INFO=green}\n"
                    disableAnsi="false"/>
        </Jline3Appender>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="jline"/>
        </Root>
    </Loggers>
</Configuration>

主要就

  • Configuration写你的appender类所在的package
  • Jline3Appender这个是你的Appender类上面的@plugin注释里的name属性
  • Jline3Appender后面的name可以随便写,在下面的Loggers里的AppenderRefref写一样的就行
  • PatternLayout 里的 disableAnsi="false"是显示颜色
  • PatternLayout里其他详细配置看其他的文章,这里就不写了
end
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:30:36  更:2021-11-20 18:32:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:55:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码