• Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合


    作者:13
    GitHub:https://github.com/ZHENFENG13
    版权声明:本文为原创文章,未经允许不得转载。

    前言

    上一篇文章主要讲述了一下syso和Log间的一些区别与比较,重点是在项目的日志功能上,因此,承接前文《[Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log](http://www.cnblogs.com/han-1034683568/p/6637914.html)》,本文是一个较为直观的日志功能案例,java的日志框架很多,如Log4j、Log4j2、logback、SLF4J,篇幅有限,所以本篇只介绍一下Log4j,并将其整合到项目中,对于其他日志框架,想了解的可以对应的去学习一下。

    Log4j简介

    日志记录功能是一个项目中重要的组成部分,log4j是APache下的一个开源日志组件,为java开发者提供了很大的便利。

    Log4j由三个重要的组件构成:

    • Loggers,日志信息的优先级

    日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度,设置为高级别的优先级时,低优先级的日志将不会输出,比如将日志级别设置为INFO,则DEBUG级别的目录不会被记录,为了防止日志输出泛滥,最好不要将日志级别设置太低,一般为INFO即可。

    • Appenders,日志信息的输出目的地

    日志信息的输出目的地指定了日志将打印到控制台还是文件中,参数如下:
    org.apache.log4j.ConsoleAppender (控制台)
    org.apache.log4j.FileAppender (文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件,本文中的案例选择的策略)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件,也是一个不错的选择
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    • Layouts,日志信息的输出格式

    输出格式的功能是控制日志信息的显示内容,参数如下:
    org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式,本案例所选择的策略,需对日志格式进行设置)
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    log4j简单demo

    下面是一个简单的案例,并与System.out.print进行比较,代码在github上,可以下载自己运行一下。

    日志输出:

    import org.apache.log4j.Logger;
    public class LogTest {
        static Logger log = Logger.getLogger(LogTest.class);//获取日志记录器
        public static void main(String... arg0) {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 10; i++) {
                log.info("log输出" + i);
            }
            long time = System.currentTimeMillis() - start;
            log.info("所用时间" + time);
        }
    }
    

    syso输出:

    public class SysoTest {
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 10; i++) {
                System.out.println("syso打印" + i);
            }
            long time = System.currentTimeMillis() - start;
            System.out.println("所用时间" +time);
        }
    }
    

    Log4j配置文件如下:

    log4j.rootLogger=DEBUG, debug
    log4j.logger.debug=debug
    log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.debug.layout=org.apache.log4j.PatternLayout
    log4j.appender.debug.layout.ConversionPattern= [%d{HH:mm:ss}] %c{1} - %m%n
    log4j.appender.debug.datePattern='.'yyyy-MM-dd
    log4j.appender.debug.Threshold = DEBUG
    log4j.appender.debug.append=true
    log4j.appender.debug.File=./logs/ssm-maven/debug.log
    

    此配置文件为log4j-test.properties,也会上传到仓库中,注意:在测试本例时,需将此文件名改为log4j.properties
    运行后可得到如下结果,在项目logs目录下创建了debug.log文件夹并将输出写入到文件中。
    日志输出

    log4j整合并设置分包的日志策略

    上面只是一个简单的demo,重要的还是要将日志功能集成到项目中来。

    配置文件及讲解如下:

    #log4j.rootLogger = [level],appenderName,appenderName2,...
    #level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
    ##Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR
    #通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关
    #比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来
    
    log4j.rootLogger=DEBUG, debug
    
    #Log4j针对不同包指定level:
    #一般在生产环境中应用系统,日志级别调整为INFO以避免过多的输出日志。
    #但某些时候,需要跟踪具体问题,那么就得打开DEBUG日志。
    #但是如果打开log4j.rootLogger,则需要的信息就会淹没在日志的海洋中。
    #此时,需要单独指定某个或者某些Logger的日志级别为DEBUG,而rootLogger保持INFO不变。
    #参考配置如下(指定com.ssm.maven.core.admin类的日志输出)
    #分包设置,admin与service包中的日志输出分离
    log4j.logger.com.ssm.maven.core.admin=INFO,admin
    log4j.logger.com.ssm.maven.core.service=INFO,service
    
    log4j.logger.org.springframework=OFF
    log4j.logger.org.mybatis.spring=ON
    log4j.logger.org.springframework.context.annotation=OFF
    
    log4j.appender.admin=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.admin.layout=org.apache.log4j.PatternLayout
    log4j.appender.admin.layout.ConversionPattern= [%d{HH:mm:ss}] %c{1} - %m%n
    log4j.appender.admin.datePattern='.'yyyy-MM-dd
    log4j.appender.admin.Threshold = INFO
    log4j.appender.admin.append=true
    #admin包下的日志输出到admin.log文件中
    log4j.appender.admin.File=${catalina.home}/logs/ssm-maven/admin.log
    
    log4j.appender.service=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.service.layout=org.apache.log4j.PatternLayout
    log4j.appender.service.layout.ConversionPattern= [%d{HH:mm:ss}] %c{1} - %m%n
    log4j.appender.service.datePattern='.'yyyy-MM-dd
    log4j.appender.service.Threshold = INFO
    log4j.appender.service.append=true
    #admin包下的日志输出到service.log文件中
    log4j.appender.service.File=${catalina.home}/logs/ssm-maven/service.log
    
    log4j.logger.debug=debug
    log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.debug.layout=org.apache.log4j.PatternLayout
    log4j.appender.debug.layout.ConversionPattern= [%d{HH:mm:ss}] %c{1} - %m%n
    log4j.appender.debug.datePattern='.'yyyy-MM-dd
    log4j.appender.debug.Threshold = DEBUG
    log4j.appender.debug.append=true
    log4j.appender.debug.File=${catalina.home}/logs/ssm-maven/debug.log
    
    log4j.logger.java.sql.ResultSet=INFO
    log4j.logger.org.apache=INFO
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    
    

    部署到tomcat服务器,并访问相关页面后,可以到tomcat目录的logs目录下查看日志输出文件:
    日志文件

    查看日志文件,可以得到日志已经分包输出的结果。

    结语

    其实无论是System.out或者Log,我们都是希望快速的定位问题,至于更多的使用System.out而不是Log的原因,其实也多是因为觉得System.out更方便,或者不会用Log亦或者是觉得Log不够灵活,而通过本文中的案例,加上你自己的动手实践,应该可以让你对于Log4j技能从不会到会了,也能让你对于Log4j的灵活性有些认识了。

    我的GitHub地址:https://github.com/ZHENFENG13/ssm-demo
    其中ssm-maven是本次代码更新的目录。

    ssm-maven项目的演示地址

  • 相关阅读:
    【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏
    【总结】/etc/rc.d/rc.local 与 /etc/profile .bash_profile .bashrc 文件执行顺序
    MySQL数据类型
    PHP通用分页(Pager)类
    【抚琴煮酒】我们的网站压力究竟在哪里?
    Linux/CentOS 服务安装/卸载,开机启动chkconfig命令详解|如何让MySQL、Apache开机启动?
    /etc/rc.d/rc与/etc/rc.d/init.d的关系
    PHP正则表达式30分钟入门教程
    数学之路-分布式计算-disco(4)
    数据库中存储日期的字段类型究竟应该用varchar还是datetime ?
  • 原文地址:https://www.cnblogs.com/han-1034683568/p/6641808.html
Copyright © 2020-2023  润新知