一. 为什么要使用日志

二. 常见日志框架介绍

三. Logback+SLF4J实战

四. 项目源码下载

五. 参考文章

 

一. 为什么要使用日志

1. 对IT安全至关重要

  当您使用强大的日志管理软件自动触发以保护您的系统时,您已经赢得了一半的战斗,以确保您的IT基础设施安全。某些日志管理工具具有阻止可疑IP地址,删除帐户,甚至完全关闭显示受感染迹象的计算机的内置功能。
  此外,有效的日志管理工具可以实现并简化您的入侵检测系统。因此,当您的入侵检测系统发出恶意活动信号时,您可以快速检查由日志管理工具生成和维护的日志文件。日志文件可以进一步提供重要线索,便于故障排除以帮助您。

2. 帮助企业更有效地运营

  使用日志管理工具的直接好处之一是它可以最大限度地减少生产中的停机时间。日志管理工具是解决方案带中的主要力量,可以使您智能地掌握与生产相关的可能问题。它允许您知道什么时候重要的事情已经改变或改变。反过来,这会对您的技术平稳运行以及整个业务流程产生重大影响。
  此外,有效的日志管理对于满足合规性也很重要。某些合规性要求您监控和记录每个应用程序以及IT基础架构中的系统的事件。

3. 找到问题的根源

  使用复杂的日志管理工具维护日志文件允许进行根本原因分析,稍后便于调试。你可以避免艰苦的手工努力,试图弄清楚什么是轨道,以及究竟是什么导致了一个可能的问题。这进一步使您在处理所有类型的问题时越来越有效。
  您可以浏览日志文件,甚至可以使用该工具发现任何违规行为。这有助于使系统恢复正常工作。日志管理工具可帮助您更深入地识别现代组织遇到的威胁。

二. 常见日志框架介绍

1. JDKLog

  JDKLog是JDK官方提供的一个记录日志的方式,直接在JDK中就可以使用

  1. import java.util.logging.Logger;
  2. /****
  3. ** JDKLog Demo
  4. **/
  5. public class JDKLog
  6. {
  7. public static void main( String[] args )
  8. {
  9. Logger logger = Logger.getLogger("JDKLog");
  10. logger.info("Hello World.");
  11. }
  12. }

温馨提示:JDKLog 的有点是使用非常简单,直接在 JDK 中就可以使用。但 JDKLog 功能比较太过于简单,不支持占位符显示,拓展性比较差,所以现在用的人也很少

2. Log4J

  Log4J 是 Apache 的一个日志开源框架,有多个分级(DEBUG/INFO/WARN/ERROR)记录级别,可以很好地将不同日志级别的日志分开记录,极大地方便了日志的查看。

3. LogBack

  LogBack 其实可以说是 Log4J 的进化版,因为它们两个都是同一个人(Ceki Gülcü)设计的开源日志组件。LogBack 除了具备 Log4j 的所有优点之外,还解决了 Log4J 不能使用占位符的问题。

4. SLF4J:适配器

  JDKLog、Log4J、LogBack 这几个常用的日志记录框架,它们都有各自的优缺点,适合在不同的场景下使用。可能简单的项目直接用 JDKLog 就可以了,而复杂的项目需要用上 Log4J。
  很多时候我们做项目都是从简单到复杂,也就是我们很可能一开始使用的是 JDKLog,之后业务复杂了需要使用 Log4J,这时候我们如何将原来写好的日志用新的日志框架输出呢?
  一个最死板的方法就是一行行代码修改,把之前用 JDKLog 的日志代码全部修改成 Log4J 的日志接口。但是这种方式不仅效率低下,而且做的工作都是重复性的工作,这怎么能忍呢。
  正是因为在实际的项目应用中,有时候可能会从一个日志框架切换到另外一个日志框架的需求,这时候往往需要在代码上进行很大的改动。为了避免切换日志组件时要改动代码,这时候一个叫做 SLF4J(Simple Logging Facade for Java,即Java简单日志记录接口集)的东西出现了。
  SLF4J(Simple Logging Facade for Java,即Java简单日志记录接口集)是一个日志的接口规范,它对用户提供了统一的日志接口,屏蔽了不同日志组件的差异。这样我们在编写代码的时候只需要看 SLF4J 这个接口文档即可,不需要去理会不同日之框架的区别。而当我们需要更换日志组件的时候,我们只需要更换一个具体的日志组件Jar包就可以了。

三. Logback+SLF4J实战

1. maven添加依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.wxc</groupId>
  7. <artifactId>testlog</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <!-- 添加slf4j日志api -->
  11. <dependency>
  12. <groupId>org.slf4j</groupId>
  13. <artifactId>slf4j-api</artifactId>
  14. <version>1.7.20</version>
  15. </dependency>
  16. <!-- 添加logback-classic依赖 -->
  17. <dependency>
  18. <groupId>ch.qos.logback</groupId>
  19. <artifactId>logback-classic</artifactId>
  20. <version>1.2.3</version>
  21. </dependency>
  22. <!-- 添加logback-core依赖 -->
  23. <dependency>
  24. <groupId>ch.qos.logback</groupId>
  25. <artifactId>logback-core</artifactId>
  26. <version>1.2.3</version>
  27. </dependency>
  28. </dependencies>
  29. </project>

