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个级别:
测试类
第一种情况
第二种情况
第三种情况
logback.xml
测试类
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>
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"); } }
需要导入的四个架包