<meta http-equiv="refresh" content="1"/>

# log4j日志组件 #
- SLF4J,一个**通用日志接口**
    log4j、logback、log4j2等日志系统都可以无缝对接
- log4j的配置详解
- 如何实现自定义过滤输出

### SLF4J ###
> + SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。
> + 实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
> + log4j是Apache的一个开源项目,log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,他抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款新组件,性能较之log4j有了近10倍的提升,社区活跃度很高。

### log4j配置 ###
> ```
> # log4j有三大组件:logger appender layout
> # logger     日志级别相关
> # appender     日志输出相关
> # layout    输出格式相关
>
> # log4j的根配置
> # -第一个位置表示输出日志的级别[level],  debug --> info --> warn --> error
> # -之后的表示自定义输出的logger,用来分别按需求进行处理
> # level参数:表示默认情况下的输出级别,如果一个包或者类没有指定输出级别,那么就会按照这个默认的来
> log4j.rootLogger = INFO, stdout, fileout
> # 如果指定了某个包的输出级别,他会与默认的rootLogger进行merge操作(level会覆盖掉)
> #log4j.logger.logtest=ERROR
> # logger 不仅可以指定输出级别,还可以指定输出器输出
> log4j.logger.logtest=DEBUG, logtestout
>
> # Appender 为日志输出目的地,Log4j提供的appender有以下几种:
> # org.apache.log4j.ConsoleAppender(控制台),
> # org.apache.log4j.FileAppender(文件),
> # org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
> # org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
> # org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
> #
> # 1.ConsoleAppender选项
> #     Threshold=WARN:指定日志消息的输出最低层次。
> #     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
> #     Target=System.err:默认情况下是:System.out,指定输出控制台
> # 2.FileAppender 选项
> #     Threshold=WARN:指定日志消息的输出最低层次。
> #     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
> #     File=mylog.txt:指定消息输出到mylog.txt文件。
> #     Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
> # 3.DailyRollingFileAppender 选项
> #     Threshold=WARN:指定日志消息的输出最低层次。
> #     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
> #     File=mylog.txt:指定消息输出到mylog.txt文件。
> #     Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
> #     DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
> #     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: 每分钟
> # 4.RollingFileAppender 选项
> #     Threshold=WARN:指定日志消息的输出最低层次。
> #     ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
> #     File=mylog.txt:指定消息输出到mylog.txt文件。
> #     Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
> #     MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
> #     MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
>
> # Layout:日志输出格式,Log4j提供的layout有以下几种:
> # org.apache.log4j.HTMLLayout(以HTML表格形式布局),
> # org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
> # org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
> # org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
>
> # 打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:
> # %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
> # %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
> # %r: 输出自应用启动到输出该log信息耗费的毫秒数
> # %c: 输出日志信息所属的类目,通常就是所在类的全名
> # %t: 输出产生该日志事件的线程名
> # %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
> # %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
> # %%: 输出一个"%"字符
> # %F: 输出日志消息产生时所在的文件名称
> # %L: 输出代码中的行号
> # %m: 输出代码中指定的消息,产生的日志具体信息
> # %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
> #
> #  可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
> #    类似于 C语言的格式化输出printf 和 Java中的StringFormat中的占位符
> #      1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
> #      2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
> #      3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
> #      4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
>
> log4j.appender.stdout=org.apache.log4j.ConsoleAppender
> # Threshold=level 只是显示当前定义的logger中≥level的才会显示
> # 如果定义了 DEBUG、WARN和ERROR级别的信息,但是Threshold设置的是WARN,那么只会显示WARN和ERROR的信息
> log4j.appender.stdout.Threshold=DEBUG
> log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
> log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss},%6.6r]%-5p[%t]%x(%F\:%L) - %m%n   
>
> log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender
> log4j.appender.fileout.Threshold=WARN
> log4j.appender.fileout.File=d:/fileout-WARN.log
> log4j.appender.fileout.DatePattern='.'yyyy-MM-dd
> log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
> log4j.appender.fileout.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss},%6.6r]%-5p[%t]%x(%F\:%L) - %m%n
>
> log4j.appender.logtestout=org.apache.log4j.DailyRollingFileAppender
> log4j.appender.logtestout.Threshold=WARN
> log4j.appender.logtestout.File=d:/logtestout-WARN.log
> log4j.appender.logtestout.DatePattern='.'yyyy-MM-dd
> log4j.appender.logtestout.layout=org.apache.log4j.PatternLayout
> log4j.appender.logtestout.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss},%6.6r]%-5p[%t]%x(%F\:%L) - %m%n
> ```

