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程序进程起来了但是不打印日志的原因分析

《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 子字

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++