iBatis使用log4j2输出日志

2023-05-16

原文链接这里

iBatis是一个老项目,2.3.4.726版本发布之后,项目改名为MyBatis,项目主页目前为http://mybatis.github.io/。

我从08年开始接触iBatis,一直使用2.3.4.726版本,直至当前的项目。iBatis恰到好处的满足了项目组在ORM、SQL维护方面的需求,所以也一直懒得换成其它同类开源软件,比如MyBatis。

最近参与新的项目开发,一切都要从零开始。为了节省时间,我直接把原项目中数据库相关操作的代码拿过来使用,发现遇到一个问题。新项目基于log4j2来输出日志,我按照求配置了iBatis相关的日志记录器之后,发现SQL执行时没有任何日志输出。iBatis在日志中输出拼装后的SQL、绑定的变量、查询返回的结果等,这对我来说是极为有用的特性,现在新项目中相关的日志都消失了,那分析SQL的正确性时就只好靠猜了。项目进度比较紧,我一开始没有时间去仔细考虑日志的问题。
好在紧急需求很快就搞定了,我终于有相对充足的时间来解决这个iBatis日志不输出的问题。项目里使用的log4j2配置文件不方便直接贴出来,精简之后如下

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<logger name="java.sql" level="debug" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="debug">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>

根据官网的资料,我反复对比过几次,确认配置文件没有问题,应该是其它地方出了问题。

找到iBatis的源码,打开iBatis创建日志记录器的类com.ibatis.common.logging.LogFactory,这个类是日志记录器的构造器工厂类,有如下的一段代码,用来定义查找日志记录器的顺序。

