Spring整合log4j日志组件

简介:
+关注继续查看

Log4j是Apache的一个开放源代码项目,通过使用Log4j,控制日志信息输送的目的地可以为控制台、文件、数据库、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;可以控制每一条日志的信息内容和信息输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程;甚至还可以在不需要修改业务逻辑代码、重启web服务,只需要通过一个修改配置文件就可以实现控制项目的日志动作。

首先,日志的级别有:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL 等等。


  1. OFF:关闭了日志信息

  2. FATAL:可能导致应用中止的严重事件错误

  3. ERROR:严重错误 主要是程序的错误

  4. WARN:一般警告,比如session丢失

  5. INFO:一般要显示的信息,比如登录登出

  6. DEBUG:程序的调试信息

  7. TRACE:比DEBUG更细粒度的事件信息

  8. ALL:打开所有级别的日志

log4j提供了一系列的Appender,允许将日志输送到不同的地方,如控制台、文件、数据库等:


  1. org.apache.log4j.ConsoleAppender(控制台)

  2. org.apache.log4j.FileAppender(文件)

  3. org.apache.log4j.jdbc.JDBCAppender(数据库)

  4. org.apache.log4j.net.SMTPAppender(邮件)

  5. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

  6. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

  7. org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

结合日志的级别,可以将不同级别的日志信息输送到不同的位置作为记录或者事后查找问题作为依据。一般的信息可以通过文件或者数据库的形式存储,错误信息可以发送邮件给相关的负责人或者发短信报警给相关的负责人,这些在log4j看来轻松搞定。此刻,已经觉得Java轻松做掉了PHP需要花费大量工作才能搞定的事情。

关于log4j的配置参数请参考网上的资料,下面就简单的讲解如何在Spring框架中整合log4j作为日志的操作组件来服务项目吧:

  1. pom.xml 引入log4j组件依赖包:


  1. 1 <dependency>

  2. 2 <groupId>log4j</groupId>

  3. 3 <artifactId>log4j</artifactId>

  4. 4 <version>1.2.15</version>

  5. 5 <scope>runtime</scope>

  6. 6 </dependency>

  1. web.xml里边配置servlet容器启动时,自动加载log4j配置并注入组件:


  1. 1 <context-param>

  2. 2 <param-name>log4jConfigLocation</param-name>

  3. 3 <param-value>classpath:conf/log4j.properties</param-value>

  4. 4 </context-param>

  5. 5 <context-param>

  6. 6 <param-name>log4jRefreshInterval</param-name>

  7. 7 <param-value>5000</param-value>

  8. 8 </context-param>

  9. 9 <listener>

  10. 10 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

  11. 11 </listener>

这里,我将log4j.properties配置文件存放到classpath的conf目录下,并启动一个watchdog线程每5秒扫描配置文件的变化,重新调整日志的策略,实现在不调整逻辑代码即可实现日志的策略变更。通过log4j.properties详细配置了日志的策略,如下:


  1. 1 # +======================================================================+#

  2. 2 log4j.rootLogger=${log4j.log.level},${log4j.log.target}

  3. 3 log4j.addivity.org.apache=true

  4. 4 # +======================================================================+#

  5. 5 # | [target] - Console

  6. 6 # +----------------------------------------------------------------------+#

  7. 7 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

  8. 8 log4j.appender.CONSOLE.Threshold=${log4j.log.level}

  9. 9 log4j.appender.CONSOLE.Encoding=${log4j.log.encoding}

  10. 10 log4j.appender.CONSOLE.Target=System.out

  11. 11 log4j.appender.CONSOLE.layout=${log4j.log.layout}

  12. 12 log4j.appender.CONSOLE.layout.ConversionPattern=${log4j.log.layout.pattern}

  13. 13 # +======================================================================+#

  14. 14 # | [target] - FILE

  15. 15 # +----------------------------------------------------------------------+#

  16. 16 log4j.appender.FILE=org.apache.log4j.RollingFileAppender

  17. 17 log4j.appender.FILE.Threshold=${log4j.log.level}

  18. 18 log4j.appender.FILE.Encoding=${log4j.log.encoding}

  19. 19 log4j.appender.FILE.File=${log4j.log.dir}/runtime.log

  20. 20 log4j.appender.FILE.Append=true

  21. 21 log4j.appender.FILE.MaxFileSize=2048KB

  22. 22 log4j.appender.FILE.MaxBackupIndex=10

  23. 23 log4j.appender.FILE.layout=${log4j.log.layout}

  24. 24 log4j.appender.FILE.layout.ConversionPattern=${log4j.log.layout.pattern}

  25. 25 # +======================================================================+#

  26. 26 # | [target] - DATABASE

  27. 27 # +----------------------------------------------------------------------+#

  28. 28 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender

  29. 29 log4j.appender.DATABASE.Threshold=ERROR

  30. 30 log4j.appender.DATABASE.URL=jdbc:mysql://127.0.0.1:3306/spring

  31. 31 log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver

  32. 32 log4j.appender.DATABASE.user=root

  33. 33 log4j.appender.DATABASE.password=liuriqi

  34. 34 log4j.appender.DATABASE.layout=${log4j.log.layout}

  35. 35 log4j.appender.DATABASE.sql=INSERT INTO tv_log4j(message)VALUES('${log4j.log.layout.pattern}')

  36. 36 # +======================================================================+#

  37. 37 # | [target] - EMAIL

  38. 38 # +----------------------------------------------------------------------+#

  39. 39 log4j.appender.EMAIL=org.apache.log4j.net.SMTPAppender

  40. 40 log4j.appender.EMAIL.Threshold=FATAL

  41. 41 log4j.appender.EMAIL.BufferSize=10

  42. 42 log4j.appender.EMAIL.From=fromuser@gmail.com

  43. 43 log4j.appender.EMAIL.SMTPHost=localhost

  44. 44 log4j.appender.EMAIL.Subject=Log4J Message

  45. 45 log4j.appender.EMAIL.To=touser@gmail.com

  46. 46 log4j.appender.EMAIL.layout=${log4j.log.layout}

  47. 47 log4j.appender.EMAIL.layout.ConversionPattern=${log4j.log.layout.pattern}

  48. 48 # +======================================================================+#

  49. 49 上面配置相关的变量,我提取出来统一放到变量配置文件里边,如下:

  50. 50

  51. 51 # +======================================================================+#

  52. 52 # | log4j config

  53. 53 # +----------------------------------------------------------------------+#

  54. 54 log4j.log.dir=logs/

  55. 55 #log4j.log.level=ALL,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF

  56. 56 log4j.log.level=DEBUG

  57. 57 #log4j.log.target=CONSOLE,FILE,DATABASE,EMAIL,SOCKET

  58. 58 log4j.log.target=CONSOLE,FILE

  59. 59 log4j.log.encoding=UTF-8

  60. 60 log4j.log.layout=org.apache.log4j.PatternLayout

  61. 61 log4j.log.layout.pattern=[%d %r] [%-5p] [%t] [%l] [%m]%n

  62. 62 # +======================================================================+#

