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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java 日志中 Marker 的使用示例详解

《Java日志中Marker的使用示例详解》Marker是SLF4J(以及Logback、Log4j2)提供的一个接口,它本质上是一个命名对象,你可以把它想象成一个可以附加到日志语句上的标签或戳... 目录什么是Marker?为什么使用Markejavascriptr?1. 精细化的过滤2. 触发特定操作3

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日