当前位置: 首页 > news >正文

网站小图标 免费电商网店运营

网站小图标 免费,电商网店运营,阿里巴巴运营视频,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
http://www.yutouwan.com/news/192522/

相关文章:

  • 网站开发和嵌入式开发wordpress快速仿站
  • 网站建设公司报价贵阳企业免费建站
  • 网站页面设计主要包括网络服务合同范本
  • 广州市网站建设哪里有网站跟app区别
  • 网站图片轮播怎么做的优秀的界面设计作品及评析
  • 做IPv6网站升级的公司有哪些wordpress网站打包app
  • 怎么看别人网站是怎么做的免费自助建站系统平台 贴吧
  • 怎么做wap网站昆明网站建设培训班
  • 网站相关知识网页设计实训报告范文
  • 郑州做网站推广运营商成都关键词优化平台
  • h5游戏网站入口南宁法拍房源信息
  • 代做网站跳转全国企业信息查询网
  • 云开发低码兰州优化官网推广
  • 设计师案例网站游戏推广员是违法的吗
  • 网站推广的具体方案wordpress4.9漏洞
  • 英文网站建设教程wordpress搬家乱码
  • 公司网站建设意见南平 网站建设
  • 义乌网站建设与维护推广平台怎么找客源
  • 网站设计公司网站制作费用网站建设需求单
  • 购物网站有哪些网站建设方案优化
  • icp备案查询站长之家网站负责人查询
  • 蛋糕店网站模板找别人做网站
  • 专业模板建站哪家好网站建设发展的前景
  • 制作网站一般要多少钱东莞自媒体运营推广公司
  • 企业网站建设一般考虑哪些因素?柯桥区交通投资建设集团网站
  • 网站可以更更换空间吗搜索引擎营销的方法
  • html5效果网站重庆房地产新闻
  • 古网站典模板东莞环保公司
  • asp.net 手机网站开发教程wordpress 幻灯片设置
  • 汇编做网站刚建的网站百度搜不到