2. 在项目的资源文件中添加logback.xml代码

xml存放位置

 

代码如下

  1. <!-- ch.qos.logback.classic.filter.ThresholdFilter 临界值过滤器, 过滤掉低于指定临界值的日志
  2. ch.qos.logback.classic.filter.LevelFilter 将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。 -->
  3. <configuration>
  4. <property name="APP_Name" value="testlog" /> //这里为此项目的日志文件夹名
  5. <property name="log.dir" value="F:/home"></property> //这里为日志的存储地址
  6. <timestamp key="bySecond" datePattern="yyyyMMdd HHmmss"/>
  7. <contextName>${APP_Name}</contextName>
  8. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  9. <layout class="ch.qos.logback.classic.PatternLayout">
  10. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} [%file:%line] - %msg%n</Pattern>
  11. </layout>
  12. </appender>
  13. <!-- 按日期和大小区分的滚动日志 -->
  14. <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
  15. <encoder>
  16. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
  17. </encoder>
  18. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  19. <level>INFO</level>
  20. <onMatch>ACCEPT</onMatch>
  21. <onMismatch>DENY</onMismatch>
  22. </filter>
  23. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  24. <fileNamePattern>${log.dir}/${APP_Name}/info/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
  25. <maxHistory>30</maxHistory>
  26. <timeBasedFileNamingAndTriggeringPolicy
  27. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  28. <maxFileSize>10MB</maxFileSize>
  29. </timeBasedFileNamingAndTriggeringPolicy>
  30. </rollingPolicy>
  31. </appender>
  32. <!-- 按日期和大小区分的滚动日志 -->
  33. <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
  34. <!-- 必须指定,否则不会往文件输出内容 -->
  35. <encoder>
  36. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
  37. </encoder>
  38. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  39. <level>DEBUG</level>
  40. <onMatch>ACCEPT</onMatch>
  41. <onMismatch>DENY</onMismatch>
  42. </filter>
  43. <!-- 必需要指定rollingPolicy 与 triggeringPolicy 属性 否则不会生成文件-->
  44. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  45. <fileNamePattern>${log.dir}/${APP_Name}/debug/debug.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
  46. <maxHistory>30</maxHistory>
  47. <timeBasedFileNamingAndTriggeringPolicy
  48. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  49. <maxFileSize>10MB</maxFileSize>
  50. </timeBasedFileNamingAndTriggeringPolicy>
  51. </rollingPolicy>
  52. </appender>
  53. <!-- error级别只按日期滚动生成日志 -->
  54. <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  55. <!-- 必须指定,否则不会往文件输出内容 -->
  56. <encoder>
  57. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
  58. </encoder>
  59. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  60. <level>ERROR</level>
  61. <!-- <onMatch>ACCEPT</onMatch>
  62. <onMismatch>DENY</onMismatch>-->
  63. </filter>
  64. <!-- 必需要指定rollingPolicy 与 triggeringPolicy 属性 否则不会生成文件-->
  65. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  66. <fileNamePattern>${log.dir}/${APP_Name}/error/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
  67. <maxHistory>30</maxHistory>
  68. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  69. <maxFileSize>10MB</maxFileSize>
  70. </timeBasedFileNamingAndTriggeringPolicy>
  71. </rollingPolicy>
  72. <!-- 默认值是10MB。 -->
  73. <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  74. <maxFileSize>5MB</maxFileSize>
  75. </triggeringPolicy> -->
  76. </appender>
  77. <!-- 滚动记录文件 -->
  78. <appender name="MONITOR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  79. <encoder>
  80. <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{85} - %msg%n</Pattern>
  81. </encoder>
  82. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  83. <level>DEBUG</level>
  84. </filter>
  85. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  86. <fileNamePattern>${log.dir}/${APP_Name}/monitor/monitor.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
  87. <maxHistory>30</maxHistory>
  88. <timeBasedFileNamingAndTriggeringPolicy
  89. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  90. <maxFileSize>10MB</maxFileSize>
  91. </timeBasedFileNamingAndTriggeringPolicy>
  92. </rollingPolicy>
  93. </appender>
  94. <logger name="org" level="INFO" /> <!--将org包下面的所有日志级别设为了ERROR -->
  95. <logger name="monitor" additivity="false" level="DEBUG" />
  96. <logger name="monitor" additivity="false" level="DEBUG">
  97. <appender-ref ref="MONITOR" />
  98. </logger>
  99. <root level="DEBUG">
  100. <appender-ref ref="STDOUT" />
  101. <appender-ref ref="FILE_INFO" />
  102. <appender-ref ref="FILE_DEBUG" /> //上线时 这个需注释掉,debug级别的日志
  103. <appender-ref ref="FILE_ERROR" />
  104. </root>
  105. </configuration>

