zoukankan      html  css  js  c++  java
  • 日志记录

    日志

    tomcat在运行时,会在logs文件夹下生成以.log结尾的文件,该文件就是日志,通过这些日志信息可以快速的定位程序的问题。在一个完整的软件系统中,记录日志是必不可少的一个模块,因为要记录的日志可能会较多,因此该工作是System.out.println()无法完成的。
    日志信息根据用途与记录内容的不同,分为调试日志、运行日志、异常日志等。
    在java中用于记录日志的技术有很多,常用的有:

    • logger
    • log4j
    • log4j2
    • logback

    其中除了logger使用的概率较小,因此主要介绍后面三个。

    日志级别

    为了方便日志信息的输出显示,对日志内容进行了分级管理。 日志级别由高到低 ,共分 6 个级别:

    • fatal(致命的)
    • error
    • warn
    • info
    • debug
    • trace(堆栈)

    为什么要对日志进行分级呢?
    将日志输出到控制台,或者写入到文件中,这些操作都会降低程序的运行效率。但由于开发需要、便于维护等原因,要将必要的日志信息记录,这时就需要在代码中加入记录日志的相关语句。假设在开发调试程序时需要记录日志信息,等到系统上线后这些信息就没必要记录了,此时需要将记录日志信息相关代码全部删除,这个过程费时费力。
    将日志信息进行分级管理之后,便可方便的控制信息输出内容及输出位置,哪些信息需要输出,哪些信息不需要输出,只需在一个日志控制文件中稍加修改即可,不用修改代码中的内容。即在开发调试程序时,将日志信息级别设置低一些,这样输出的日志信息会非常多,当系统上线之后,将日志信息级别设置的高一些,此时只有少部分日志信息被记录。

    log4j简介

    log4j是apache旗下的项目,apache已经在2015年8月5日宣布log4j 1.x的版本已经不再更新了,最终版本是log4j 1.2.17的版本,推荐开发者使用log4j2,但是有些稍旧点的项目仍然在使用1.x的版本,所以这里先简单介绍下。
    jar包的下载可以到其官网中下载:http://logging.apache.org/log4j/1.2/
    百度网盘下载:http://pan.baidu.com/s/1kU4WZWz

    为了控制日志的输出,在Log4j中提供了日志输出控制文件,该文件主要由三个部分构成:

    • 日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。
    • 日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。
    • 日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。

    有了日志输出控制文件,代码中只要设置好日志信息内容及其级别即可,通过控制文件
    便可控制这些日志信息的输出了。

    使用log4j记录日志

    1.导入jar包
    将log4j-1.2.17.zip文件解压后即可看到log4j-1.2.17.jar文件,将该jar包拷贝到项目中。

    2.放入日志输出控制文件
    在src目录下创建log4j.properties文件,将下面内容拷贝到文件中保存。

     1 log4j.rootLogger=info,console
     2 
     3 #控制台附加器
     4 log4j.appender.console = org.apache.log4j.ConsoleAppender
     5 log4j.appender.console.Target = System.out
     6 log4j.appender.console.layout = org.apache.log4j.PatternLayout
     7 log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
     8 
     9 #文件附加器
    10 log4j.appender.file = org.apache.log4j.FileAppender
    11 log4j.appender.file.File = f:/monkey1024/monkey.log
    12 log4j.appender.file.layout = org.apache.log4j.PatternLayout
    13 log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
    14 
    15 #滚动文件附加器
    16 log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
    17 log4j.appender.rollfile.File = f:/monkey1024/monkey.log
    18 log4j.appender.rollfile.MaxFileSize = 10KB
    19 log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
    20 log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

    3.代码中实现日志记录

     1 package com.monkey1024.test;
     2 
     3 import org.apache.log4j.Logger;
     4 
     5 /**
     6  * log4j
     7  *
     8  */
     9 public class Log4jTest01 {
    10 
    11     public static void main(String[] args) {
    12         //创建记录日志的对象
    13         Logger log = Logger.getLogger(Log4jTest01.class);
    14 
    15         //下面语句会根据log4j.properties中的日志级别输出
    16         log.debug("debug信息");
    17         log.info("info信息");
    18         log.warn("warn信息");
    19         log.error("error信息");
    20     }
    21 
    22 }

    上面代码中的日志输出语句,会根据 log4j.properties 文件中日志级别的设置进行输出,会输出到指定位置。 其输出结果是:输出指定级别及其更高级别的信息。如指定 info 级别,则会输出 fatal、 error、 warn、 info 级别的信息。就本例而言,上面代码不会执行 debug()方法。

    log4j.properties文件分析

    日志属性文件 log4j.properties 是专门用于控制日志输出的。其主要进行三方面控制:

    • 输出位置:控制日志将要输出的位置,是控制台还是文件等。
    • 输出布局:控制日志信息的显示形式
    • 输出级别:控制要输出的日志级别。

    日志属性文件由下面两个对象组成:

    • 根日志,即为 Java 代码中的日志记录器,可以控制日志输出级别与添加附加器。
    • 附加器,可以设置输出布局、文件位置、文件大小等内容。

    定义日志附加器 appender
    附加器的本质是一个接口,其定义语法为:

    log4j.appender.appenderName =  输出位置
    

    appenderName 为自定义名称。
    输出位置为log4j 指定的类型,是定义好的一些 appender 接口的实现类。打开 log4j解压目录下的 site文件夹下的 index.html,在打开的页面中点击 JavaDoc,即可可看到 log4j 的 API。

    在log4j.properties中编写如下配置:

    log4j.appender.console = org.apache.log4j.ConsoleAppender
    

    该配置的appender名字为console,类型是org.apache.log4j.ConsoleAppender即将日志输出到控制台。

    常用的附加器实现类

    • org.apache.log4j.ConsoleAppender:日志输出到控制台
    • org.apache.log4j.FileAppender:日志输出到文件
    • org.apache.log4j.RollingFileAppender:当日志文件大小到达指定尺寸的时候将产生一个新的日志文件
    • org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件

    通过上面附加器可以指定日志输出的位置。

    修饰日志附加器
    修饰日志附加器,是为定义好的附加器添加一些属性,以控制到指定位置的输出。不同的附加器,其修饰属性不同。

    控制台附加器:

    1 log4j.appender.console = org.apache.log4j.ConsoleAppender
    2 log4j.appender.console.Target = System.out
    3 log4j.appender.console.layout = org.apache.log4j.PatternLayout
    4 log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

    Target:控制输出到控制台的使用目标。其值为 System.out 或 Sytem.err。它们的区别是,
    System.out 是以黑色字体显示到控制台,而 System.err 则是以红色字体显示。

    文件附加器:

    1 log4j.appender.file = org.apache.log4j.FileAppender
    2 log4j.appender.file.File = f:/monkey1024/monkey.log
    3 log4j.appender.file.layout = org.apache.log4j.PatternLayout
    4 log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

    log4j.appender.file.File:日志要输出的文件位置及文件名称。

    滚动文件附加器:

    1 log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
    2 log4j.appender.rollfile.File = f:/monkey1024/monkey.log
    3 log4j.appender.rollfile.MaxFileSize = 10KB
    4 log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
    5 log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

    MaxFileSize:用于指定日志文件的最大值。若文件超过指定值,将自动产生另一个日志文件。

    常用layout布局
    在上面的配置文件中都出现了layout,该项可以配置日志的布局类型,常用的如下:

    • org.apache.log4j.HTMLLayout:网页布局,以 HTML 表格形式布局
    • org.apache.log4j.SimpleLayout:简单布局,包含日志信息的级别和信息字符串
    • org.apache.log4j.PatternLayout:匹配器布局,可以灵活地指定布局模式。其主要是通过设置 PatternLayout 的 ConversionPattern 属性值来控制具体输出格式的。ConversionPattern 的值中有很多控制字符,这些字符的意义可以百度:ConversionPattern取值说明。

    配置根Logger
    配置 rootLogger,以便于代码加载来控制日志的输出。其语法为:

    log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
    

    其中,level 是日志记录的优先级,分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。OFF 为关闭日志功能。
    低级别的可以显示高级别的,但高级别的不能显示低级别的。所以,级别越高,将来显示的信息就越少。

    例如:

     1 log4j.rootLogger=info,console,file
     2 
     3 #控制台附加器
     4 log4j.appender.console = org.apache.log4j.ConsoleAppender
     5 log4j.appender.console.Target = System.out
     6 log4j.appender.console.layout = org.apache.log4j.PatternLayout
     7 log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
     8 
     9 #文件附加器
    10 log4j.appender.file = org.apache.log4j.FileAppender
    11 log4j.appender.file.File = f:/monkey1024/monkey.log
    12 log4j.appender.file.layout = org.apache.log4j.PatternLayout
    13 log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

    log4j2

    apache官方已经声明log4j1.x不再更新,建议开发者使用log4j2,它相比1.x在使用上发生了较大的变化。
    使用log4j2记录日志的步骤
    1.下载jar包
    log4j2官网下载:http://logging.apache.org/log4j/2.x/
    百度网盘下载:http://pan.baidu.com/s/1minAspq
    下载后需要将下面两个jar包导入到项目中

    • log4j-api-2.9.1.jar
    • log4j-core-2.9.1.jar

    2.添加日志输出控制文件
    在log4j2中的配置文件是 XML 格式的文件,不再支持properties 文件。在src目录下创建log4j2.xml文件,里面写上下面内容。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <Configuration status="OFF">
     3     <Appenders>
     4         <!-- console -->
     5         <Console name="Console" target="SYSTEM_OUT">
     6             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
     7         </Console>
     8         <!-- file -->
     9         <File name="file" fileName="log/output.log" append="true">
    10             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    11         </File>
    12         <!-- rollingFile -->
    13         <RollingFile name="roolingFlie" fileName="logs/app.log"
    14             filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
    15             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    16             <SizeBasedTriggeringPolicy size="1kb" />
    17         </RollingFile>
    18     </Appenders>
    19     <Loggers>
    20         <Root level="info">
    21             <AppenderRef ref="Console" />
    22         </Root>
    23     </Loggers>
    24 </Configuration>

    3.编写日志记录代码

    导包的时候注意Logger 与 LogManager 都是 org.apache.logging.log4j 包中的类,而不是org.apache.log4j包中的。另外在创建记录日志对象时,使用的是LogManager类

     1 package com.monkey1024.test;
     2 
     3 import org.apache.logging.log4j.LogManager;
     4 import org.apache.logging.log4j.Logger;
     5 
     6 /**
     7  * log4j2
     8  *
     9  */
    10 public class Log4j2Test01 {
    11 
    12     public static void main(String[] args) {
    13         //创建记录日志的对象
    14         Logger log = LogManager.getLogger(Log4j2Test01.class);
    15 
    16         //下面语句会根据log4j2.xml中的日志级别输出
    17         log.debug("debug信息");
    18         log.info("info信息");
    19         log.warn("warn信息");
    20         log.error("error信息");
    21 
    22 
    23     }
    24 
    25 }

    上面代码会将info以上级别的日志信息输出到控制台中。

    日志输出控制文件分析

    若开发者没有设置 log4j2.xml,则系统会使用默认的日志配置:只会输出到控制台 error 级别的信息。

    configuration标签

    configuration标签的 status 属性用于设置 Log4j2 自身运行的日志显示级别,一般为OFF,不显示,也可以设置为 ERROR、DEBUG 等其它级别。

    Console标签
    Console标签的 target 属性用于设置输出的目标形式,其值一般为:SYSTEM_OUT 或 SYSTEM_ERR

    File标签
    File标签的 fileName 属性用于设置文件的文件保存路径及文件名。如本例的意思是,日志文件名为 output.log,将其存放在当前项目的根目录下的 log 子目录中,如果log目录不存在会自动创建。

    append 属性用于设置是否以追加方式将日志写入文件中。

    RollingFile标签
    fileName 指定存放目录及第一个日志文件名。filePattern 指定新创建的日志文件的文件名。本例还会对文件进行压缩。

    SizeBasedTriggeringPolicy子标签用于指定每一个日志文件最大文件大小。当达到这个指定值后,会自动再新建一个日志文件。

    loggers标签
    用于配置根Logger 对象,用来指定所使用的日志记录器,及显示的级别。
    其子标签root用于指定所使用的日志记录器。该子标签的属性 level 用于指定显示级别,主要是通过root的子标签appender-ref来引用appenders中定义好的记录器。
    需要注意的是,只要在appenders中定义了File、 RollingFile等,且在其中指定了日志存放的目录,无论是否在appender-ref中引用,这些目录都会自动创建。

     

    slf4j简介

    在实际应用当中,不同的系统可能使用了不同的库来记录日志。比如你使用log4j2开发了一款产品,而购买你产品的用户所使用的系统是jdk的Logging时,你可能需要对千上万的log4j2的调用进行修改,这肯定是一件费时费力的事情。为了解决该问题,slf4j诞生了。
    slf4j,全称是Simple Logging Facade for Java,中文是简单日志门面。它仅仅是一种规范,一个接口,不是具体的日志解决方案,不做具体的日志服务。 Log4j和Log4j2以及后面要学习的logback都是 slf4j 的一种具体实现。
    slf4j 有自己单独的一套 API,这套 API 与具体的日志实现技术的 API 是不同的。为了能使 slf4j 的 API 与具体日志实现技术 API 结合到一起,在 slf4j 与具体日志技术之间,还需要一个连接的 jar包。这个jar包在 sfl4j 框架中存放着。

    slf4j

    将log4j改成slf4j

    1.导入相关jar包

    2.加入日志输出控制文件log4j.properties文件
    将之前写的配置文件拷贝过来即可

    3.代码中实现日志记录
    通过LoggerFactory获取创建记录的日志对象,导包时需要导入org.slf4j下的类

     1 package com.monkey1024.test;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 
     6 public class Slf4jTest01 {
     7 
     8     public static void main(String[] args) {
     9         //创建记录日志的对象
    10         Logger log = LoggerFactory.getLogger(Slf4jTest01.class);
    11 
    12         log.debug("debug信息");
    13         log.info("info信息");
    14         log.warn("warn信息");
    15         log.error("error信息");
    16     }
    17 }

    将log4j2改成slf4j

    在slf4j的1.7.25(含)版本之前,没有提供log4j2相关的jar,不过在log4j2中提供了相关的jar包。

    1.导入相关jar包

    2.添加日志输出控制文件log4j2.xml
    将之前写过的拷贝过来

    3.编写日志记录代码
    通过LoggerFactory获取创建记录的日志对象,导包时需要导入org.slf4j下的类

     1 package com.monkey1024.test;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 
     6 /**
     7  * slf4j
     8  *
     9  */
    10 public class Slf4jTest02 {
    11 
    12     public static void main(String[] args) {
    13         //创建记录日志的对象
    14         Logger log = LoggerFactory.getLogger(Slf4jTest02.class);
    15 
    16         log.debug("debug信息");
    17         log.info("info信息");
    18         log.warn("warn信息");
    19         log.error("error信息");
    20     }
    21 }

    logback简介

    logback是log4j作者的开发的又一个记录日志的开源技术,相比于log4j而言,logback在很多方面都有很大的提升。logback分为三个模块:logback-core, logback-classic和logback-access。其中 logback-core是另外两个的基础模块,logback-classic是log4j的升级版本,同时也实现了SLF4j的API,因此可以方便的使用SLF4j,还有一点要说的就是SLF4j和logback的作者是同一个人,所以说logback是原生的实现了SLF4j。logback-access集成了一些servlet容器,比如tomcat

    1.下载jar包
    logback官网下载:https://logback.qos.ch/download.html
    百度网盘下载:http://pan.baidu.com/s/1o7RROpG
    下载完毕解压后,需要将下面三个jar包导入到项目中:

    • logback-access-1.2.3.jar
    • logback-classic-1.2.3.jar
    • logback-core-1.2.3.jar

    如果要是用slf4j的话需要下载slf4j的jar包,因为slf4j和logback无缝集成,所以这里不用下载slf4j连接logback的jar包了。

    2.添加日志输出控制文件
    在src目录下创建一个logback.xml文件,里面写上下面内容:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 
     3 <configuration scan="true" scanPeriod="3 seconds" DEBUG="true">
     4 
     5     <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
     6 
     7     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     8         <encoder>
     9             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    10             </pattern>
    11         </encoder>
    12     </appender>
    13 
    14 
    15     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    16         <file>file.log</file>
    17         <append>true</append>
    18         <encoder>
    19             <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
    20             </pattern>
    21         </encoder>
    22     </appender>
    23 
    24     <appender name="ROLLINGFILE"
    25         class="ch.qos.logback.core.rolling.RollingFileAppender">
    26         <file>mylog.txt</file>
    27         <rollingPolicy
    28             class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    29             <!-- rollover daily -->
    30             <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
    31             <!-- 每个日志文件大小不超过100MB,在日志文件总大小不超过20GB的情况下保存60天, -->
    32             <maxFileSize>100MB</maxFileSize>
    33             <maxHistory>60</maxHistory>
    34             <totalSizeCap>20GB</totalSizeCap>
    35         </rollingPolicy>
    36         <encoder>
    37             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    38             </pattern>
    39         </encoder>
    40     </appender>
    41 
    42     <root level="INFO">
    43         <appender-ref ref="STDOUT" />
    44     </root>
    45 
    46 </configuration>

    3.编写日志记录代码
    因为logback原生就实现了SLF4j的API,所以这里使用SLF4j。

     1 package com.monkey1024.test;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 
     6 import ch.qos.logback.classic.LoggerContext;
     7 import ch.qos.logback.core.status.OnConsoleStatusListener;
     8 import ch.qos.logback.core.status.StatusManager;
     9 
    10 public class LogbackTest01 {
    11 
    12     public static void main(String[] args) {
    13         // 创建记录日志的对象
    14         Logger log = LoggerFactory.getLogger(Slf4jTest01.class);
    15 
    16         log.debug("debug信息");
    17         log.info("info信息");
    18         log.warn("warn信息");
    19         log.error("error信息");
    20     }
    21 }

    日志输出控制文件分析

    configuration 
    scan=”true”表示logback会自动加载修改后的xml配置文件,默认情况下,每隔一分钟扫描一次,可以通过scanPeriod=”3 seconds”设置为每3秒扫描一次。
    DEBUG=”true”该配置并不是设置日志级别为debug,而是会打印logback内部运行的一些信息,可以查看logback的运行状态,默认是false。

    statusListener
    可以通过设置监听器来监听logback内部运行的信息和状态。

    appender
    可以编写多个appender来实现不同的日志输出方式。

    其中name属性用于指定appender的名称,即给appender命名
    class属性用于指定日志的输出方式。

    • ch.qos.logback.core.ConsoleAppender:将日志信息输出到控制台
    • ch.qos.logback.core.FileAppender:日志输出到文件
    • ch.qos.logback.core.rolling.RollingFileAppender:当日志文件大小到达指定尺寸的时候将产生一个新的日志文件。

    encoder
    在logback0.9.19版本中引入了encoder来替代layout。该标签默认使用PatternLayoutEncoder,其中pattern标签可以设置日志的输出格式。

    file
    该标签在appender标签下,用于指定输出日志的文件名。

    append
    该标签在appender标签下,是否以追加的方式写出到日志文件中。

    rollingPolicy
    该标签在appender标签下,用来指定产生新文件的方式。
    常用的有SizeAndTimeBasedRollingPolicy(根据日期和文件大小产生新的文件)和FixedWindowRollingPolicy(根据文件大小产生新的文件)

    maxFileSize
    该标签在rollingPolicy下,当文件大小超过该标签中指定的大小时会创建新的文件,例如:5kb,5MB,5GB,默认单位是字节b,如果只写500的话,则表示500b

    maxHistory
    该标签在rollingPolicy下,用来指定日志保存的天数。

    totalSizeCap
    该标签在rollingPolicy下,保存日志的总大小,通常写在maxHistory的后面。

    level
    该标签在root下,用来表示日志的打印级别

    appender-ref
    该标签在root下,用来添加appender。

     
     
  • 相关阅读:
    font-weight 导致iconfont显示有问题和糊
    compositionstart与compositionend解决组合文字输入问题
    工具函数 createOnceHandler 只执行一次的事件绑定
    redis的基本数据类型
    dubbo服务的发布和调用
    Dubbo介绍和服务架构分析
    spring的事务配置方法
    [已解决] java.net.ConnectException: Connection refused: no further information
    [已解决] 点击 【Show in system explorer】Eclipse卡死,未响应
    [已解决] java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.com.yourproject.test_jsp
  • 原文地址:https://www.cnblogs.com/samuraihuang/p/10858995.html
Copyright © 2011-2022 走看看