Log4j单独设置Mybatis sql语句日志级别

合集下载

log4j自定义日志等级

log4j自定义日志等级

log4j自定义日志等级log4j自定义日志等级,步骤如下1.继承logj的level类,定义一个自己的日志级别:public class TestLevel extends Level { public TestLevel(int level, String levelStr, int syslogEquivalent) {super(level, levelStr, syslogEquivalent);}}2.继承Filter类,定义一个自己的filter:public class MyLogFiter extends Filter {/*** Do we return ACCEPT when a match occurs. Default is* <code>false</code>, so that later filters get run by default */boolean acceptOnMatch = false;int levelMin;int levelMax;/*** Return the decision of this filter.*/@Overridepublic int decide(LoggingEvent event) {int inputLevel = event.getLevel().toInt();if (inputLevel >= levelMin && inputLevel <= levelMax) {return Filter.ACCEPT;}return Filter.DENY;}/*** Get the value of the <code>LevelMax</code> option.*/public int getLevelMax() {return levelMax;}/*** Get the value of the <code>LevelMin</code> option.*/public int getLevelMin() {return levelMin;}/*** Get the value of the <code>AcceptOnMatch</code> option.*/public boolean getAcceptOnMatch() {return acceptOnMatch;}/*** Set the <code>LevelMax</code> option.*/public void setLevelMax(int levelMax) {this.levelMax = levelMax;}/*** Set the <code>LevelMin</code> option.*/public void setLevelMin(int levelMin) {this.levelMin = levelMin;}* Set the <code>AcceptOnMatch</code> option.*/public void setAcceptOnMatch(boolean acceptOnMatch) { this.acceptOnMatch = acceptOnMatch;}}3.在不侵入log4j源代码的情况下,对log4j的logger输出进行封装,并且添加自己定义的级别的输出方法:public class Logger {private final static int priority = 40100;private final org.apache.log4j.Logger logger;private static final String FQCN;//以下为自定义的日志级别public static final Level PAY_LEVEL = new TestLevel(priority, “TEST”, SyslogAppender.LOG_LOCAL0);static {FQCN = Logger.class.getName();}private Logger(Class<?> clazz) {logger = org.apache.log4j.Logger.getLogger(clazz);}private Logger() {logger = org.apache.log4j.Logger.getRootLogger();}public static Logger getLogger(Class<?> clazz) {return new Logger(clazz);}public static Logger getRootLogger() {return new Logger();public void test(Object message) {forcedLog(logger, PAY_LEVEL, message);}public void test(Object message, Throwable t) {forcedLog(logger, PAY_LEVEL, message, t);}private static void forcedLog(org.apache.log4j.Logger logger, Level level, Object message) {logger.callAppenders(new LoggingEvent(FQCN, logger, level, message, null));}private static void forcedLog(org.apache.log4j.Logger logger, Level level, Object message, Throwable t) {logger.callAppenders(new LoggingEvent(FQCN, logger, level, message, t));}}4.修改log4j的xml配置文件,添加自定义的appender:<appender name=”TEST”><param name=”File” value=”/var/Test.log”/><param name=”Append” value=”true”/><param name=”DatePattern” value=”‘.’yyyy-MM-dd-HH”/><param name=”BufferedIO” value=”true”/><!– 8K为一个写单元–> <param name=”BufferSize” value=”8192″/> <layout><param name=”ConversionPattern”value=”%d{yyyy-MM-dd HH:mm:ss}\t%F\t%L\t%M\t%m%n”/></layout><filter class=”MyLogFiter”><param name=”LevelMin” value=”40100″/><param name=”LevelMax” value=”40100″/></filter></appender>5.在需要输出日志的地方使用封装的logger输出方法即可:logger.test(“hahaha,test”);。

log4j2动态修改日志级别及拓展性使用

log4j2动态修改日志级别及拓展性使用

log4j2动态修改⽇志级别及拓展性使⽤⼀、供参考的完整⽇志配置<?xml version="1.0" encoding="UTF-8"?><!-- 配置LoggerConfig,即Appenders的⽇志级别为WARN --><Configuration status="WARN"><!-- 定义下⾯的引⽤名 --><Properties><property name="basePath">${sys:vmparam}</property><property name="filePath">${basePath}/app.log</property></Properties><!-- Appenders⽀持配置多个Appender,⽀持向不同的⽬标输送⽇志,本例为配置向控制台输出 --><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><!-- 将⽇志输出到指定位置的⽂件中 --><RollingFile name="RollingFile" fileName="${filePath}"filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"><Policies><!-- interval单位为filePattern最后⼀个单位,此处为6⼩时,modulate若为true,则⽇志时间将以0点为边界进⾏偏移计算,由于加了.gz策略,所以此处意思为每隔6⼩时,便会新⽣成⼀个log4j2的压缩⽂件,当每个⽂件超过250M时,也会新⽣成⼀个log4j2的压缩⽂件 --><TimeBasedTriggeringPolicy interval="6" modulate="true"/><SizeBasedTriggeringPolicy size="250 MB"/></Policies><!-- 滚动策略,⽇志⽂件最多保留20个 --><DefaultRolloverStrategy max="20"/><!-- 最多备份30天以内||⽇志⽂件⼤⼩达到100GB的⽇志||⽂件数量超过⼗个此处为策略限制,Delete中可以按⾃⼰需要⽤正则表达式编写 --><DefaultRolloverStrategy><Delete basePath="${filePath}" maxDepth="1"><IfFileName glob="logs_*.log"/><IfLastModified age="30d"/><IfAccumulatedFileSize exceeds="100 GB"/><IfAccumulatedFileCount exceeds="10"/></Delete></DefaultRolloverStrategy></RollingFile></Appenders><!-- Loggers⽀持配置多个Logger,可引⽤不同的⽬标Appender,也可根据业务需求定制特定要求的Appender --><Loggers><AsyncLogger name="AsyncLogger" level="trace"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></AsyncLogger><asyncRoot level="trace"><appender-ref ref="Console"/></asyncRoot><Root level="info"><!-- <AppenderRef ref="Console" /> --><AppenderRef ref="RollingFile"/></Root><!-- 第三⽅⽇志系统 --><logger name="org.springframework" level="INFO" additivity="false"><appender-ref ref="Console"/></logger><logger name="ty" level="warn"/><logger name="org.apache.http" level="warn"/><logger name="org.mongodb.driver" level="INFO"/><logger name="ty" level="warn"/><logger name="org.springframework.data.redis" level="INFO"/></Loggers></Configuration>⼆、动态修改⽇志级别Collection<org.apache.logging.log4j.core.Logger> current = LoggerContext.getContext(false).getLoggers();Collection<org.apache.logging.log4j.core.Logger> notcurrent = LoggerContext.getContext().getLoggers();Collection<org.apache.logging.log4j.core.Logger> allConfig = current;allConfig.addAll(notcurrent);for (org.apache.logging.log4j.core.Logger log:allConfig){log.setLevel(Level.DEBUG);} 三、⾃定义appender 以上介绍,均依赖于log4j2提供的官⽅配置,当对⽇志的业务逻辑复杂时,光靠配置也许满⾜不了需要,此时我们会想⾃⼰能操控打印的⽇志,做⽇志的路由,或保存等操作,这个时候就需要有⾃定义的appender,可以配置的就靠配置完成,不能的就⾃⼰写代码⼲预,⽽log4j2刚好提供了这样的拓展性。

log4j配置详解(非常详细)

log4j配置详解(非常详细)

log4j配置详解(⾮常详细)Log4J的配置⽂件(Configuration File)就是⽤来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。

通过配置,可以创建出Log4J的运⾏环境。

1. 配置⽂件Log4J配置⽂件的基本格式如下:2. 在代码中初始化Logger:1)在程序中调⽤BasicConfigurator.configure()⽅法:给根记录器增加⼀个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG.2)配置放在⽂件⾥,通过命令⾏参数传递⽂件名字,通过PropertyConfigurator.configure(args[x])解析并配置;3)配置放在⽂件⾥,通过环境变量传递⽂件名等信息,利⽤log4j默认的初始化过程解析并配置;4)配置放在⽂件⾥,通过应⽤服务器配置传递⽂件名等信息,利⽤⼀个特殊的servlet来完成配置。