3. 测试代码

  1. public class TestLogback {
  2. private final static Logger logger = LoggerFactory.getLogger(TestLogback.class);
  3. public static void main(String[] args) {
  4. logger.error("测试出错了");
  5. logger.info("测试出错了");
  6. logger.debug("测试出错了");
  7. }
  8. public static void testErr()
  9. {
  10. String[] name = {"1", "2", "3"};
  11. try
  12. {
  13. System.out.println(name[5]);
  14. }
  15. catch (Exception e)
  16. {
  17. e.printStackTrace();
  18. logger.error("出现异常:"+e);
  19. logger.error("数据越界了");
  20. }
  21. }
  22. }

4. 运行结果

 
 
 

四. 项目源码下载

链接:https://pan.baidu.com/s/1pzxMlDKl92AlamO8cg9jFA
提取码:rhgu

五. 参考文章

https://www.cnblogs.com/baizhanshi/p/7911123.html

java之日志管理的更多相关文章

  1. Java 日志管理最佳实践

    转:http://blog.jobbole.com/51155/ 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源.对于开 ...

  2. Java日志管理方法(转载)

    原文地址:http://www.cnblogs.com/leocook/p/log_java.html java开发中常见的几种日志管理方案有以下4种: 1. Commons-logging + lo ...

  3. Java日志管理

    首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼ 您还未登录 ! 登录 注册 JavaCrazyer的ItEye(codewu.com)技术博客   博客 微博 相册 收藏 留言 关于我   ...

  4. Java中的日志管理

    日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java. ...

  5. 4种Java日志管理方法

    java开发中常见的几种日志管理方案有以下4种: 1. Commons-logging + log4j 2. log4j 3. slf4j + log4j + commmons-logging 4. ...

  6. 基础架构之日志管理平台搭建及java&net使用

    在现代化的软件开发流程中,日志显得非常的重要,不可能再零散的游离在各个项目中,等查看日志的时候再登录服务器去到特定的目录去查看,这显然很繁琐且效率低下,所有整合一套日志管理平台,也显得非常重要,这篇文 ...

  7. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...

  8. 【Java分享客栈】超简洁SpringBoot使用AOP统一日志管理-纯干货干到便秘

    前言 请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧. 实现 本篇AOP统一日志管理写法来源于国 ...

  9. 【Java EE 学习 76 下】【数据采集系统第八天】【通过AOP实现日志管理】【日志管理功能分析和初步实现】

    一.日志管理相关分析 1.日志管理是一种典型的系统级别的应用,非常适合使用spring AOP实现. 2.使用日志管理的目的:对系统修改的动作进行记录,比如对权限.角色.用户的写操作.修改操作.删除操 ...

随机推荐

  1. http请求抓包神器-Fiddler(记录和检查你电脑的所有http通讯)

    Fiddler是做什么的,能帮助我们做什么? 1.能够监听http/httpS的流量,可以截获从浏览器或者客户端软件向服务器发送的http/https请求: 2.对截获之后的请求,我们还能够查看请求中 ...

  2. [Swift]LeetCode209. 长度最小的子数组 | Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  3. [Swift]LeetCode941. 有效的山脉数组 | Valid Mountain Array

    Given an array A of integers, return true if and only if it is a valid mountain array. Recall that A ...

  4. [原创]利用Browser协议探测内网主机操作系统版本(无需端口无视防火墙)

    利用Browser协议可获取机器IP.MAC.机器名.操作系统.域,如图 浏览 在SMB协议中,计算机为了访问网络资源,就需要了解网络上存在的资源列表(例如在Windows下使用网络邻居查看可以访问的 ...

  5. 6.jQuery(实例)

    1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. 说一说MVC的Authentication过滤(四)

    前沿: 一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登 ...

  7. 使用dotnet build时复制引用dll到生成目录

    默认配置下dotnet build只会输出项目代码的dll,依赖用的是dotnet缓存中的dll,只有dotnet publish才会把依赖的dll一起输出到生成目录. 在项目csproj文件中添加以 ...

  8. Python和C++的混合编程(使用Boost编写Python的扩展包)

    想要享受更轻松愉悦的编程,脚本语言是首选.想要更敏捷高效,c++则高山仰止.所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中.原来贡献过一篇<c++和js的混合编程>也是 ...

  9. 【Python3爬虫】Scrapy入门教程

    Python版本:3.5            系统:Windows 一.准备工作 需要先安装几个库(pip,lxml,pywin32,Twisted,pyOpenSSL),这些都比较容易,如果使用的 ...

  10. Koa 框架常用知识点整理

    简介 Koa 就是一种简单好用的 Web 框架.它的特点是优雅.简洁.表达力强.自由度高.本身代码只有1000多行,所有功能都通过插件实现. 学前准备 检查Nodejs版本 打开cmd命令行窗口nod ...