• Log4j


         Log4j

    1、Log4j简介(全称:Log for Java

    01:是使用Java语言编写的一个日志框架
    02:是Apache的一个开源项目
    03:记录我们程序中的日志信息
    04:可以将日志信息输出到指定的目的地

    Log4j的作用:
       01:记录我们代码中变量的变化,用于程序的调试和后期的维护
       02:可以周期性的保存一些数据,用于后期对数据的分析
       03:通过设置日志信息的级别,来用于我们的管理

    如果程序中出现了异常。该怎么解决?

    01:使用异常处理机制==>异常
      02:通过debug调试(必须掌握)
      03:system.out.print()
         001:控制台的行数有限
         002:影响我们的系统性能
         003:如果我们需要对用户的行为和习惯进行分析
    我们需要一个能把记录用户的行为和习惯的代码记录在一个文件中
      .log(日志文件: 大家平时上网或者安装软件的时候,经常会看到一些以.log结尾的文件。这就是我们的日志文件!

    注意:并非所有的日志文件都是以.log结尾的,可以是其他的

    把所有的信息打印在控制台上不行吗?
          01.控制台有行数限制;
          02.System.out.println()影响系统性能;
          03.如果我们需要对一些用户的行为习惯进行分析,我们找不到用户的数据!

    2:Log4j的常用配置

        2-1: Log4j的日志组成部分:

    01.日志记录器
    02.日志的输出格式
    03.日志的输出目的地
        2-2:Log4j的日志记录器(Logger)
    org.apache.log4j.Level类中有7个级别:
    OFF:    级别最高 ,用于关闭所有的日志输出
    ALL: 级别最低,用于开始所有的日志输出

    Fatal: 严重的错误事件,将导致我们的程序终止
    Error: 错误事件,不会影响我们程序的继续执行
    Warn: 存在潜在的度级别上的使用
    Info: 指的是粗粒度级别上的使用
    Debug: 指的是细粒错误场景
    Trace: 比Debug还要细的
    开发环境(开发阶段):使用的日志级别比较低 Debug
    生产环境(项目上线):建立把Debug细粒度的设置成粗粒度Warn(生产环境时,建议把DEBUG日志级别换成WARN,避免产生大量文件!)
    2-3:日志的输出格式(Layout)
    %P:日志信息的优先级
    %d:日志的输出的时间 %d{yyyy-MM-dd hh:mm:ss}
    %C:日志信息的输出类
    %l:日志信息的输出位置 类名+线程+行号
    %M:日志信息的输出 所在方法
    %m:日志信息的输出的内容
    %n:输出日志信息之后 换行

    %t:日志信息的输出 所在线程
    %r:从程序启动到输出日志信息所经历的时间(毫秒)
    2-4:日志的输出目的地(Appennder)
    01:把我们的日志信息输出到某个地址
    02:可以同时指定多个输出地
    03:一个输出地就对应一个Appennder
    将一个日志输出到Console控制台中===》ConsoleAppennder
    将日志输出到文件中
    ====>01:RollingFileAppennder 根据文件的大小创建新的日志文件
    ====>02:DailyRollingFileAppennder 根据时间创建新的日志文件

    3:Log4j的使用
    DailyRollingFileAppender中的 DatePattern共分为6种方式
    1.每月 yyyy-MM
    2.每周 yyyy-ww
    3.每天 yyyy-MM-dd
    4.每半天 yyyy-MM-dd-a
    5.每小时 yyyy-MM-dd-hh
    6.每分钟 yyyy-MM-dd-hh-mm
    框架:
    在log4j.properties中写代码:
    三种情况:
    01:第一种显示在控制台上
    02:第二种在文件中以文件的形式显示(根据时间)
    03:第三种在文件夹中已存储的容量大小显示
    共用的测试类:
    package com.dzq;
    
    import org.apache.log4j.Logger;
    
    /**
     * Hello world!
     *
     */
    public class App 
    {
        public static void main( String[] args )
        {
           //创建日志记录器
            Logger logger = Logger.getLogger(App.class);
            logger.error("Error message");
            logger.warn("Warn message");
            logger.info("Info message");
            logger.debug("Debug message");
            logger.trace("Trace message");
        }
    }
    测试类
    第一种情况:
    第一个:显示在控制台上
    #实例化对象
    #ConsoleAppender console =new ConsoleAppender();
    log4j.appender.console =org.apache.log4j.ConsoleAppender
    #console.target=System.out/err 对象名.属性名
    log4j.appender.console.Target=System.out
    #console.Layout =new PatternLayout();//创建输出格式对象
    log4j.appender.console.Layout=org.apache.log4j.PatternLayout
    #console.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss} %l %m %n//指定输出格式
    log4j.appender.console.Layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss} %l %m %n
    
    #指定日志的输出级别
    #log4j.rootLogger=debug,console
    log4j.logger.com.dzq=dubug,console
    第一种情况
    
    

       第二种情况:

    第二个:把日志输出到文件中(时间)
    #把日志输出到文件中
    log4j.appender.file =org.apache.log4j.DailyRollingFileAppender
    #指定频率
    log4j.appender.file.DataPattern='.'yyyy-MM-dd-HH-mm'.log
    #指定输出文件的位置 第一次生成的文件名称
    log4j.appender.file.File=e:/log/log4j.log
    log4j.appender.file.Layout=org.apache.log4j.PatternLayout
    log4j.appender.file.Layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss} %l %m %n
    #指定日志的输出级别
    #log4j.rootLogger=debug,console
    log4j.logger.com.dzq=dubug,console
    第二种情况

       第三种情况:

    第三个:存储大小
    #把日志信息打印在文件中,根据文件的大小创建新的文件
    log4j.appender.file1=org.apache.log4j.RollingFileAppender
    #文件的存放位置
    log4j.appender.file1.File=e:/log4j/log4j.log
    #每个文件的最大容量
    log4j.appender.file1.MaxFileSize=1kb
    #如果超过了大小,默认产生的额度文件的数量
    log4j.appender.file1.MaxBackupIndex=3
    #设置内容满了之后覆盖的内容
    log4j.appender.file1.Append=true
    log4j.appender.file1.Layout=org.apache.log4j.PatternLayout
    log4j.appender.file1.Layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss} %l %m %n
    #指定日志的输出级别
    #log4j.rootLogger=debug,console
    log4j.logger.com.dzq=dubug,console,file,file1
    第三种情况

    Logback:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod:设置监测配置文件是否有修改的时间间隔,(通俗讲:就是设置多长时间查看一下logback.xml文件有没有被修改)如果没有给出时间单位,
                默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
    -->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
    
        <!-- 整个logback.xml文件中只有四个主要的标签:其一是根标签configuration,其余是三个子标签:appende,logger,root
          但是有人会疑问:那property和timestamp是做什么的?答案是:这两个标签是用来为以上提到的是三个子标签定义属性和赋值的。例如:
          第一个property标签中定义了一个USER_HOME属性,其值是/logs,scope是这个属性的作用范围,scope="context"是指该属性只能在本配置文件中使用。
          而timestamp定义了一个时间戳,也就是定义了一个时间格式,以供三个子标签使用。
        -->
        <property name="USER_HOME" value="e:/logs" />
        <property scope="context" name="FILE_NAME" value="mylog-logback" />
        <timestamp key="byDay" datePattern="yyyy-MM-dd" />
    
        <!-- 第一个子标签appender:
      name:标签名,为了让其他标签调用的唯一标示,相当于html标签中的id
      class:引用的类,从此类中可以看出该appender标签定义的是日志输出的位置,也就是往哪里输出
      ch.qos.logback.core.ConsoleAppender可以看出是往控制台上输出。
      encoder:该标签中定义了日志的输出格式
    -->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度   %msg:日志消息,%n是换行符
                      级别分别是:TRACE < DEBUG < INFO <WARN < ERROR
                -->
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern>
            </encoder>
        </appender>
        <!--
      class:从此类中可以看出该appender标签定义的日志输出位置是回滚文件,也就是说:把日志输出到一个文件中,并且该文件可以回滚,至于怎么回滚请看下面的注释
        -->
        <appender name="log_file"  class="ch.qos.logback.core.rolling.RollingFileAppender">
    
            <!--   定义了日志文件的目录结构和文件名:磁盘根目录:/logs/mylog-logback.log
              注意了:该文件名是在日志文件没有触发回滚要求时的文件名,也就是说现在的日志文件还没有满足xxMB,
            一旦满足了就会按照rollingPolicy里设置的属性进行重新命名
            -->
            <file>${USER_HOME}/${FILE_NAME}.log</file>
            <!--  rollingPolicy:回滚策略
              fileNamePattern:标签中定义的是日志文件一旦满足5MB就重新命名成新文件的命名格式,
            其中minIndex和maxIndex分别对应的是满足5MB的日志文件的命名序号(1~10)对应%i.log中的i值。
            如:mylog-logback-2016-07-12-1.log,mylog-logback-2016-07-12-2.log,mylog-logback-2016-07-12-3.log
            -->
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>${USER_HOME}/${byDay}/${FILE_NAME}-${byDay}-%i.log</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>10</maxIndex>
            </rollingPolicy>
            <!-- 触发策略:当日志文件满足5MB就会出发回滚策略-->
            <triggeringPolicy   class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>5MB</maxFileSize>
            </triggeringPolicy>
            <!--%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4。-->
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n
                </pattern>
            </encoder>
    
        </appender>
    
        <!-- 设置哪个目录或者包,类使用哪个日志
        将com.xdf包下的所有类的日志的打印,level是打印级别:debug,如果不设置level,它将继承它的上级<root>的日志级别“DEBUG”
        如果没有设置addtivity,默认为true,将此loger的打印信息向上级传递;
        如果没有设置appender-ref,此loger本身不打印任何信息。
        -->
         <logger name="com.dzq" level="debug" additivity="true">
                <appender-ref ref="console" />
            </logger>
    
        <root level="debug">
            <appender-ref ref="console" />
        </root>
    </configuration>
    logback.xml
    package com.dzq;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class logback {
        public static void main( String[] args )
        {
            //创建日志记录器
            Logger logger= LoggerFactory.getLogger(logback.class);
            logger.error("Error message");
            logger.warn("Warn message");
            logger.info("Info message");
            logger.debug("Debug message");
            logger.trace("Trace message");
    
        }
    }
    测试类

    需要导入的四个架包





     
     
     
     
     
  • 相关阅读:
    G
    O
    M
    K-Hero
    J
    G
    F
    Codeforces Round #327 (Div. 2) A Wizards' Duel (水题)
    C++各大有名科学计算库(转)
    矩阵算法 高斯消元 行列式 矩阵的秩
  • 原文地址:https://www.cnblogs.com/3020815dzq/p/9253770.html
Copyright © 2020-2023  润新知