static
{
tryImplementation("org.apache.commons.logging.LogFactory", "com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl");
tryImplementation("org.apache.log4j.Logger", "com.ibatis.common.logging.log4j.Log4jImpl");
tryImplementation("java.util.logging.Logger", "com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
tryImplementation("java.lang.Object", "com.ibatis.common.logging.nologging.NoLoggingImpl");
}

从这段代码可以看出,iBatis支持四种记录器,分别是:

  • commons-logging
  • apache-log4j
  • JDK原生的Log系统
  • 空记录器,不记录日志

看到这段代码的时候,我秀逗的大脑突然快速转动起来。在之前的项目时,iBatis和log4j配合可以正常输出日志,原因是iBatis针对log4j实现了专门的日志记录器构造工厂;当前的这个项目基于log4j2,iBatis没有专门定制的日志记录器工厂类,所以日志无法正常输出。想到这里,日志不能输出的原因找到了,但怎么让iBatis的日志恢复正常,我踌躇了好久。考虑要不要修改iBatis的源码,仿照com.ibatis.common.logging.log4j.Log4jImpl新写一个新的日志记录器的构造器。犹豫了半天,想想还是算了,我倒是不害怕修改iBatis的源码,之前参与过的一个项目里,已经为了修改另外的问题修改过iBatis的源码,编译环境什么的都还在;为了新项目修改点源码根本不是事情,但是考虑到项目正式发布时可能要做开源软件扫描和整改,我就怂了,还是少给自己找点事情吧。
重新回到iBatis创建日志记录器工厂类的代码,琢磨半天,猜想commons-logging也许是一个突破口。假如能够通过扩展commons-logging的构造工厂来搞定问题的话,项目里不需要增加新的依赖,因为项目的lib目录下已经有commons-logging相关的jar文件了。
感谢CSDN上不知名的热心网友,我找到一份commons-logging的配置说明,按照说明在项目的代码根路径下增加了commons-logging.properties文件,内容如下

org.apache.commons.logging.Log=ibatis.Log4j2Impl

这个ibatis.Log4j2Impl类先占位,具体实现网友的那份说明里没写,唯一了解的信息是类Log4j2Impl需要实现接口org.apache.commons.logging.Log,但如何实现不清楚。好在项目里有一些开源软件使用commons-logging来记录日志,在eclipse里针对org.apache.commons.logging.Log接口按F4,查找当前已实现了接口的类,发现commons-logging自带的org.apache.commons.logging.impl.Jdk14Logger可供参考,所以直接把相关的代码抄到ibatis.Log4j2Impl里,解决掉几个编译问题之后,工厂类就大功告成,接下来就是验证iBatis是否可以正常输出。
基于iBatis写个简单的测试类,代码如下

package ibatis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class Test {

private static Logger logger = LogManager.getLogger(Test.class);
public static void main(String[] args) throws Exception {
SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(Test.class.getClassLoader().getResourceAsStream("sql-map-config.xml"));
logger.info("before query");
sqlMapClient.queryForList("User.selectSubscriberInfo");
logger.info("succeed to query");
}
}

在eclipse里执行这段代码,终于看到了久违的SQL运行日志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iBatis使用log4j2输出日志 的相关文章

  • 轻量级 ORM 而不是 hibernate - 健壮且敏捷 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我用谷歌搜索了短语 lightweight ORM for j2ee 并找到了这个页面http java source net open sou
  • 将 Jersey JUL 日志记录重定向到 Log4j2

    我需要将 Jersey 请求 响应日志重定向到我的 log4j2 我通过在我的设备上使用此代码启用了 Jersey 日志记录ApplicationJAXRS extends Application Override public Set
  • MyBatis 中单个映射器方法中的多个语句

    我有一个映射器方法来删除表中的所有记录 但首先我需要删除关联连接表中的所有记录 这是我尝试过的 Delete delete from COC BLOCK FIELD delete from COC BLOCK void deleteBloc
  • 如何在 Tomcat 8.5 中部署 Spring boot 时使用外部配置文件

    我的 Spring Boot 应用程序 2 1 1 RELEASE 作为 WAR 部署在 Debian 9 系统下的 Tomcat 8 5 服务器中 除其他外 它使用以下文件来配置应用程序 myApplication properties
  • Log4j2 自定义布局模式

    您好 我正在从 log4j 迁移到 log4j2 在我的代码中 我发现使用了一些自定义模式类 我不确定如何在 log4j2 中实现相同的功能 有人能帮我解决这个问题吗 这是我正在使用的代码 public class MyPatternLay
  • 同一日志文件中的两种模式在 log4j2 中不起作用

    我想在同一个附加程序中使用两种不同的模式配置 log4j 2 即 只要出现错误 日志文件中就应该出现特定的模式 我不是在尝试两个不同的日志文件 而是在同一日志文件中尝试两种不同的模式 每当出现错误时 我都会看到 MYDOMAINDOTCOM
  • 如何为log4jdbc配置log4j2.xml?

    有谁知道如何配置 log4j2 xml 文件以使用 log4jdbc 我已经搜索了几个小时 但似乎找不到任何东西 log4jdbc依赖SLF4J http www slf4j org 迄今为止 SLF4J 和 Log4j 2 之间还没有合适
  • 如何登录不同的文件?日志4j2

    我需要将所有信息记录到 info log 将所有警告记录到 warn log 等 并将所有日志记录到 all log 我已经创建了 log4j2 xml 配置
  • log4j2配置中RollingFile和RollingRandomAccessFile有什么区别

    在我们当前的实现中 其中一台服务器具有为 RollingRandomAccessFile 和另一个 RollingFile 设置的 log4j2 配置 如果可能的话 我想知道两者之间的区别以及各自的优缺点 Thanks 主要区别在于性能 h
  • 为什么 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息

    TL DR如果我在 log4j2 xml 配置中使用带有嵌套 KeyValuePair 的 JsonLayout 则生成的日志消息为空 有什么想法吗 很长的故事 我正在使用 Tomcat 8 5 43 以及以下与日志记录相关的 JAR Ja
  • 未遵循 Java log4j2 记录器级别

    所以我正在尝试学习 log4j2 并关注记录器及其级别和父级传播 目前我的源层次结构运行是 main java calculatorMain Main java someClass2 java someClass1 java resourc
  • 无法初始化 Log4j - SLF4JLoggerContextFactory

    我有一个使用 log4j2 运行的 jetty web 应用程序 它没有记录任何内容 并且启动时出现以下错误 错误 StatusLogger LogManager 返回了 org apache logging slf4j SLF4JLogg
  • 捕获 log4j 输出

    我们正在使用log4j2广泛地存在于我们的系统中 并对其进行配置log4j2 xml 现在我需要一个可以运行的新应用程序jobs 我想单独捕获时间 X 和 Y 之间产生的所有日志并将其放入数据库中 我们框架的正常日志记录应该照常发生 记录到
  • 在 aws lambda 上使用 Log4J2 进行日志记录 - 未找到类

    我正在尝试使用 Log4J2 日志记录 如 AWS 文档中所述 https docs aws amazon com lambda latest dg java logging html java wt logging using log4j
  • ‘源代码与字节码不匹配’使用IDEA调试JdbcTemplate

    当我使用IDEA调试JdbcTemplate源代码时 IDE提示我 源代码与字节码不匹配 截屏 我使用 mvn 来管理我的项目 我的 maven pom 配置是
  • Log4j TimeBased 触发策略中 modulate = 'true' 表示什么

    在下面的示例中 每天都会创建一个日志文件 考虑到这个例子 您能否提供一个场景来展示 modulate true 的用法 并将间隔设置为 1
  • 不同日志文件中不同级别的日志

    我们如何编写一个简单的 log4j2 xml 文件 将不同级别的日志放入不同的文件中 例如 我们有错误日志和任何信息日志 我需要将所有错误日志消息推送到一个日志文件中 并将所有信息日志消息推送到另一个文件中 我希望 InfoControll
  • 使用log4j2.xml初始化slf4j

    我想使用 slf4j 而不是 log4j 我在 pom xml 中添加了以下依赖项 我对 slf4j 使用 1 7 25 对 log4j2 使用 2 10 0
  • 使用 JDK8 时,LogManager.getLogger 会使应用程序停止大约 10-30 秒:

    更新 1 我做了更多测试 删除了大部分库并注释掉了库特定代码 导致了相同的行为 这让我得出结论 这个问题不是 直接 由这些库引起的 但似乎是我的一个普遍问题代码和 或设置 这里的主要问题是我不明白为什么它在从 Eclipse 内部启动时运行
  • 插入时的 iBatis 判别器

    我有一个抽象类Example以及与之相伴的具体子类 我使用鉴别器来提取数据out数据库的 像这样

随机推荐

  • mac 安装完anaconda后找不到tensorflow包,pip install 无效

    一 问题 重新安装完anaconda后 在jupyter里安装tensorflow包出现错误 xff1a pip install tensorflow Could span class token keyword not span find
  • TYUT太原理工大学2022操作系统学习通总结

    第1章 选择 xff08 高级程序设计语言的编译器 xff09 不是操作系统关心的主要问题多道批处理系统的主要缺点是 xff08 缺少交互性 xff09 在操作系统中 xff0c xff08 进程通信服务例行子程序 xff09 部分属于微内
  • mariaDB安装

    打开mariaDB官网 官网地址 xff1a https mariadb org 点击DownLoad后跳转到如下界面 在该界面下选择MariaDB Repositories xff0c 然后根据自己的需求选择mairadb要装在什么系统下
  • 2021-07-10

    标题SQL sever基础语法 语法简介 xff1a l Create database 数据库名 xff1b l Use database 数据库名 xff1b l SQL对字母大小写不敏感 xff1b l 文本或字符串用单引号 xff1
  • Linux的基本操作(1)

    Linux的基本操作 xff08 1 xff09 1 1登录方式 1 远程登录 Linux允许同一用户在不同的控制台上以相同的身份或不同身份多次登录 xff0c 同时进行多项工作 各控制台上的交互过程石相互独立的 Login 账号 cher
  • 快速记忆常用排序

    选泡插 xff0c 快归堆希桶计基 xff0c 恩方恩老恩一三 xff0c 对恩加k恩乘k xff0c 不稳稳稳不稳稳 xff0c 不稳不稳稳稳稳
  • ssh常用命令50条

    SSH xff08 Secure Shell xff09 是一种用于远程登录 数据传输和命令执行的安全协议 下面列举了 SSH 命令的一些常见用法 xff1a 连接到远程主机 xff1a ssh username 64 hostname 其
  • Kail虚拟机的安装教程

    本指南是关于在 VMware 内部虚拟化 Kali Linux xff0c 让您拥有 Kali VM 这是使用 Kali 的好方法 xff0c 因为它与主机完全分离 xff0c 允许您与其他虚拟机 xff08 以及主机和网络上的其他机器 x
  • JDBC Connection Reset问题分析

    2014年 7 月 13 日 半年前开始 xff0c 项目组测试MM 在验证功能时 xff0c 经常报怨讲测试环境上的应用在启动时很慢 xff0c 偶尔会报失败 xff0c 遇到类似问题多数情况下重新启动一次就可以启动成功 xff0c 但少
  • 安卓DataBinding出现ActivityMainBinding类不存在

    安卓中并不存在ActivityMainBinding这个类 xff0c 这个类是在XML布局的最外层加入 lt layout gt lt layout gt 就会自动生成 如果你的XML布局的名字叫做 34 activity main 34
  • Ubuntu18.04配置交叉编译器,解压安装以后无法查到编译器的版本号

    在进行嵌入式linux开发时 xff0c 有时需要安装特定交版本的交叉编译器 xff0c 这就需要我们手动安装 xff0c 在解压安装安好并且设置了路径 xff0c 我们会发现查不到编译器的版本号 xff0c 也就是仍然无法使用交叉编译器
  • MySQL万字精华总结!你连基础的JVM运行时内存布局都忘了?含面试题+答案

    前言 Netty 是一款基于 Java 的网络编程框架 xff0c 能为应用程序管理复杂的网络编程 多线程处理以及并发 Netty 隐藏了样板和底层代码 xff0c 让业务逻辑保持分离 xff0c 更加易于复用 使用 Netty 可以得到一
  • 获取Spring中@PathVariable注解里带点的完整参数

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 使用 oh-my-posh 美化 windows terminal,让其接近oh-my-zsh

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 数据结构实验报告-01

    一 实验目的和要求 要求 1 按照群文件中的报告内容 xff0c 首先进行设计工作并加以文字记录 xff0c 然后编写代码 xff0c 测试 xff0c 分析 xff0c 再二次完善报告 xff0c 形成完整的文字记录 2 再次强调 xff
  • flutter面试题,覆盖所有面试知识点,面试必会

    为什么想跳槽 xff1f 简单说一下当时的状况 xff0c 我在这家公司做了两年多 xff0c 这两年多完成了一个大项目 xff0c 作为开发的核心主力 xff0c 开发压力很大 xff0c 特别是项目上线前的几个月是非常辛苦 xff0c
  • 删除docker容器中的文件,你还看不明白?

    原理讲解前 xff0c 先看一个最经典的业务场景 xff0c 如开发一个电商网站 xff0c 要实现支付订单的功能 xff0c 流程如下 xff1a 创建一个订单之后 xff0c 如果用户立刻支付了这个订单 xff0c 我们需要将订单状态更
  • 实战Compose——做个简洁却不简单的星球打卡App

    Focus Focus是一款帮助你集中的app 为自己的目标建立星球 xff0c 将时间投入在上面 花在星球上的每一分钟都会被记录 xff0c 每颗星球可以定制颜色与外观 为了贯彻简单干净不让人分心的设计理念 xff0c app采用白灰为主
  • android 截屏实现的几种方式

    Android 截屏分为四种 xff1a View 截屏 WebView 截屏 系统截屏 和 adb 截屏 1 View 截屏 View 截图是将当前 View 界面截取下来 xff0c 而对于屏幕上其他信息比如 xff1a 状态栏或其他应
  • iBatis使用log4j2输出日志

    原文链接这里 iBatis是一个老项目 xff0c 2 3 4 726版本发布之后 xff0c 项目改名为MyBatis xff0c 项目主页目前为http mybatis github io 我从08年开始接触iBatis xff0c 一