网站小图标 免费,电商网店运营,阿里巴巴运营视频,wifi网络优化软件目录 概述 java.util.logging (JUL) Log4j Logback Log4j vs Logback common-logging slf4j common-logging vs slf4j 总结实施日志解决方案 引入jar包 slf4j直接绑定日志组件 slf4j兼容非slf4j日志组件 spring 集成 slf4j … 目录 概述 java.util.logging (JUL) Log4j Logback Log4j vs Logback common-logging slf4j common-logging vs slf4j 总结实施日志解决方案 引入jar包 slf4j直接绑定日志组件 slf4j兼容非slf4j日志组件 spring 集成 slf4j common-logging绑定日志组件 配置 完整的logback.xml参考示例 完整的log4j.xml参考示例 logback配置参数说明 使用API slf4j用法 common-logging用法参考 概述 在项目开发中为了跟踪代码的运行情况常常要使用日志来记录信息。在Java世界有很多的日志工具库来实现日志功能避免了我们重复造轮子。我们先来逐一了解一下主流日志工具。 java.util.logging (JUL) JDK1.4开始通过java.util.logging提供日志功能。它能满足基本的日志需要但是功能没有Log4j强大而且使用范围也没有Log4j广泛。 Log4j Log4j是apache的一个开源项目创始人Ceki Gulcu。Log4j应该说是Java领域资格最老应用最广的日志工具。从诞生之日到现在一直广受业界欢迎。Log4j是高度可配置的并可通过在运行时的外部文件配置。它根据记录的优先级别并提供机制以指示记录信息到许多的目的地诸如数据库文件控制台UNIX系统日志等。Log4j中有三个主要组成部分 loggers: 负责捕获记录信息。appenders : 负责发布日志信息以不同的首选目的地。layouts: 负责格式化不同风格的日志信息。官网地址Logback Logback是由log4j创始人Ceki Gulcu设计的又一个开源日记组件目标是替代log4j。logback当前分成三个模块logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。 官网地址 Log4j vs Logback Logback相比Log4j具有许多好处性能提升logback在log4j基础上做了优化使性能提高了近10倍。此外内存开销也减少了。更充足的测试尽管log4j也做了测试但是logback的测试更加充分。所以logback应该更加稳定。天然支持slf4j因为Logback-classic完全实现了slf4j的接口所以天然支持slf4j。使用slf4j有利于你切换日志工具库减少工作量。自动重载配置文件Logback-classic可以自动重载更新过的配置文件。自动移除旧日志通过配置文件最大数和过期时间Logback可以控制日志文件数并自动清除过期的日志。更灵活、更精细的配置Logback在配置中提供更加丰富的功能来帮助你更加精细的去定制你的日志组件filter提供比log4j更丰富的过滤条件增加if, then 和 else这样的条件控制;打印异常的调用栈信息Logback在打印异常时会打印调用栈的包装数据。Logback-accessLogback-access支持Logback-classic的所有特性并且它可以提供丰富的HTTP-access日志功能。总结以上优点摘自官方推荐理由Reasons to prefer logback over log4j。由于Logback的作者也是Log4j的作者所有推荐理由应该比较靠谱。总之相比于Log4j好处多多你心动了没 common-logging common-logging是apache的一个开源项目。也称Jakarta Commons Logging缩写JCL。common-logging的功能是提供日志功能的API接口本身并不提供日志的具体实现当然common-logging内部有一个Simple logger的简单实现但是功能很弱直接忽略而是在运行时动态的绑定日志实现组件来工作如log4j、java.util.loggin。官网地址 slf4j 全称为Simple Logging Facade for Java即java简单日志门面。什么作者又是Ceki Gulcu这位大神写了Log4j、Logback和slf4j专注日志组件开发五百年一直只能超越自己。类似于Common-Loggingslf4j是对不同日志框架提供的一个API封装可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是slf4j在编译时静态绑定真正的Log库。使用SLF4J时如果你需要使用某一种日志实现那么你必须选择正确的SLF4J的jar包的集合各种桥接包。官网地址 common-logging vs slf4j slf4j库类似于Apache Common-Logging。但是他在编译时静态绑定真正的日志库。这点似乎很麻烦其实也不过是导入桥接jar包而已。slf4j一大亮点是提供了更方便的日志记录方式不需要使用logger.isDebugEnabled()来解决日志因为字符拼接产生的性能问题。slf4j的方式是使用{}作为字符串替换符形式如下 logger.debug(id: {}, name: {} , id, name); 总结 综上所述使用slf4j Logback可谓是目前最理想的日志解决方案了。接下来就是如何在项目中实施了。 实施日志解决方案 使用日志解决方案基本可分为三步 引入jar包配置使用API常见的各种日志解决方案的第2步和第3步基本一样实施上的差别主要在第1步也就是使用不同的库。引入jar包 这里首选推荐使用slf4j logback 的组合。如果你习惯了common-logging可以选择common-logginglog4j。强烈建议不要直接使用日志实现组件(logback、log4j、java.util.logging)理由前面也说过就是无法灵活替换日志库。还有一种情况你的老项目使用了common-logging或是直接使用日志实现组件。如果修改老的代码工作量太大需要兼容处理。在下文都将看到各种应对方法。注据我所知当前仍没有方法可以将slf4j桥接到common-logging。如果我孤陋寡闻了请不吝赐教。 slf4j直接绑定日志组件 slf4j logback添加依赖到pom.xml中即可。logback-classic-1.0.13.jar 会自动将 slf4j-api-1.7.21.jar 和 logback-core-1.0.13.jar 也添加到你的项目中。 dependency groupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.0.13/version
/dependency slf4j log4j添加依赖到pom.xml中即可。slf4j-log4j12-1.7.21.jar 会自动将 slf4j-api-1.7.21.jar 和 log4j-1.2.17.jar 也添加到你的项目中。 dependency groupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.21/version
/dependency slf4j java.util.logging添加依赖到pom.xml中即可。slf4j-jdk14-1.7.21.jar 会自动将 slf4j-api-1.7.21.jar 也添加到你的项目中。 dependency groupIdorg.slf4j/groupIdartifactIdslf4j-jdk14/artifactIdversion1.7.21/version
/dependency slf4j兼容非slf4j日志组件 在介绍解决方案前先提一个概念——桥接什么是桥接呢假如你正在开发应用程序所调用的组件当中已经使用了common-logging这时你需要 jcl-over-slf4j.jar把日志信息输出重定向到 slf4j-apislf4j-api再去调用slf4j实际依赖的日志组件。这个过程称为桥接。下图是官方的slf4j桥接策略图从图中应该可以看出无论你的老项目中使用的是common-logging或是直接使用log4j、java.util.logging都可以使用对应的桥接jar包来解决兼容问题。 slf4j兼容common-logging dependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion1.7.12/version
/dependency slf4j兼容log4j dependencygroupIdorg.slf4j/groupIdartifactIdlog4j-over-slf4j/artifactIdversion1.7.12/version
/dependency slf4j兼容java.util.logging dependencygroupIdorg.slf4j/groupIdartifactIdjul-to-slf4j/artifactIdversion1.7.12/version
/dependency spring 集成 slf4j 做java web开发基本离不开spring框架。很遗憾spring使用的日志解决方案是common-logging log4j。所以你需要一个桥接jar包logback-ext-spring。 dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.1.3/version
/dependency
dependencygroupIdorg.logback-extensions/groupIdartifactIdlogback-ext-spring/artifactIdversion0.1.2/version
/dependency
dependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion1.7.12/version
/dependency common-logging绑定日志组件 common-logging log4j添加依赖到pom.xml中即可。 dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version
/dependency
dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version
/dependency 配置 日志配置文件大同小异需要注意的是logback.xml和log4j.xml都需要放在classpath路径下。 完整的logback.xml参考示例 在下面的配置文件中我为自己的项目代码根目录org.zp.notes.spring设置了五种等级TRACE、DEBUG、INFO、WARN、ERROR优先级依次从低到高。因为关注spring框架本身的一些信息我增加了专门打印spring WARN及以上等级的日志。 ?xml version1.0 encodingUTF-8 ?!-- logback中一共有5种有效级别分别是TRACE、DEBUG、INFO、WARN、ERROR优先级依次从低到高 --
configuration scantrue scanPeriod60 seconds debugfalseproperty nameDIR_NAME valuespring-helloworld/!-- 将记录日志打印到控制台 --appender nameSTDOUT classch.qos.logback.core.ConsoleAppenderencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appender!-- RollingFileAppender begin --appender nameALL classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize30MB/maxFileSize/triggeringPolicyencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appenderappender nameERROR classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/error.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize10MB/maxFileSize/triggeringPolicyfilter classch.qos.logback.classic.filter.LevelFilterlevelERROR/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filterencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appenderappender nameWARN classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/warn.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize10MB/maxFileSize/triggeringPolicyfilter classch.qos.logback.classic.filter.LevelFilterlevelWARN/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filterencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appenderappender nameINFO classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/info.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize10MB/maxFileSize/triggeringPolicyfilter classch.qos.logback.classic.filter.LevelFilterlevelINFO/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filterencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appenderappender nameDEBUG classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/debug.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize10MB/maxFileSize/triggeringPolicyfilter classch.qos.logback.classic.filter.LevelFilterlevelDEBUG/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filterencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appenderappender nameTRACE classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/trace.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize10MB/maxFileSize/triggeringPolicyfilter classch.qos.logback.classic.filter.LevelFilterlevelTRACE/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filterencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appenderappender nameSPRING classch.qos.logback.core.rolling.RollingFileAppender!-- 根据时间来制定滚动策略 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${user.dir}/logs/${DIR_NAME}/springframework.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistory/rollingPolicy!-- 根据文件大小来制定滚动策略 --triggeringPolicy classch.qos.logback.core.rolling.SizeBasedTriggeringPolicymaxFileSize10MB/maxFileSize/triggeringPolicyencoderpattern%d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n/pattern/encoder/appender!-- RollingFileAppender end --!-- logger begin --!-- 本项目的日志记录分级打印 --logger nameorg.zp.notes.spring levelTRACE additivityfalseappender-ref refSTDOUT/appender-ref refERROR/appender-ref refWARN/appender-ref refINFO/appender-ref refDEBUG/appender-ref refTRACE//logger!-- SPRING框架日志 --logger nameorg.springframework levelWARN additivityfalseappender-ref refSPRING//loggerroot levelTRACEappender-ref refALL//root!-- logger end --/configuration 完整的log4j.xml参考示例 log4j的配置文件一般有xml格式或properties格式。这里为了和logback.xml做个对比就不介绍properties了其实也没太大差别。 ?xml version1.0 encodingUTF-8?
!DOCTYPE log4j:configuration SYSTEM log4j.dtdlog4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/appender nameSTDOUT classorg.apache.log4j.ConsoleAppenderlayout classorg.apache.log4j.PatternLayoutparam nameConversionPatternvalue%d{yyyy-MM-dd HH:mm:ss,SSS\} [%-5p] [%t] %c{36\}.%M - %m%n//layout!--过滤器设置输出的级别--filter classorg.apache.log4j.varia.LevelRangeFilterparam namelevelMin valuedebug/param namelevelMax valuefatal/param nameAcceptOnMatch valuetrue//filter/appenderappender nameALL classorg.apache.log4j.DailyRollingFileAppenderparam nameFile value${user.dir}/logs/spring-common/jcl/all/param nameAppend valuetrue/!-- 每天重新生成日志文件 --param nameDatePattern value-yyyy-MM-dd.log/!-- 每小时重新生成日志文件 --!--param nameDatePattern value-yyyy-MM-dd-HH.log/--layout classorg.apache.log4j.PatternLayoutparam nameConversionPatternvalue%d{yyyy-MM-dd HH:mm:ss,SSS\} [%-5p] [%t] %c{36\}.%M - %m%n//layout/appender!-- 指定logger的设置additivity指示是否遵循缺省的继承机制--logger nameorg.zp.notes.spring additivityfalselevel valueerror/appender-ref refSTDOUT/appender-ref refALL//logger!-- 根logger的设置--rootlevel valuewarn/appender-ref refSTDOUT//root
/log4j:configuration logback配置参数说明 logback基本兼容log4j的配置并提供更多的功能。这里奉献一张本人整理的logback配置思维导图高清无码。 使用API slf4j用法 使用slf4j的API很简单。使用LoggerFactory初始化一个Logger实例然后调用Logger对应的打印等级函数就行了。 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class App {private static final Logger log LoggerFactory.getLogger(App.class);public static void main(String[] args) {String msg print log, current level: {};log.trace(msg, trace);log.debug(msg, debug);log.info(msg, info);log.warn(msg, warn);log.error(msg, error);}
} common-logging用法 common-logging用法和slf4j几乎一样但是支持的打印等级多了一个更高级别的fatal。此外common-logging不支持{}替换参数你只能选择拼接字符串这种方式了。 import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class JclTest {private static final Log log LogFactory.getLog(JclTest.class);public static void main(String[] args) {String msg print log, current level: ;log.trace(msg trace);log.debug(msg debug);log.info(msg info);log.warn(msg warn);log.error(msg error);log.fatal(msg fatal);}
} 参考 slf4官方文档logback官方文档log4j官方文档commons-logging官方文档http://blog.csdn.net/yycdaizi/article/details/8276265 作者静默虚空欢迎任何形式的转载但请务必注明出处。限于本人水平如果文章和代码有表述不当之处还请不吝赐教。 转载于:https://www.cnblogs.com/wangchaoyuana/p/7507485.html