kettle源码分析之5 日志系统

2024-09-02 12:18

本文主要是介绍kettle源码分析之5 日志系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • core
  • 消息体

https://blog.csdn.net/weixin_39819880/article/details/88087652

core

用过kettle的人都有体会,spoon的使用机制是swing的gui开发,在整个过程的机理会使用大量的事件监听。日志系统也一样。

loglevel级别分为:
NOTHING( 0, “Nothing” ),
ERROR( 1, “Error” ),
MINIMAL( 2, “Minimal” ),
BASIC( 3, “Basic” ),
DETAILED( 4, “Detailed” ),
DEBUG( 5, “Debug” ),
ROWLEVEL( 6, “Rowlevel” );

核心类是KettleLogStore,进行日志存储。

/*** Create the central log store with optional limitation to the size** @param maxSize*          the maximum size* @param maxLogTimeoutMinutes*          The maximum time that a log line times out in Minutes.*/private KettleLogStore( int maxSize, int maxLogTimeoutMinutes, boolean redirectStdOut, boolean redirectStdErr ) {this.appender = new LoggingBuffer( maxSize );replaceLogCleaner( maxLogTimeoutMinutes ); // 根据超时事件定时清理超时日志if ( redirectStdOut ) {System.setOut( new LoggingPrintStream( OriginalSystemOut ) );}if ( redirectStdErr ) {System.setErr( new LoggingPrintStream( OriginalSystemErr ) );}}
  public void replaceLogCleaner( final int maxLogTimeoutMinutes ) {if ( logCleanerTimer != null ) {logCleanerTimer.cancel();}logCleanerTimer = new Timer( true );TimerTask timerTask = new TimerTask() {@Overridepublic void run() {if ( maxLogTimeoutMinutes > 0 ) {long minTimeBoundary = new Date().getTime() - maxLogTimeoutMinutes * 60 * 1000;// Remove all the old lines.appender.removeBufferLinesBefore( minTimeBoundary );}}};// Clean out the rows every 10 seconds to get a nice steady purge operation...logCleanerTimer.schedule( timerTask, 10000, 10000 );}

同时,其中的discardLines方法会将某个id及其子元素的日志都remove掉。
在这里插入图片描述
以任务执行为例,首先进入流程清理过期日志:
在这里插入图片描述
进行删除转换/任务或者disposeListner生效的时候,删除日志:
在这里插入图片描述
在这里采用事件机制处理是很巧妙的方式,提前添加监听,通过事件处理日志,实现了解耦。
实际的消息存储:LoggingRegistry
默认10000条日志,这个值可以通过设置环境变量处理,在启动bat/sh文件里进行处理。
在这里插入图片描述

消息体

日志消息是通过LogMessage进行的,日志通道可以参考LogChannel:

public void println( LogMessageInterface logMessage, LogLevel channelLogLevel ) {String subject = null;LogLevel logLevel = logMessage.getLevel();if ( !logLevel.isVisible( channelLogLevel ) ) {return; // not for our eyes.}if ( subject == null ) {subject = "Kettle";}// Are the message filtered?//if ( !logLevel.isError() && !Utils.isEmpty( filter ) ) {if ( subject.indexOf( filter ) < 0 && logMessage.toString().indexOf( filter ) < 0 ) {return; // "filter" not found in row: don't show!}}// Let's not keep everything...if ( channelLogLevel.getLevel() >= logLevel.getLevel() ) {KettleLoggingEvent loggingEvent = new KettleLoggingEvent( logMessage, System.currentTimeMillis(), logLevel );KettleLogStore.getAppender().addLogggingEvent( loggingEvent );// add to bufferLogChannelFileWriterBuffer fileWriter = LoggingRegistry.getInstance().getLogChannelFileWriterBuffer( logChannelId );if ( fileWriter != null ) {fileWriter.addEvent( loggingEvent );}}}

LogChannel没添加一个日志事件,就循环遍历监听器,添加事件

  public void addLogggingEvent( KettleLoggingEvent loggingEvent ) {doAppend( loggingEvent );eventListeners.forEach( event -> event.eventAdded( loggingEvent ) );}

对于kettle日志对象有3类:KettleLoggingEvent,

FileLoggingEventListener
ConsoleLoggingEventListener
Slf4jLoggingEventListener

都继承于KettleLoggingEventListener。

LoggingRegistry是一个单例对象,

这篇关于kettle源码分析之5 日志系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129933

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字