kettle使用log4j管理输出日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

在使用kettle进行数据分析和清洗时日志非常多而且杂乱,使用原有的日志有时找不到异常的位置,有时日志不够详细,说简单一点就是日志不是我们想要的。因而对kettle日志进行相应的管理就想得尤为重要了。大家都知道java最常用的日志管理包log4j可以很好地实现java日志的管理,然而kettle是使用java开发的,因而log4j是个不二的选择。好了说了这么多,下面看看kettle怎么使用log4j进行日志的管理吧。

1、kettle加载和使用log4j

在转换的JavaScript中添加log4j的支持

复制代码
//Script here
//updateOuputLog();
//confFile  日志配置文件路径
//增加日志输出文件
//通过/../conf/log.xml文件配置日志输出
function updateOutputLog(confFile){
   var first = getVariable("FIRST_TIME_UPDATE_LOG", "true");
   if(first == "true"){
       logWriter = org.pentaho.di.core.logging.LogWriter.getInstance();
       var softPath = getThisSoftPath();
       setVariable("WORKDIR", softPath, "s");//设置日志路径变量
       var logConf = softPath + "/../conf/log.xml";
       if(confFile != null && confFile != ""){
          logConf = softPath + "/" + confFile;
       }else{
          if(!fileExists(logConf)){
              logConf = softPath + "/log.xml";
          }
          if(!fileExists(logConf)){
              logConf = softPath + "/conf/log.xml";
          }
       }
       writeToLog("m", "======logConfPath====>"+logConf);
       org.apache.log4j.xml.DOMConfigurator.configure(logConf);
       var logger = org.apache.log4j.Logger.getLogger("kettle_log");
       var appenders = logger.getAllAppenders();
       while(appenders.hasMoreElements()){
          var appender = appenders.nextElement();
          writeToLog("m", "======add==log====>"+appender.getName());
          logWriter.addAppender(appender);
       }
       setVariable("FIRST_TIME_UPDATE_LOG", "false", "r");
   }
}

//Alert(getThisSoftPath());
//返回程序所在目录 不带前缀file:
function getThisSoftPath(){
    var osName = java.lang.System.getProperty("os.name").toLowerCase();
    var path = getVariable("Internal.Transformation.Filename.Directory", "");
    if(osName.indexOf("windows") >= 0){//WINDOWS系统
        path = path.substring(8);
    }else{
        path = path.substring(7);
    }
    return path;
}

function getConfigPath(softDir,confPath,splitStr){
    var arr = confPath.split(splitStr);
    var str = softDir+arr[0];
    for(var i=1; i<arr.length; i++){
       var s = new java.lang.String(arr[i]);
       if(arr[i] != null && s.endsWith("properties")){
           str = str + splitStr + softDir+ arr[i];
       }
    }
    //Alert(str);
    return str;
}
复制代码

2、准备log4j配置文件log.xml

复制代码
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="kettle_info" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="threshold" value="info" />
        <param name="File" value="${WORKDIR}/../log/run.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p (%F:%L) -> %m%n" />
        </layout>
    </appender>
    <appender name="kettle_error" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="threshold" value="error" />
        <param name="File" value="${WORKDIR}/../log/error.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p (%F:%L) -> %m%n" />
        </layout>
    </appender>
    <logger name="kettle_log">
        <appender-ref ref="kettle_info" />
        <appender-ref ref="kettle_error" />
    </logger>
</log4j:configuration>
复制代码

此处需要注意log4j日志的存放路径,路径由变量${WORKDIR}控制,存放路径为项目根目录下的log目录。

3、测试

  运行结果:

复制代码
2011-06-08 09:50:28,897 INFO  (LogWriter.java:450) -> 设置默认配置文件.0 - ======add==log====>kettle_error
2011-06-08 09:50:28,897 INFO  (LogWriter.java:450) -> 设置默认配置文件.0 - 增加配置日志成功
2011-06-08 09:50:28,912 INFO  (LogWriter.java:450) -> 设置默认配置文件.0 - E:/test/src/../conf/config_static.properties
2011-06-08 09:50:28,912 INFO  (LogWriter.java:450) -> 设置默认配置文件.0 - 完成处理 (I=0, O=0, R=1, W=1, U=1, E=0
2011-06-08 09:50:28,943 INFO  (LogWriter.java:450) -> 拆分路径 2.0 - 完成处理 (I=0, O=0, R=1, W=1, U=1, E=0
2011-06-08 09:50:28,943 INFO  (LogWriter.java:450) -> 读取配置文件.0 - 配置文件:TO_DB_PWD1=test
2011-06-08 09:50:28,943 INFO  (LogWriter.java:450) -> 配置文件输入.0 - 完成处理 (I=20, O=0, R=1, W=20, U=20, E=0
2011-06-08 09:50:28,943 INFO  (LogWriter.java:450) -> 读取配置文件.0 - 配置文件:DEST_DB_UNAME2=test
复制代码

 注:11年测试的日志文件






本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/4545818.html,如需转载请自行联系原作者
相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
5月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
629 54
|
11月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2982 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
10月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
262 9
|
8月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
639 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
7月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
548 13
|
7月前
|
缓存 Java 编译器
|
8月前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
284 5
图解MySQL【日志】——Redo Log
|
9月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
360 7
MySQL事务日志-Undo Log工作原理分析
|
7月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
855 0