### 测试阶段 ###
> ```
> 导入maven依赖,包含slf4j-api-xxx.jar、slf4j-log4j12-xxx.jar、log4j-xxx.jar
> <!-- 日志组件 -->
> <dependency>
>     <groupId>org.slf4j</groupId>
>     <artifactId>slf4j-log4j12</artifactId>
>     <version>1.7.19</version>
> </dependency>
>
> 将上面的log4j.properties拷贝到classpath中,SE程序在src根目录,WEB程序放在WEB-INF或者src根目录,MAVEN程序放在resources中
>
> 测试包的代码
> /**
>  * 日志配置,log4j.properties的测试
>  */
> public class LoggerTest {
>
>     Logger log = LoggerFactory.getLogger(this.getClass());
>     
>     public LoggerTest() {
>         log.debug("init the LoggerText...");
>     }
>     
>     public void test( ) {
>         log.info("initialize the variable of i...");
>         int i = 0;
>         log.warn("self add the variable of i...");
>         i++;
>         log.error("print the variable of i...");
>         System.err.println("i = " + i);
>     }
>     
>     // Run this program
>     public static void main(String[] args) {
>         new LoggerTest().test();
>     }
> }
>
> 输出结果:
> [2018-08-24 11:51:49,     0]DEBUG[main](LoggerTest.java:16) - init the LoggerText...
> [2018-08-24 11:51:49,     7]INFO [main](LoggerTest.java:20) - initialize the variable of i...
> [2018-08-24 11:51:49,     7]WARN [main](LoggerTest.java:22) - self add the variable of i...
> [2018-08-24 11:51:49,     8]ERROR[main](LoggerTest.java:24) - print the variable of i...
> i = 1
> 磁盘放置了两个文件夹,分别是上边配置的logtestout-WARN.log.yyyy-MM-dd和fileout-WARN.log.yyyy-MM-dd
> 输出内容与自己定义的级别一样
> ```

log4j整理的更多相关文章

  1. 项目启动log4j相关警告问题

    在项目启动时出现了下面的警告: log4j:WARN custom level class [xxxxx] not found. 出现这个错误,不是log4j的问题,也是slf4j的问题,问题是因为自 ...

  2. spring mvc整合mybaitis和log4j

    在上一篇博客中,我介绍了在mac os上用idea搭建spring mvc的maven工程,但是一个完整的项目肯定需要数据库和日志管理,下面我就介绍下spring mvc整合mybatis和log4j ...

  3. 【重新整理】log4j 2的使用

    一 概述 1.1 日志框架 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log ...

  4. log4j.properties 配置的学习整理

    参考资料: log4j.properties:用来做什么的(日志) Log4j:由2部分组成 :loggers(记录器)            ----日志的类别 appender(输出源)     ...

  5. log4j个人使用整理

    Log4j介绍: 略过. 配置: Eclipse项目中添加log4j.jar到lib下. 在bin目录下新建log4j.properties,编辑好log4j配置文件. 样例分析: log4j.roo ...

  6. log4j和commons- logging(好文整理转载)

    一 :为什么同时使用commons-logging和Log4j?为什么不仅使用其中之一? Commons-loggin的目的是为 “所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱( ...

  7. log4j 2整理

    # Log4j 2最佳实践 #Log4j的1.x版本已经被广泛使用于很多应用程序中.然而,它这些年的发展已经放缓.它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015年8月寿终正寝 ...

  8. 国外程序员整理的Java资源大全分享

    Java 几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员 Andreas Kull 在其 Github 上整理了非常优秀的 Java 开发资源,推荐给大家. 译文由 Imp ...

  9. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

随机推荐

  1. 吐槽一下wp toolkit ToggleSwitch控件

    之前用法: <toolkit:ToggleSwitch> <toolkit:ToggleSwitch.Header> <TextBlock Text="2323 ...

  2. windowsPhone一些不常见控件

    1.InkPresenter:可以产生手写效果的控件. http://www.cnblogs.com/randylee/archive/2010/08/10/1791222.html 2.Thumb: ...

  3. 手机打车APP的机遇与挑战

    所谓打车APP,就是个能安装在手机上的打车软件.原理是通过GPS进行定位,能够搜索附近的空车信息然后反馈给用户.同样的,空车信息也会反馈给用户.一般这种啊APP都是跟地图类软件一起的.比如百度地图,谷 ...

  4. java 中 ==

    @Test public void fuu2(){ String a = new String("aw"); String b = new String("aw" ...

  5. Spring AOP的实现机制

    AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理,日志,缓存等等.AOP 实现的关键在 ...

  6. 构建docker镜像

    一.通过docker commit命令构建镜像 docker commit 构建镜像可以想象为是将运行的镜像进行重命名另存一份.我们先创建一个容器,并在容器里做出修改,就像修改代码一样,最后再将修改提 ...

  7. spring配置文件中导入约束的详细步骤

    这里先以<beans>元素为例: 首先在eclipse中引入相关约束: 点击OK后,这个约束就被引入到eclipse中了,这一步的意义在于:就算你处于脱机情况下(不能联网),也能给你提示. ...

  8. npm i -S -D -g 区别

    npm install 本身就有一个别名 npm i npm i module_name -S    即    npm install module_name --save     写入depende ...

  9. list和tuple

    1. 列表--list 列表用[]表示 l=[1,2,3,'zs'] print(l) 输出:[1,2,3,'zs'] 1.利用下标获取列表元素,下标从0开始 print(l[3]) 输出:zs pr ...

  10. 一款不错的Linux终端颜色设置

    PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ " #步骤# vi ...