通过以上配置,在项目启动的时候,会将DEBUG日志信息发送到控制台和文件日志中。

最后,可以在应用程序中采用log4j自带的debug()、info()、warn()、error()方法来记录你想要记录的操作,至于如何存储日志及日志的目的地发送的工作就交给log4j好了。

最后一点说明的问题:配置较低级别的错误日志策略会记录高级的错误信息,配置高级的错误日志策略会忽略低级错误信息。如将错误日志的level配置为debug,则log4j组件会记录包含debug以上所有的级别日志如debug、info、warn、error、fatal等。加入你配置的为error级别,则不会记录error以下级别的日志信息如debug、info、warn等等。


原文发布时间为:2018-11-1

本文作者:小白教程

本文来自云栖社区合作伙伴“Java杂记”,了解相关信息可以关注“Java杂记”。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
16天前
|
中间件
日志作用域及结构化日志组件serilog
上一节开始,我们学习了如何用日志框架来优雅的记录日志,这一节我们接着来学习一下日志相关的知识。
|
2月前
|
存储 JSON 缓存
K8s日志组件-Loki是如何存储数据的?
日志记录本质上是一个事件。大多数语言、应用程序框架或库都支持日志,表现形式可以是字符串这样原始的非结构化数据,也可以是JSON等半结构化数据。开发者可以通过日志来分析应用的执行状况,报错信息,分析性能…… 正因为日志极其灵活,生成非常容易,没有一个统一的结构,所以它的体量也是最大的。
120 0
|
2月前
|
Prometheus Kubernetes 监控
Kubernetes 各组件日志清理
今天看到k8s的nodeexport pod failed,看到是磁盘空间压力过高。
161 0
|
3月前
|
SpringCloudAlibaba Java 微服务
SpringCloud Alibaba微服务实战三十一 - 业务日志组件
SpringCloud Alibaba微服务实战三十一 - 业务日志组件
154 0
|
4月前
|
JavaScript 小程序 Java
Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
|
5月前
|
JavaScript 小程序 Java
手动实现 SpringBoot 日志链路追踪,无需引入组件,日志定位更方便!
手动实现 SpringBoot 日志链路追踪,无需引入组件,日志定位更方便!
|
5月前
|
Java Spring
Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
229 0
|
6月前
|
前端开发
#yyds干货盘点 react笔记之学习之修改log组件
#yyds干货盘点 react笔记之学习之修改log组件
63 0
#yyds干货盘点 react笔记之学习之修改log组件
|
7月前
|
JSON 中间件 Go
Golang高性能日志库zap + lumberjack 日志切割组件详解
Golang高性能日志库zap + lumberjack 日志切割组件详解
916 0
Golang高性能日志库zap + lumberjack 日志切割组件详解
|
7月前
|
前端开发
#yyds干货盘点# react笔记之学习之修改log组件
#yyds干货盘点# react笔记之学习之修改log组件
63 0
#yyds干货盘点# react笔记之学习之修改log组件
相关产品
云迁移中心
推荐文章
更多