工作中,用到了log4j2,以前只接触过log4j,也没有太过深入,这次就稍微系统的学习了以下log4j2.

一.引入pom.xml

使用maven作为项目的构建环境,pom.xml使用slf4j,slf4j是一个抽象层,可以使用任意的日志记录.这里就不展开描述了,只需要知道,引入pom.xml后,配置依然和log4j2一样,但是获取到Logger对象稍有不同.只使用log4j2的话,一般是使用LogManager去获取的,但是如果使用slf4j的话,使用LoggerFactory去获取.(后面会讲解)

  1. <properties>
  2. <!-- spring版本号 -->
  3. <spring.version>4.3.2.RELEASE</spring.version>
  4. <!-- log4j日志文件管理包版本 -->
  5. <slf4j.version>1.7.12</slf4j.version>
  6. <log4j.version>2.1</log4j.version>
  7. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  8. </properties>
  9. <dependencies>
  10. <dependency>
  11. <groupId>javax.servlet</groupId>
  12. <artifactId>javax.servlet-api</artifactId>
  13. <version>3.1.0</version>
  14. </dependency>
  15. <!-- spring核心包 -->
  16. <!-- springframe start -->
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-core</artifactId>
  20. <version>${spring.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-web</artifactId>
  25. <version>${spring.version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-oxm</artifactId>
  30. <version>${spring.version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-tx</artifactId>
  35. <version>${spring.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-jdbc</artifactId>
  40. <version>${spring.version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework</groupId>
  44. <artifactId>spring-webmvc</artifactId>
  45. <version>${spring.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework</groupId>
  49. <artifactId>spring-context-support</artifactId>
  50. <version>${spring.version}</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-aop</artifactId>
  55. <version>${spring.version}</version>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-test</artifactId>
  60. <version>${spring.version}</version>
  61. </dependency>
  62. <!--log4j相关配置开始-->
  63. <dependency>
  64. <groupId>org.slf4j</groupId>
  65. <artifactId>slf4j-api</artifactId>
  66. <version>${slf4j.version}</version>
  67. </dependency>
  68. <dependency>
  69. <groupId>org.slf4j</groupId>
  70. <artifactId>jcl-over-slf4j</artifactId>
  71. <version>${slf4j.version}</version>
  72. <scope>runtime</scope>
  73. </dependency>
  74. <dependency>
  75. <groupId>org.apache.logging.log4j</groupId>
  76. <artifactId>log4j-api</artifactId>
  77. <version>${log4j.version}</version>
  78. </dependency>
  79. <dependency>
  80. <groupId>org.apache.logging.log4j</groupId>
  81. <artifactId>log4j-core</artifactId>
  82. <version>${log4j.version}</version>
  83. </dependency>
  84. <dependency>
  85. <groupId>org.apache.logging.log4j</groupId>
  86. <artifactId>log4j-slf4j-impl</artifactId>
  87. <version>${log4j.version}</version>
  88. </dependency>
  89. <dependency>
  90. <groupId>org.apache.logging.log4j</groupId>
  91. <artifactId>log4j-web</artifactId>
  92. <version>${log4j.version}</version>
  93. <scope>runtime</scope>
  94. </dependency>
  95. <!--log4j相关配置结束-->
  96. </dependencies>
  97. <build>
  98. <plugins>
  99. <plugin>
  100. <groupId>org.apache.maven.plugins</groupId>
  101. <artifactId>maven-compiler-plugin</artifactId>
  102. <version>3.1</version>
  103. <configuration>
  104. <source>1.7</source>
  105. <target>1.7</target>
  106. </configuration>
  107. </plugin>
  108. </plugins>
  109. </build>

二.日志级别

  log4j2也有五种日志隔离级别,分别为:

  trace:追踪,是最低的日志级别,相当于追踪程序的执行,一般不怎么使用

  debug:一般在开发中,都将其设置为最低的日志级别.

  info:输出感兴趣的信息,我在开发中一般都会用info去输出.

  warn:警告.有些时候,虽然程序不会报错,但是还是需要告诉程序员的.

  error:错误,这个在开发中也挺常用的,,

  fetal:极其重大的错误,这个一旦发生,程序基本上也要停止了,,目前限于开发经验,我还没有碰到要碰到它的地方.

  日志通过Logger对象输出,Logger对象的获取见下文,输出的API基本如下:Logger对象.日志级别("日志内容");例如:

  

  当日志级别设置为某个值的时候,低于它的日志信息将不会被输出到appender中(稍后会讲解),只有高于设置的级别的信息会被输出到appender中.例如上例中,如果日志级别定义为error,那么这条信息将不会输出.

三.appender和logger

  log4j2是用xml去定义需要的配置的,其中涉及到两个重要的标签,appenders和loggers.appenders顾名思义,代表将其信息输出到哪里,在这个标签内部定义了输出位置的相关信息.appenders标签内部可以有多个appender,表示可以输出到多个位置.这些appender用具体的标签去标识,例如<console>表示输出到控制台的appender,<file>表示输出到文件中.appender内部可以定义输出的格式(用<pattern>标签去标识.),可以定义在达到某个日志级别的时候才给予输出,其余情况拦截(用<ThreadSholdFilter>标签去标识.).

  loggers标签则是定义了一些必要的logger,logger代表用于输出日志信息的具体对象.logger内部有appender,指定这些对象输出的具体位置.可以定义多个appender,其中,logger的定义比较特殊,因为它涉及到了继承,可以结合log4j2的配置文件来看一看.注意log4j2.xml放在classpath下,不需要任何配置就可以加载.

  1. <!-- status为不记录log4j本身的日志 -->
  2. <configuration status="OFF">
  3. <properties>
  4. <property name="LOG_HOME">C:/logs</property>
  5. <property name="FILE_NAME">mylog</property>
  6. </properties>
  7. <appenders>
  8. <Console name="Console" target="SYSTEM_OUT">
  9. <!-- ThresholdFilter相当于拦截器.info以上的命令不会被拦截. -->
  10. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
  11. <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
  12. </Console>
  13. <File name="Error" fileName="${LOG_HOME}/error.log">
  14. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
  15. <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
  16. </File>
  17. <RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
  18. filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz">
  19. <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
  20. <Policies>
  21. <TimeBasedTriggeringPolicy/>
  22. <SizeBasedTriggeringPolicy size="10 MB"/>
  23. </Policies>
  24. </RollingFile>
  25. </appenders>
  26. <loggers>
  27. <root level="info">
  28. <appender-ref ref="RollingFile"/>
  29. <appender-ref ref="Console"/>
  30. <appender-ref ref="Error" />
  31. </root>
  32. <Logger name="com.hlhdidi.servlet" additivity="false">
  33. <appender-ref ref="RollingFile"/>
  34. <appender-ref ref="Console"/>
  35. </Logger>
  36. <Logger name="com.hlhdidi.service" level="error" additivity="true">
  37. <appender-ref ref="Console"/>
  38. </Logger>
  39. </loggers>
  40. </configuration>

  <properties>标签定义了在配置文件上下文可能会用到的键值对的信息(类似于maven).重点看看<loggers>标签,首先是root标签.在log4j2默认所有的日志输出对象(Loggger)都支持<root>标签的相关配置.描述起来可能有些晦涩,但是只要看看Logger对象是如何在类中获取就比较简单了.下面代码是在类中获取Logger对象的方式(如果只使用log4j2使用LoggerManager去获取,参数和返回值都是一样的,就不介绍它了):

  这个参数是传入Class对象,并且返回一个Logger.实际上还可以传入一个字符串,如下:

  但是实际上我们传入的参数是各种各样的,log4j2怎么知道我们需要返回什么样的Logger呢?实际上所有的Logger默认都继承一个配置,就是<root>.log4j2根据name去配置文件依次与各个logger的name互相匹配,寻找对应的logger配置信息.当我们传入的参数为Class对象的时候,实际上name为该Class对象的全类名,如果找到了,则采用该<logger>的配置信息,如果没有找到,则采用默认的配置信息,也就是<root>中定义的配置信息,可以看出,我们在<root>中可以将日志信息输出到三个位置.此外,在配置文件中定义name也是有"讲究"的,前面提到,在Logger对象没有在xml中找到匹配的name的时候,会采用<root>中定义的配置信息,实际上在我们定义<Logger>标签的配置的时候,它默认也是继承<root>中的配置信息的,也就是说,某个具体的<Logger>标签在默认情况下会继承<root>的所有配置.可以设置additivity为false,就可以不使用父类的配置信息.此外,Logger标签相互之间也是有继承的关系的.也就是一个Logger标签的配置信息可以继承另外一个<Logger>标签内部的配置信息.这个log4j2通过name去实现.当一个logger的name是另外一个logger的name的前缀的时候,则称该Logger是另外一个Logger的"父".例如:"com.hlhdidi.web"为name的<Logger>的配置可以继承"com.hlhdidi"为name的<logger>的配置信息.同样也可以使用additivity属性指定不继承.此外,也可以在<Logger>标签上指定level属性.它表示指定该Logger输出日志的最低日志级别.但是有一种特殊情况需要注意:考虑下面的情况:定义了一个<Logger>它的日志级别为info,设置输出到console,<root>的日志级别也定义为info,设置输出到console.当我们使用.info输出信息的时候,如果匹配到此<Logger>,那么根据继承的关系,此时控制台上同一个信息会被输出两遍.这时候,如果我们将<root>的日志级别改为error,继续使用.info输出信息,(使用的Logger依然能匹配到配置文件上的一个具体的<Logger>)那么信息将会输出几次呢?通过输出发现还是两次.我推测可能是log4j内部只要匹配到一个<Logger>,在继承的时候,将不会再次去判断是否符合父类的日志级别.

四.使用

  说了那么多,其实使用log4j2还是很简单的.实际上遵循以下步骤即可使用:

1.写pom.xml/拷jar包

  log4j的核心jar包只有两个,如下:

2.建立配置文件/书写配置文件

  通常将log4j2.xml放在classpath下,这样子在项目启动的时候,就会加载.

3.在类中获取Logger对象,使用Logger对象输出信息

  Logger对象将根据匹配到的<Logger>里的内容输出到指定的appender中.

  1. @WebServlet("/MyWebServlet")
  2. public class MyWebServlet extends HttpServlet {
  3. private static final long serialVersionUID = 1L;
  4. private Logger logger=LoggerFactory.getLogger(MyWebServlet.class);
  5.  
  6. public MyWebServlet() {
  7. logger.error("myservlet初始化了,请做好准备!");
  8. }
  9. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10. logger.error("调用了Get方法的哦");
  11. }
  12.  
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. logger.error("调用了post方法,即将被转接到get方法中去");
  15. }
  16.  
  17. }

 五.SpringBoot整合log4j2

SpringBoot也是我非常喜欢的技术,它整合log4j2非常简单:

1.书写pom.xml

需要注意在springboot-starter-web中去掉log4j2的依赖

  1. <!--默认继承父类去实现-->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>1.4.0.RELEASE</version>
  6. </parent>
  7. <properties>
  8. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  9. <java.version>1.7</java.version>
  10. </properties>
  11. <!-- 添加springboot的web模板 -->
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. <exclusions><!-- 去掉默认配置 -->
  17. <exclusion>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-logging</artifactId>
  20. </exclusion>
  21. </exclusions>
  22. </dependency>
  23. <dependency> <!-- 引入log4j2依赖 -->
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-log4j2</artifactId>
  26. </dependency>
  27. </dependencies>
  28. <build>
  29. <plugins>
  30. <plugin>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-maven-plugin</artifactId>
  33. </plugin>
  34. </plugins>
  35. </build>

2.classpath下建立log4j2.xml以及application.properties文件

在application.properties中指定log4j2.xml的位置:

log4j2.xml省略,应该是和上文相似的配置

3.在Controller中去获取Logger对象,并且打印日志

  1. @Controller
  2. public class WebController {
  3.  
  4. private Logger logger = LoggerFactory.getLogger(this.getClass());
  5.  
  6. @RequestMapping("/index")
  7. @ResponseBody
  8. public String index() {
  9. logger.info("hello world!!");
  10. return "hello world!";
  11. }
  12. }

log4j2使用介绍的更多相关文章

  1. Log4j2 配置笔记(Eclipse+maven+SpringMVC)

    Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <d ...

  2. log4j2配置文件解读

    log4j2可以按照开发人员预先的设定,在指定的位置和情况下打印log语句,并且可以酌情关闭某些log语句,如开发阶段debug类型的语句等.并且,可以使用layout来定义输出语句的格式. 使用前需 ...

  3. SpringBoot—整合log4j2入门和log4j2.xml配置详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维.而日志的输出需要有一定的规划,如日志命名.日志大小,日志分 ...

  4. Java日志 #01# 入门

    很多人在学习完一个东西之后就会忘掉自己作为初学者时的体验.. 例如刚接触git的时候自己也是一头雾水,然后别人问起来,老是会说:xxxx#!@#,就是这么回事儿,有什么不好懂的. 其实从不懂到懂,再到 ...

  5. 探索Java的日志世界

    探索Java的日志世界 本文的思维导图 一.主题 打开日志的大门,探索的Java日志世界 二.目标 了解常用的日志框架 掌握日志框架的选择和使用以及开发规范 了解日志框架中的一些设计思想 三.内容 1 ...

  6. SLF4J其实只是一个门面服务而已,他并不是真正的日志框架,真正的日志的输出相关的实现还是要依赖Log4j、logback等日志框架的。

    小结: 1.加层: 每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性. 为了解决这个问题,就是在日志框架和应用程序之间架设一个 ...

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

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

  8. log4j2介绍及配置

    一.log4j2概述 在日常的开发,测试和生产环境中,日志记录了应用,服务运行过程中的关键信息,以及出现异常时的堆栈,这些信息常常作为查询,定位,解决问题的关键,因此在任何系统中,对日志的使用得当,将 ...

  9. slf4j介绍以及与Log4j、Log4j2、LogBack整合方法

    翻了一下百度和官网.这么介绍slf4j. slf4j 全称 Simple Logging Facade for Java,是日志框架的一种抽象,那么也就是说 slf4j 是不能单独使用的必须要有其他实 ...

随机推荐

  1. 34.js----JS 开发者必须知道的十个 ES6 新特性

    JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> ...

  2. Navicat Premium 安装与激活破解版简单操作 (原)

    首先下载navicate程序以及破解文件,这里一并存到了百度网盘直接下载即可 链接:https://pan.baidu.com/s/11ptFmsV1o3B5oB00zm2NdQ 密码:yw82 解压 ...

  3. MACD各分时背离所对应的时间

    MACD各分时背离所对应的时间 5分钟背离结构——2小时.           15分钟背离结构——一天半(6小时).           30分钟背离结构——3天(12小时).            ...

  4. Windows搭建react-native开发环境

    一.目标平台 windows+android 1. 必须软件 python2+ nodejs npm 2. 安装react-native命令行 $ npm install -g react-nativ ...

  5. VScode编辑器个性化配置

    一.设置方法 “文件” - > “首选项” -> "设置" 二.字体大小和缩进 "editor.tabSize": 2, "editor. ...

  6. JavaScript-年月日转换12小时制

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. Rpgmakermv(24 )yep_coreengine

    ==左部为原文,右边我做了简要翻译=================================== Introduction and Instructions ================= ...

  8. sitecore系统教程之部署架构方式分析

    当您第一次部署Sitecore体验平台时,您可以选择三种主要体系结构选项: 内部部署服务器解决方案 混合服务器方案 云服务器解决方案 您是选择将Sitecore作为云,内部部署还是混合解决方案运行,取 ...

  9. 利用sqoop将hive数据导入导出数据到mysql

    一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令  #  sqoop list-databases --connect jdbc:mysql://localhost:3306 ...

  10. Autel MaxiSys Pro MS908P Software Update Gudie

    This article aims to guide on how to update software for Autel MaxiSys Pro. (Suitable for MaxiDiag E ...