一、概述

1、log4j:

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2、slf4j:

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

二、实践

1、导入对应的jar包,推荐使用maven工程导入。

  a、使用传统jar的方式引入

  

  b、使用maven工程导入

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.turtle</groupId>
<artifactId>log</artifactId>
<version>1.0-SNAPSHOT</version> <name>log</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency> </dependencies> </project>

2、编写测试代码:

package com.turtle.log;

import com.turtle.OutputStreamUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date; public class TestLog_01 { private final static Logger logger = LoggerFactory.getLogger(TestLog_01.class); public static void main(String[] args) {
logger.info("programer processing......");
try{
// 会产生除以0的异常信息
System.out.println(1/0);
}catch (Exception e){
// 将异常信息打印到日志文件中去
String exception = new OutputStreamUtil().util(e);
// 输出日志文件
logger.error("Programer error:"+ exception+"\t"+"【"+new SimpleDateFormat("yyyy-MM-dd/HH.mm.ss").format(new Date())+"】");
}
logger.debug("start Debug detail......");
}
}

3、配置文件

### set log levels ###
log4j.rootLogger = DEBUG,stdout,D,E # 配置日志信息输出目的地
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# Target是输出目的地的目标
log4j.appender.stdout.Target = System.out
# 指定日志消息的输出最低层次
log4j.appender.stdout.Threshold = INFO
# 定义名为stdout的输出端的layout类型
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
# 如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n # 名字为D的对应日志处理
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
# File是输出目的地的文件名
log4j.appender.D.File = LOG//app_debug.log
#false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.TTCCLayout # 名字为E的对应日志处理
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = LOG//app_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

三、详细解释

1、log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别)

优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

  •     ALL LEVEL 最低等级的,用于打开所有日志记录。
  •     TRACE 很低的日志级别,一般不会使用。
  •     DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
  •     INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
  •     WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
  •     ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
  •     FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
  •     OFF LEVEL 最高等级的,用于关闭所有日志记录。

  如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

2、rootLogger = DEBUG,stdout,D,E   #配置根logger,

基本格式为 log4j.rootLogger = LEVEL, appenderName1 ,  appenderName2  ,只能有一个等级的哦,不能存在多个等级,否则会报错

3、log4j.appender.stdout=org.apache.log4j.ConsoleAppender  #配置日志信息输出目的地Appender

  •   org.apache.log4j.ConsoleAppender(控制台)
  •   org.apache.log4j.FileAppender(文件)
  •   org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  •   org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  •   org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

4、Target , File 分别就是输出目的地的目标、文件名啦。此处可将相应的内容写到相应的目的地及文件中.

5、Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

6、Threshold=DEBUG:指定日志消息的输出最低层次。

  应当注意每个appender的级别应该是不同的,比如error类的单独放到一个文件中,更方便我们排除错误,所以推荐对不同级别的日志输出到不同的日志文件中。

7、当选择RollingFileAppender时,MaxFileSize=100KB

  后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

8、log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  # 定义名为stdout的输出端的layout类型

  •   org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  •   org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
  •   org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  •   org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

9、log4j.appender.stdout.layout.ConversionPattern= [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

  •   %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
  •   %r: 输出自应用启动到输出该log信息耗费的毫秒数
  •   %c: 输出日志信息所属的类目,通常就是所在类的全名
  •   %t: 输出产生该日志事件的线程名
  •   %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.Java:10)
  •   %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像Java servlets这样的多客户多线程的应用中。
  •   %%: 输出一个"%"字符
  •   %F: 输出日志消息产生时所在的文件名称
  •   %L: 输出代码中的行号
  •   %m: 输出代码中指定的消息,产生的日志具体信息 (注意下文log的使用时传入的参数)
  •   %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
  •   %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式

  可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

  •   %20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
  •   %-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
  •   %.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
  •   %20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。

四、案例:

运行对应的代码,就可以得到对应的日志,这是log4j与slf4j日志系统的使用         

代码:

package com.turtle.log;

import com.turtle.utils.ExceptionOutputStreamUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.text.SimpleDateFormat;
import java.util.Date; public class LogTest { private final static Logger logger = LoggerFactory.getLogger(LogTest.class); public static void main(String[] args) {
logger.info("programer processing......");
try{
// 会产生除以0的异常信息
System.out.println(1/0);
}catch (Exception e){
// 将异常信息打印到日志文件中去
String exception = ExceptionOutputStreamUtil.getTrace(e);
// 输出日志文件
logger.error("Programer error:"+ exception+"\t"+"【"+new SimpleDateFormat("yyyy-MM-dd/HH.mm.ss").format(new Date())+"】");
}
logger.debug("start Debug detail......");
}
}

com.turtle.log.LogTest

package com.turtle.log1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class LogTest { private final static Logger logger = LoggerFactory.getLogger(LogTest.class); public static void main(String [] args){ logger.info("com.turtle.log1.LogTest的Info级别日志");
logger.debug("com.turtle.log1.LogTest的Debug级别日志"); }
}

com.turtle.log1.LogTest

package com.turtle.log2;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class LogTest { private final static Logger logger = LoggerFactory.getLogger(LogTest.class); public static void main(String [] args){ logger.info("com.turtle.log2.LogTest的Info级别日志");
logger.debug("com.turtle.log2.LogTest的Debug级别日志"); }
}

com.turtle.log2.LogTest

package com.turtle.utils;