3. 为不同的 Appender 设置⽇志输出级别:当调试系统时,我们往往注意的只是异常级别的⽇志输出,但是通常所有级别的输出都是放在⼀个⽂件⾥的,如果⽇志输出的级别是BUG!?那就慢慢去找吧。

这时我们也许会想要是能把异常信息单独输出到⼀个⽂件⾥该多好啊。

当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold就能实现,⽐如下⾯的例⼦:运⾏⼀下,看看异常信息是不是保存在了⼀个单独的⽂件error.log中。

----------------------------------------------------------------------------------------------------------------------------------------------------资料:============================================================================================= =============================================================================================== log4j.properties⽂件例⼦1.================================================================这个⽂件就是本⽂的重点,也就是log4j的配置⽂件。

Java开发日志分析工具Log4j使用详解

Java开发日志分析工具Log4j使用详解

Java开发日志分析工具Log4j使用详解Log4j是一个用于记录应用程序运行时日志的Java开发工具。

它可以帮助开发人员更好地理解和监控应用程序的运行状态,以及解决潜在的问题。

下面将详细介绍Log4j的使用方法和功能。

一、Log4j的配置文件Log4j使用一个名为log4j.properties的配置文件来定义日志的输出格式、日志级别、输出目标等。

这个配置文件需要放在应用程序的classpath下,以便Log4j能够找到它并加载配置。

