日志

日志信息根据用途与记录内容的不同,分为调试日志、运行日志、异常日志等。

Java常用记录日志

  • logger
  • log4j
  • log4j2
  • logback

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

日志级别

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

  1. fatal(致命的)
  2. error
  3. warn
  4. info
  5. debug
  6. trace(堆栈)

为什么要对日志进行分级呢?

将日志输出到控制台,或者写入到文件中,这些操作都会降低程序的运行效率。但由于开发需要、便于维护等原因,要将必要的日志信息记录,这时就需要在代码中加入记录日志的相关语句。假设在开发调试程序时需要记录日志信息,等到系统上线后这些信息就没必要记录了,此时需要将记录日志信息相关代码全部删除,这个过程费时费力。

将日志信息进行分级管理之后,便可方便的控制信息输出内容及输出位置,哪些信息需要输出,哪些信息不需要输出,只需在一个日志控制文件中稍加修改即可,不用修改代码中的内容。即在开发调试程序时,将日志信息级别设置低一些,这样输出的日志信息会非常多,当系统上线之后,将日志信息级别设置的高一些,此时只有少部分日志信息被记录。

log4j

最终版本是log4j 1.2.17的版本

jar包下载 http://mirrors.tuna.tsinghua.edu.cn/apache/logging/log4j/1.2.17/log4j-1.2.17.zip

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

日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。

日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。

日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。

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

便可控制这些日志信息的输出了。

使用log4j记录日志

  1. 导入jar包

  2. 放入日志输出控制文件

    在src目录下创建log4j.properties文件,将下面内容拷贝到文件中保存。

     log4j.rootLogger=info,console
    
     #控制台附加器
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    log4j.appender.console.Target = System.out
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n #文件附加器
    log4j.appender.file = org.apache.log4j.FileAppender
    log4j.appender.file.File = f:/monkey1024/monkey.log
    log4j.appender.file.layout = org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n #滚动文件附加器
    log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
    log4j.appender.rollfile.File = f:/monkey1024/monkey.log
    log4j.appender.rollfile.MaxFileSize = 10KB
    log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
    log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n

3.代码中实现日志记录

//创建记录日志的对象
Logger log = Logger.getLogger(Log4jTest01.class); //下面语句会根据log4j.properties中的日志级别输出
log.debug("debug信息");
log.info("info信息");
log.warn("warn信息");
log.error("error信息");

上面代码中的日志输出语句,会根据 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:每天产生一个日志文件

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

修饰日志附加器

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

  • 控制台附加器

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

    Target:控制输出到控制台的使用目标。其值为 System.out 或 Sytem.err。它们的区别是,

    System.out 是以黑色字体显示到控制台,而 System.err 则是以红色字体显示。

  • 文件附加器

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

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

  • 滚动文件附加器

      log4j.appender.rollfile = org.apache.log4j.RollingFileAppender
    log4j.appender.rollfile.File = f:/monkey1024/monkey.log
    log4j.appender.rollfile.MaxFileSize = 10KB
    log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout
    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 为关闭日志功能。

    低级别的可以显示高级别的,但高级别的不能显示低级别的。所以,级别越高,将来显示的信息就越少。

    例如:

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

log4j2

下载jar包

http://logging.apache.org/log4j/2.x/download.html

导入

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

添加日志输出控制文件

在log4j2中的配置文件是 XML 格式的文件,不再支持properties 文件。在src目录下创建log4j2.xml文件,里面写上下面内容。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<!-- console -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<!-- file -->
<File name="file" fileName="log/output.log" append="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>
<!-- rollingFile -->
<RollingFile name="roolingFlie" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<SizeBasedTriggeringPolicy size="1kb" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>

编写日志记录代码

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

//创建记录日志的对象
Logger log = LogManager.getLogger(Log4j2Test01.class); //下面语句会根据log4j2.xml中的日志级别输出
log.debug("debug信息");
log.info("info信息");
log.warn("warn信息");
log.error("error信息");

上面代码会将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