import java.io.PrintWriter;
import java.io.StringWriter; public class ExceptionOutputStreamUtil { /**
* 将传入的具体错误信息转换为输出流进行输出
* @param t
* @return
*/
public static String getTrace(Throwable t) {
StringWriter stringWriter= new StringWriter();
PrintWriter writer= new PrintWriter(stringWriter);
t.printStackTrace(writer);
writer.close();
StringBuffer buffer= stringWriter.getBuffer();
return buffer.toString();
}
}

com.turtle.utils.ExceptionOutputStreamUtil

### set log levels ###
log4j.rootLogger = DEBUG,stdout,D,E # 配置日志信息输出目的地
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# Target是输出目的地的目标
log4j.appender.stdout.Target = System.out
# 指定日志消息的输出最低层次
log4j.appender.stdout.Threshold = INFO
# 定义名为stdout的输出端的layout类型
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
# 如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss} %l%m%n # 名字为D的对应日志处理
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
# File是输出目的地的文件名
log4j.appender.D.File = LOG//app_debug.log
#false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.TTCCLayout # 名字为E的对应日志处理
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = LOG//app_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n log4j.logger.com.turtle.log1 = DEBUG,A1
log4j.logger.com.turtle.log2 = ERROR,A2 log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File = LOG//A1_app_debug.log
log4j.appender.A1.Append = true
log4j.appender.A1.Threshold = DEBUG
log4j.appender.A1.layout = org.apache.log4j.TTCCLayout log4j.appender.A2 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.File = LOG//A2_app_error.log
log4j.appender.A2.Append = true
log4j.appender.A2.Threshold = ERROR
log4j.appender.A2.layout = org.apache.log4j.TTCCLayout

log4j.properties

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.turtle</groupId>
<artifactId>log</artifactId>
<version>1.0-SNAPSHOT</version> <name>log</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency> </dependencies> </project>

pom.xml

五、总结:

日志的关键配置包括输出目标,信息等级,文件形式和格式控制,各个配置灵活调整,可在不同的文件中找到不同的有用的信息,格式控制中%c/%t/%l在一个庞大的项目中十分有用。有些配置文件自己老是会忘记,所以花点时间,把log4j与slf4j的使用进行一个汇总,总结一下,理出属于自己的思路,方便后面的复习。

日志管理-log4j与slf4j的使用的更多相关文章

  1. commons-logging和Log4j 日志管理/log4j.properties配置详解

    commons-logging和Log4j 日志管理 (zz) 什么要用日志(Log)? 这个……就不必说了吧. 为什么不用System.out.println()? 功能太弱:不易于控制.如果暂时不 ...

  2. 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系

    log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...

  3. MDC到日志管理配置

    MDC是什么? 第一次接触MDC,很蒙圈.看看导入的包import org.slf4j.Logger;import org.slf4j.LoggerFactory:import org.slf4j.M ...

  4. Spring Boot 整合 slf4j+log4j 实现日志管理

    一:首先新建一个jar项目,如下图: 二:添加log4j的依赖,如下pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0 ...

  5. java日志,(commons-loging 、log4j 、slf4j 、LogBack介绍)

    如果对于commons-loging .log4j .slf4j .LogBack 等都已经非常清楚了,可以忽略本文.几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所 ...

  6. slf4j+logback搭建超实用的日志管理模块

    文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们 ...

  7. Java日志框架(Commons-logging,SLF4j,Log4j,Logback)

    简介 在系统开发中,日志是很重要的一个环节,日志写得好对于我们开发调试,线上问题追踪等都有很大的帮助.但记日志并不是简单的输出信息,需要考虑很多问题,比如日志输出的速度,日志输出对于系统内存,CPU的 ...

  8. java日志组件介绍(common-logging,log4j,slf4j,logback )

    转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...

  9. JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]

    1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...

随机推荐

  1. @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列

    目录 @description@ @solution@ @part - 0@ @part - 1@ @accepted code@ @details@ @description@ 小 D 有 n 个 ...

  2. Mac OSX原生读写NTFS功能开启方法

    macOX系统内建的NTFS支持默认只能读不能写 原生读写NTFS,需要自行终端命令手动开启 1. 插上磁盘 此时Mac桌面应该会显示出插入的磁盘,但是当你想把文件拖入磁盘的时候,发现是不能拖进去的, ...

  3. 《C语言深度解剖》学习笔记之关键字

    第一章 关键字 C语言共有32个关键字. 关键字   auto 声明自动变量 int 声明整型变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整 ...

  4. windows 下的 Apache 二级域名 目录绑定配置

    通常我们注册的域名都是顶级域名  如 www.potatog.com,我们希望这个域名可以访问服务器的不同网站或者不同功能等等 可能会这样 www.potatog.com/api 或者 www.pot ...

  5. 光程科技IOS签名配置

    光程科技IOS签名配置,APICloudAPP签名时config配置必须加上: <preference name="appCertificateVerify" value=& ...

  6. SuperSocket根据条件获取 Session

    如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer ...

  7. Python--day24--复习

  8. 小程序与HTML5的区别

    小程序与传统HTML5还是有明显的区别,主要区别在于: 开发工具不同: 区别于H5的开发工具+浏览器Device Mode预览的模式,小程序的开发基于自己的开发者工具,可以实现同步本地文件+开发调试+ ...

  9. 浅谈Python Django框架

    1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. ...

  10. 【9103】求n的累加和

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 用高精度方法,求s=1+2+3+...+n的精确值(n以一般整数输入) Input 文件输入仅一行,输入n ...