配置文件中的每一个配置项都有一个特定的名称和对应的值。

例如,可以使用"log4j.rootLogger"配置项来设置根日志记录器的级别,使用"log4j.appender.console"配置项来设置控制台输出的格式等。

二、Log4j的日志级别Log4j提供了多个日志级别,用于控制日志的输出。

这些日志级别按照严重程度递增,包括TRACE、DEBUG、INFO、WARN、ERROR和FATAL。

可以通过配置文件中的"log4j.rootLogger"配置项来设置根日志记录器的级别,从而决定哪些级别的日志会被记录。

三、Log4j的输出目标Log4j可以将日志输出到不同的目标,包括控制台、文件、数据库等。

可以通过配置文件中的"log4j.appender"配置项来设置输出目标。

常用的输出目标有:1. ConsoleAppender:将日志输出到控制台。

2. FileAppender:将日志输出到文件。

3. RollingFileAppender:将日志输出到滚动文件,可以设置文件的大小和数量,以便自动滚动日志文件。

4. JDBCAppender:将日志输出到数据库。

四、Log4j的日志格式Log4j可以自定义日志的输出格式。

可以通过配置文件中的"log4j.appender"配置项来设置输出格式。

Mybatis的Log4j日志输出问题-以及有关日志的所有问题

Mybatis的Log4j日志输出问题-以及有关日志的所有问题

Mybatis的Log4j⽇志输出问题-以及有关⽇志的所有问题使⽤Mybatis的时候,有些时候能输出(主要是指sql,参数,结果)⽇志。

有些时候就不能。

⽆法输出⽇志的时候,⽆论怎么配置log4j,不管是properties的还是xml的,都不起作⽤。

有些时候,我们没做什么配置就能输出⽇志....这是⼀个让⽆数⼈烦躁的问题。

其实解决问题很容易(我过了这么久才解决,以前都⽤拦截器输出)。

这是⼀个普⼤喜奔的⽇⼦,让我们⼀起来看看如何解决mybatis的⽇志问题。

为什么说这个问题很容易解决呢?因为mybatis的⽂档写的很清楚。

为什么我们都没找到解决办法呢?因为即使看过⽂档的⼈,也未必去看Logging这⼀节。

但是这⼀节正是解决问题的关键。

已经等不及的⼩伙伴们可以直接去这⾥看⽂档:提醒最常⽤的⽅法不再这个链接中,但是这个⽂档提供了对log4j的详细配置。

本⽂下⾯的内容⼤部分是这个⽂档的Copy。

Mybatis内置的⽇志⼯⼚提供⽇志功能,具体的⽇志实现有以下⼏种⽅式:SLF4JApache Commons LoggingLog4j 2Log4jJDK logging具体选择哪个⽇志实现由MyBatis的内置⽇志⼯⼚确定。

它会使⽤最先找到的(按上⽂列举的顺序查找)。

如果⼀个都未找到,⽇志功能就会被禁⽤。

不少应⽤服务器的classpath中已经包含Commons Logging,如Tomcat和WebShpere,所以MyBatis会把它作为具体的⽇志实现。

记住这点⾮常重要。