将log4j改成slf4j

  1. 导入相关jar包

  2. 加入日志输出控制文件log4j.properties文件

    将之前写的配置文件拷贝过来即可

  3. 代码中实现日志记录

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

     //创建记录日志的对象
    Logger log = LoggerFactory.getLogger(Slf4jTest01.class); log.debug("debug信息");
    log.info("info信息");
    log.warn("warn信息");
    log.error("error信息");

将log4j2改成slf4j

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

  1. 导入相关jar包

  2. 添加日志输出控制文件log4j2.xml

    将之前写过的拷贝过来

  3. 编写日志记录代码

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

     //创建记录日志的对象
    Logger log = LoggerFactory.getLogger(Slf4jTest02.class); log.debug("debug信息");
    log.info("info信息");
    log.warn("warn信息");
    log.error("error信息");

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包

    https://logback.qos.ch/download.html

    下载完毕解压后,需要将下面三个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文件,里面写上下面内容:

     <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
    <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    </pattern>
    </encoder>
    </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>file.log</file>
    <append>true</append>
    <encoder>
    <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
    </pattern>
    </encoder>
    </appender> <appender name="ROLLINGFILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy
    class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
    <!-- 每个日志文件大小不超过100MB,在日志文件总大小不超过20GB的情况下保存60天, -->
    <maxFileSize>100MB</maxFileSize>
    <maxHistory>60</maxHistory>
    <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
    <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    </pattern>
    </encoder>
    </appender> <root level="INFO">
    <appender-ref ref="STDOUT" />
    </root>
  3. 编写日志记录代码

    因为logback原生就实现了SLF4j的API,所以这里使用SLF4j。

     // 创建记录日志的对象
    Logger log = LoggerFactory.getLogger(Slf4jTest01.class); log.debug("debug信息");
    log.info("info信息");
    log.warn("warn信息");
    log.error("error信息");

日志输出控制文件分析

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。

JavaWeb笔记(十二)日志的更多相关文章

  1. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  2. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  3. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  4. DirectX11笔记(十二)--Direct3D渲染8--EFFECTS

    原文:DirectX11笔记(十二)--Direct3D渲染8--EFFECTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737 ...

  5. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  6. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  7. 《深入理解Java虚拟机》读书笔记十二

    第十二章  Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...

  8. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  9. swift 笔记 (十二) —— 下标

    下标 swift同意我们为 类.结构体,枚举 定义下标,以更便捷的方式訪问一大堆属性.比方Array和Dictionary都是结构体,swift的project师已经为这两个类型提供好了下标操作的代码 ...

  10. JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)

    1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...

随机推荐

  1. Restframework介绍

    1.REST介绍 REST与技术无关,它代表的是一种软件架构风格,全称Representational State Transfer,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它 ...

  2. Python 学习笔记(五)常用函数

    Python内建函数 四舍五入: round() 绝对值: abs() >>> round(1.543,2) 保留两位小数,四舍五入为1.54 1.54 >>> r ...

  3. ccenteros 部署 redis

    step one :  yum install redis    -- 安装redis数据库 step two:安装完成之后开启redis 服务 service redis start   syste ...

  4. window.location.href url含中文乱码问题

    (1).页面中先对中文进行编码. 如:window.location.href = url+"&groupName=" + encodeURI(encodeURI(grou ...

  5. #leetcode刷题之路6- Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列.比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L     C     I ...

  6. mybatis自动生成@Table、@Column、@Id注解

    在pom.xml中添加如下插件以及插件相关的依赖 <build> <plugins> <plugin> <groupId>org.springframe ...

  7. Django url处理

    Django如何处理一个请求当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码遵循的算法:1:Django 决定要使用的根URLconf 模块.通常,这 ...

  8. ABAP术语-HTML

    HTML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/19/1073298.html Hypertext Markup Language( ...

  9. CentOS下删除MySql

    1.查找以前是否装有mysql rpm -qa | grep -i mysql 显示之前安装了: MySQL-client-5.5.49-1.linux2.6.i386 MySQL-server-5. ...

  10. Python 一些好玩的函数

    一.匿名函数 什么匿名是函数: 不需要使用def函数名的函数或者子程序 函数语法: lambda 参数:表达式 函数特点: 1.lambda只是一个表达式,省去定义函数过程,让代码更精简 2.lamb ...