这意味着,在诸如 WebSphere的环境中——WebSphere提供了Commons Logging的私有实现,你的Log4J配置将被忽略。

这种做法不免让⼈悲摧,MyBatis怎么能忽略你的配置呢?事实上,因Commons Logging已经存在,按优先级Log4J⾃然就被忽略了!不过,如果你的应⽤部署在⼀个包含Commons Logging的环境,⽽你⼜想⽤其他的⽇志框架,你可以根据需要调⽤如下的某⼀⽅法:eSlf4jLogging();eLog4JLogging();eJdkLogging();eCommonsLogging();eStdOutLogging();如果的确需要调⽤以上的某个⽅法,请在调⽤所有其他MyBatis⽅法前调⽤它。

Mybatis日志配置文件

Mybatis日志配置文件

Mybatis⽇志配置⽂件log4j.properties#log4j⽇志级别如下:#A:off 最⾼等级,⽤于关闭所有⽇志记录。

#B:fatal 指出每个严重的错误事件将会导致应⽤程序的退出。

#C:error 指出虽然发⽣错误事件,但仍然不影响系统的继续运⾏。

#D:warn 表明会出现潜在的错误情形。

#E:info ⼀般和在粗粒度级别上,强调应⽤程序的运⾏全程。

#F:debug ⼀般⽤于细粒度级别上,对调试应⽤程序⾮常有帮助。

#G:all 最低等级,⽤于打开所有⽇志记录。

#但log4j只建议使⽤4个级别,优先级从⾼到低分别是:#error>warn>info>debuglog4j.rootLogger =debug,systemOut,logFile#输出到控制台log4j.appender.systemOut = org.apache.log4j.ConsoleAppenderyout = org.apache.log4j.PatternLayoutyout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%nlog4j.appender.systemOut.Target = System.out#输出到⽂件log4j.appender.logFile = org.apache.log4j.FileAppenderyout = org.apache.log4j.PatternLayoutyout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%nlog4j.appender.logFile.File = log/log4j.loglog4j.appender.logFile.Encoding = UTF-8#将⽇志输记录到MySQL数据库#log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender#yout = org.apache.log4j.PatternLayout#log4j.appender.logDB.Driver = com.mysql.jdbc.Driver#log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/log4j?characterEncoding=utf-8#er = root#log4j.appender.logDB.Password = root#log4j.appender.logDB.Sql = INSERT INTO t_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('mybatis','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')⽇志⽂件输出⽅式有三种:输出到控制台,输出到⽂件,输出到数据库。

log4j配置详解

log4j配置详解
在配置文件中这样配置的:

yout =className yout.Option1 = value1 … yout.OptionN = valueN
Appender
Appender用来规定日志输出的目的地是哪里,可以是控制台,文件,数据库等等。 常见的Appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台) org.apache.log4j.FileAppender(文件) org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文 件) org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置Logger

log4j.rootLogger = [ level ] , appenderName1, appenderName2, … .apache=false # 表示示Logger不会在父父Logger的appender里里输 出,默认为true。
配置Layout

yout=className
常见的className如下:
org.apache.log4j.HTMLLayout(以HTML表格形式布局) org.apache.log4j.PatternLayout(可以灵活地指定布局模式) org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

log4j打印mybatis执行sql,将占位符换成真实的参数输出

log4j打印mybatis执行sql,将占位符换成真实的参数输出

log4j打印mybatis执⾏sql,将占位符换成真实的参数输出背景:在我⽇常码代码的时候,由于对mybatis的动态sql,⽐较依赖,并且有时候需求复杂,导致sql较长,⽽且参数众多,当出现问题是,需要将sql,放到navicat⾥⾯去执⾏查看结果,但是对于复杂的sql来说,众多的参数,⼀个⼀个替换。

当真很⿇烦,于是萌⽣出可不可以将sql直接输出,不在出线sql和参数分开的情况,可以减少很多⿇烦,在我找度娘,⼀次⼜⼀次的尝试,我还是没有发现,在log4j的配置⽂件⾥⾯。

有这个功能,所以最后萌⽣出改写源码的想法,之后我也会尝试继续寻找,有没有官⽅的API提供,本⽂讲述我⾃⼰改写源代码实现的⽅案⼀、针对DEMO搭建SSM项⽬(略)⼆、采⽤的log4j的版本(这⾥由于log的众多实现,有可能出线log4j的冲突,⽽且我也没有滤的特别清楚,所以贴出⾃⼰使⽤的log4j的版本,采⽤maven提供)[html]1. <span style="white-space:pre;"> </span><!-- log4j ⽇志 -->2. <dependency>3. <groupId>log4j</groupId>4. <artifactId>log4j</artifactId>5. <version>${log4j-version}</version>6. </dependency>三、⾸先实现输出mybatis输出sql1、引⼊jar包(同上)2、配置mybatis输出sql的配置项[html]1. <span style="white-space:pre;"> </span><settings>2. <setting name="logImpl" value="LOG4J" />3. </settings>3、添加logj4j.properties⽂件[plain]1. #logFile2. log4j.rootLogger=DEBUG,Console3. #Console4. log4j.appender.Console=org.apache.log4j.ConsoleAppender5. log4j.appender.console.Threshold=INFO6. log4j.appender.console.ImmediateFlush=true7. log4j.appender.Console.Target=System.out8. yout=org.apache.log4j.PatternLayout9. yout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss}[%t] %l: %x%m%n10.11. # ⽇志⽂件(logFile)12. log4j.appender.logFile=org.apache.log4j.FileAppender13. log4j.appender.logFile.Threshold=DEBUG14. # ⽴即输出15. #log4j.appender.logFile.ImmediateFlush=true16. #log4j.appender.logFile.Append=true17. #log4j.appender.logFile.File=D:/logs/log.log4j18. #yout=org.apache.log4j.PatternLayout19. #yout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss}[%t] %l: %x%m%n20.21. .apache=ERROR22. .mybatis=ERROR23. .springframework=ERROR24. #这个需要25. log4j.logger.log4jdbc.debug=ERROR26.27. log4j.logger.jdbc.audit=ERROR28. log4j.logger.jdbc.resultset=ERROR29. #这个打印SQL语句⾮常重要30. log4j.logger.jdbc.sqlonly=DEBUG31. log4j.logger.jdbc.sqltiming=ERROR32. log4j.logger.jdbc.connection=FATAL4、测试结果[plain]1. ==> Preparing: select u.id as id , as name , u.pwd as pwd from user u where u.pwd = ? and u.id = ?;2. ==> Parameters: 123(String), 1(String)3. <== Total: 0显然:参数和sql是分离的,现在要实现将参数嵌套进sql中,实现上⾯的想法通过源码的分析最后我决定动(org.apache.ibatis.logging.jdbc.BaseJdbcLogger)这个类,它的作⽤是输出最后的sql ⽅法步骤:1、找到这个类的全路径,找到源码2、在src下创建⼀个同路径下的BaseJdbcLogger类,并且将源码原封不动的贴近刚创建的类,3、找到需要修改的⽅法,我贴⼀下我准备修改的⽅法[java]1. protected void debug(String text, boolean input) {2. if (statementLog.isDebugEnabled()) {3. statementLog.debug(prefix(input) + text);4. }5. }⽬前的这个是BaseJdbcLogger.debug的源码,其中(text:是需要打印的⽂本,input:表⽰前⾯的“==>”的⽅向)经过我的修改:[java]1. /* 打印的sql */2. private static String sql = "";3. protected void debug(String text, boolean input) {4. text = text.trim();5. if (statementLog.isDebugEnabled()) {6. if(text.startsWith("Preparing:")){7. sql = text.substring(text.indexOf(":")+1);8. return ;9. }10. if(text.startsWith("Parameters:")){11. String temp = text.substring(text.indexOf(":")+1);12. String[] split = temp.split(",");13. if(split != null & split.length > 0){14. for (String string2 : split) {15. String s = string2.trim();16. sql = sql.replaceFirst("\\?", s.substring(0, s.indexOf("(")));17. }18. }19. text = "Preparing:"+ sql ;20. sql = "";21. }22. statementLog.debug(prefix(input) + text);23. }24. }最终输出结果:[plain]1. ==> Preparing: select u.id as id , as name , u.pwd as pwd from user u where u.pwd = 123 and u.id = 1;2. <== Total: 0到到最终⽬的(虽然不是最好的⽅法,mybatis应该分装相应的配置,但是我没有发现,如果有码友发现了,请告知我,谢谢)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档