幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

带你深入JavaLog框架,彻底搞懂Log4JLog4J2L

  最近系统被扫出来还在使用老旧的log4j,需要升级到最新的log4j。但是在升级的发现,Java相关的日志处理库有log4j,log4j2,slf4j和logback,初一看确实有点头大,那么区别是啥呢?之前也大概知道一些,查找了大量相关资料,这里好好总结一下,相信你读完就会熟练掌握。Log4J、Log4J2和LogBack的历史故事
  使用过Log4J和LogBack的同学肯定能发现,这两个框架的设计理念极为相似,使用方法也如出一辙。其实这个两个框架的作者都是一个人,CekiGlc,俄罗斯程序员。
  Log4J最初是基于Java开发的日志框架,发展一段时间后,作者CekiGlc将Log4j捐献给了Apache软件基金会,使之成为了Apache日志服务的一个子项目。又由于Log4J出色的表现,后续又被孵化出了支持C,C,C,Perl,Python,Ruby等语言的子框架。
  然而,伟大的程序员好像都比较有个性。CekiGlc由于不满Apache对Log4J的管理,决定不再参加Log4J的开发维护。出走后的CekiGlc另起炉灶,开发出了LogBack这个框架(SLF4J是和LogBack一起开发出来的)。LogBack改进了很多Log4J的缺点,在性能上有了很大的提升,同时使用方式几乎和Log4J一样,许多用户开始慢慢开始使用LogBack。
  由于受到LogBack的冲击,Log4J开始式微。终于,2015年9月,Apache软件基金业宣布,Log4j不再维护,建议所有相关项目升级到Log4j2。Log4J2是Apache开发的一个新的日志框架,改进了很多Log4J的缺点,同时也借鉴了LogBack,号称在性能上也是完胜LogBack。性能这块后面我会仔细分析。那slf4j和这些有什么关系?
  SLF4J的全称是SimpleLoggingFacadeforJava,slf4j是门面模式的典型应用,因此在讲slf4j前,需要简单介绍下门面模式。看看门面模式再说
  下面是门面模式的一个典型调用过程,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。下图中客户端不需要直接调用几个子系统,只需要与统一的门面进行通信即可。
  门面模式的核心为Facade即门面对象,核心为几个点:知道所有子角色的功能和责任。将客户端发来的请求委派到子系统中,没有实际业务逻辑。不参与子系统内业务逻辑的实现。为什么要使用slf4j?
  回答这个问题之前,我们先看看如果需要用上面几个日志框架来打印日志,一般怎么做,具体代码如下:使用log4j,需要log4j。jarimportorg。apache。log4j。Logger;Loggerloggerlog4jLogger。getLogger(Test。class);loggerlog4j。info(HelloWorld!);使用log4j2,需要log4japi。jar、log4jcore。jarimportorg。apache。logging。log4j。LogManager;importorg。apache。logging。log4j。Logger;Loggerloggerlog4j2LogManager。getLogger(Test。class);loggerlog4j2。info(HelloWorld!);logback,需要logbackclassic。jar、logbackcore。jarimportch。qos。logback。classic。Logger;importch。qos。logback。classic。LoggerContext;LoggerloggerlogbacknewLoggerContext()。getLogger(Test。class);loggerlogback。info(HelloWorld!);
  从上面不难看出,使用不同的日志框架,就要引入不同的jar包,使用不同的代码获取Logger。如果项目升级需要更换不同的框架,那么就需要修改所有的地方来获取新的Logger,这将会产生巨大的工作量。
  基于此,我们需要一种接口来将不同的日志框架的使用统一起来,这也是为什么要使用slf4j的原因。
  SLF4J,即简单日志门面(SimpleLoggingFacadeforJava),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
  注意:类似的日志门面还有JakartaCommonlogging(JCL),主要区别在于,SLF4J是一个比较新的日志框架,它更加灵活,性能更好,支持更多的日志实现,而且JCL基于classLoader在运行时动态加载日志框架,可能会产生很多意想不到的安全问题,关于这个问题可以参考讨论stackoverflow。comquestions3
  通过上面的介绍,我们可以知道JCL和SLF4J都是日志门面(Facade),而Log4J、Log4J2和LogBack都是子系统角色(SunSystem),也就是具体的日志实现框架。他们的关系如下,JUL是JDK本身提供的一种实现。
  使用日志门面引入日志组件的最大优势是:将系统和具体的日志实现框架解耦合。slf4j怎么和日志框架结合使用?
  使用slf4j后,当我们在打印日志时,就可以使用下面的方式:importorg。slf4j。Logger;importorg。slf4j。LoggerFactory;LoggerloggerLoggerFactory。getLogger(Test。class);logger。info(HelloWorld!)
  这又引入了另外一个问题,slf4j如何决定使用哪个框架日志呢,并且引入哪些jar包呢?官方为我们准备了下面的组合依赖结构图:
  总结来说,就是一下几种:slf4jlogback:slf4japi。jarlogbackclassic。jarlogbackcore。jarslf4jlog4j:slf4japi。jarslf4jlog412。jarlog4j。jarslf4jjul:slf4japi。jarslf4jjdk14。jar也可以只用slf4j无日志实现:slf4japi。jarslf4jnop。jar
  注意到这里没有log4j2依赖jar的关系,和log4j2配合需要导入log4j2的log4japi。jar、log4jcore。jar和桥接包log4jslf4jimpl。jar。
  所谓的桥接包,就是实现StaticLoggerBinder类,用来连接slf4j和日志框架。因为log4j和log4j2刚开始没有StaticLoggerBinder这个类,为了不改变程序结构,只能重新写一个新的jar来实现StaticLoggerBinder。而logback出现slf4j之后,于是在logback本身的jar中实现了StaticLoggerBinder,所以就不需要桥接包。现在为什么推荐Log4j2?
  ApacheLog4j2是Log4j(1)的升级版,比它的祖先Log4j1。x和logback有了很大的改进。除了内部设计的调整外,主要有以下几点的大升级:更简化的配置更强大的参数格式化最夸张的异步性能
  Log4j2中,分为API(log4japi)和实现(log4jcore)两个模块。API和slf4j是一个类型,属于日志抽象门面,而实现部分,才是Log4j2的核心。org。apache。logging。log4jlog4japiorg。apache。logging。log4jlog4jcore
  log4j2在目前JAVA中的日志框架里,异步日志的性能是最高的,具体可以看下面的对比图:
  log4j2采用了字符串复用等手段来实现零GC模式运行,另外提供了MemoryMappedFileAppender实现了极高的IO性能,而且API相比slf4j,有更丰富的参数格式化功能。怎么使用Log4j2?
  说了半天,那怎么去使用Log4j2呢,这部分我仔细介绍一下。常规使用步骤
  下面以Maven配置为例进行介绍。首先需要加入log4j的依赖,注意2。17。1以下的版本会有远程代码执行的安全漏洞,具体参考Apache官方文档dependencygroupIdorg。apache。logging。log4jgroupIdlog4japiartifactIdversion2。17。2versiondependencydependencygroupIdorg。apache。logging。log4jgroupIdlog4jcoreartifactIdversion2。17。2versiondependency配置好log4j2。xml配置文件,并放到项目的classpath里面,一般会放到resources目录里面。下面是一个参考的配置,当然也可以使用properties文件和yaml文件来进行配置。lt;?xmlversion1。0encodingUTF8?ConfigurationstatusWARNConsolenameLogToConsoletargetSYSTEMOUTPatternLayoutpatternd{HH:mm:ss。SSS}〔t〕5levellogger{36}msgnConsoleAppendersLoggersLoggernamecom。malaoshileveldebugadditivityfalseLoggerRootlevelerrorRootLoggersConfiguration在程序中打印log。使用下面的方式来打印log即可。importorg。apache。logging。log4j。LogManager;importorg。apache。logging。log4j。Logger;publicclassHelloWorld{privatestaticfinalLoggerloggerLogManager。getLogger(HelloWorld。class);publicstaticvoidmain(String〔〕args){logger。debug(HellofromLog4j2);inolddays,weneedtocheckthelogleveltoincreaseperformanceif(logger。isDebugEnabled()){logger。debug({},getNumber());}withJava8,wecandothis,noneedtochecktheloglevellogger。debug({},()getNumber());}staticintgetNumber(){return5;}}
  输出如下:19:12:25。337〔main〕DEBUGcom。malaoshi。HelloWorldHellofromLog4j219:12:25。340〔main〕DEBUGcom。malaoshi。HelloWorld5配置文件详解
  首先给大家看一个比较全面的配置文件,可能看起来比较头大,不急我后面会一点点仔细分析。lt;?xmlversion1。0encodingUTF8?!ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a级别以及优先级排序:OFFFATALERRORWARNINFODEBUGTRACEALL!Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出!monitorInterval:Log4j能够自动检测修改配置文件和重新配置本身,设置间隔秒数configurationstatusWARNmonitorInterval30!先定义所有的appender!这个输出控制台的配置consolenameConsoletargetSYSTEMOUT!输出ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的格式PatternLayoutpattern〔d{HH:mm:ss:SSS}〕〔p〕lmnconsole!文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用FilenamelogfileNamelogtest。logappendfalsePatternLayoutpatternd{HH:mm:ss。SSS}5levelclass{36}LMmsgxExnFile!这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a会自动存入按年份月份建立的文件夹下面并进行压缩,作为存档RollingFilenameRollingFileInfofileName{sys:user。home}logsinfo。logfilePattern{sys:user。home}logs{date:yyyyMM}infod{yyyyMMdd}i。log!控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)ThresholdFilterlevelinfoonMatchACCEPTonMismatchDENYPatternLayoutpattern〔d{HH:mm:ss:SSS}〕〔p〕lmnPoliciesTimeBasedTriggeringPolicySizeBasedTriggeringPolicysize100MBPoliciesRollingFileRollingFilenameRollingFileWarnfileName{sys:user。home}logswarn。logfilePattern{sys:user。home}logs{date:yyyyMM}warnd{yyyyMMdd}i。logThresholdFilterlevelwarnonMatchACCEPTonMismatchDENYPatternLayoutpattern〔d{HH:mm:ss:SSS}〕〔p〕lmnPoliciesTimeBasedTriggeringPolicySizeBasedTriggeringPolicysize100MBPolicies!DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20DefaultRolloverStrategymax20RollingFileRollingFilenameRollingFileErrorfileName{sys:user。home}logserror。logfilePattern{sys:user。home}logs{date:yyyyMM}errord{yyyyMMdd}i。logThresholdFilterlevelerroronMatchACCEPTonMismatchDENYPatternLayoutpattern〔d{HH:mm:ss:SSS}〕〔p〕lmnPoliciesTimeBasedTriggeringPolicySizeBasedTriggeringPolicysize100MBPoliciesRollingFileappenders!然后定义logger,只有定义了logger并引入的appender,appender才会生效loggers!过滤掉spring和mybatis的一些无用的DEBUG信息loggernameorg。springframeworklevelINFOloggerloggernameorg。mybatislevelINFOloggerrootlevelallrootloggersconfiguration
  下面为大家仔细解析这个配置文件,
  1。根节点
  Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger)。status用来指定log4j本身的打印日志的级别。monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s。
  2。Appenders节点
  Appenders节点,常见的子节点有:Console、RollingFile、File。
  Console节点用来定义输出到控制台的Appender。name:指定Appender的名字。target:SYSTEMOUT或SYSTEMERR,一般只设置默认:SYSTEMOUT。PatternLayout:输出格式,不设置默认为:mn。
  File节点用来定义输出到指定位置的文件的Appender。name:指定Appender的名字。fileName:指定输出日志的目的文件带全路径的文件名。PatternLayout:输出格式,不设置默认为:mn。
  RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender。name:指定Appender的名字。fileName:指定输出日志的目的文件带全路径的文件名。PatternLayout:输出格式,不设置默认为:mn。filePattern:指定新建日志文件的名称格式。Policies是指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。
  TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1hour。modulatetrue用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am。。。而不是7am。
  SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
  3。Loggers
  Loggers节点,常见子节点有:Root和Logger。
  Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出level:日志输出级别,共有8个级别,按照从低到高为:AllTraceDebugInfoWarnErrorFatalOFF。AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender。
  Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。level:日志输出级别,共有8个级别,按照从低到高为:AllTraceDebugInfoWarnErrorFatalOFF。name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivityfalse只在自定义的Appender中进行输出。
  4。日志Level
  共有8个级别,按照从低到高为:AllTraceDebugInfoWarnErrorFatalOFF。All:最低等级的,用于打开所有日志记录。Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。Info:消息在粗粒度级别上突出强调应用程序的运行过程。Warn:输出警告及warn以下级别的日志。Error:输出错误信息日志。Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。OFF:最高等级的,用于关闭所有日志记录。
  程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。参考范例
  这部分给大家提供几个常用的配置,直接放到项目里面改一下包名就可以用。
  1。输出日志到Consolelt;?xmlversion1。0encodingUTF8?ConfigurationstatusDEBUGConsolenameLogToConsoletargetSYSTEMOUTPatternLayoutpatternd{HH:mm:ss。SSS}〔t〕5levellogger{36}msgnConsoleAppendersLoggers!avoidduplicatedlogswithadditivityfalseLoggernamecom。mkyongleveldebugadditivityfalseLoggerRootlevelerrorRootLoggersConfiguration
  2。输出日志到文件lt;?xmlversion1。0encodingUTF8?ConfigurationstatusDEBUGConsolenameLogToConsoletargetSYSTEMOUTPatternLayoutpatternd{HH:mm:ss。SSS}〔t〕5levellogger{36}msgnConsoleFilenameLogToFilefileNamelogsapp。logPatternLayoutPatterndpc{1。}〔t〕mnPatternPatternLayoutFileAppendersLoggersLoggernamecom。malaoshileveldebugadditivityfalseLoggerLoggernameorg。springframework。bootlevelerroradditivityfalseLoggerRootlevelerrorRootLoggersConfiguration
  3。输出到文件并滚动生成新的日志文件ConfigurationstatusDEBUGConsolenameLogToConsoletargetSYSTEMOUTPatternLayoutpatternd{HH:mm:ss。SSS}〔t〕5levellogger{36}msgnConsoleRollingFilenameLogToRollingFilefileNamelogsapp。logfilePatternlogs{date:yyyyMM}appd{MMddyyyy}i。log。gzPatternLayoutPatterndpc{1。}〔t〕mnPatternPatternLayoutPoliciesTimeBasedTriggeringPolicySizeBasedTriggeringPolicysize10MBPoliciesRollingFileAppendersLoggers!avoidduplicatedlogswithadditivityfalseLoggernamecom。malaoshileveldebugadditivityfalseLoggerRootlevelerrorRootLoggersConfiguration
  以上就是所有的内容,看完下来就会搞清楚各种log框架的关系,以及如何在项目中使用这些log框架。

想说什么,我说了算STANCE打造袜柜概念店,倡导为自我发声美国潮流品牌STANCE携全新12色基础系列新款产品打造的TAKEaSTANCE袜柜概念店,于4月30日开始闪现上海SmallCompanyCoffee。现场通过独树一帜的So……街拍紧身短裤美女魅力nbspshow出你的性感美腿夏季穿搭中,什么款式的裤子最招人喜爱?答案无疑是热裤,而小编在本单元中将介绍有关于它的街拍搭配,时刻让你感受到纤细修长的美腿与丰富多彩的层次感穿搭。在夏季穿搭中,什么款式……街拍超短热裤露臀装nbsp搭配出街拍的休闲感非常简单百搭的一款高腰提臀牛仔热裤,对妹子来说是的百搭单品,无论是搭配各种衬衫或是像上图那样搭配修身的T恤都非常时尚漂亮。再搭配一双白色高帮板鞋。。。非常简单百搭的一款高……米兰时装周上花样多nbsp总有一款适合你米兰时装周是每年都会举行一次的时尚盛典,其中不乏有很多的好莱坞明星的参与,也会有很多国内人气明星的身影。快来看看米兰时装周展出的衣服中有没有适合你的那一件吧!到了夏天,相……ParticlenbspFever发布百变金刚运动装特别系列2017年10月,ParticleFever(粒子狂热)在品牌成立两周年之际,发布了百变金刚特别系列,模特化身游戏角色将各类运动当成赛事比拼,并且毫不违和地展现了运动服装的设计……市值跌没了600亿,上海莱士为何被抛弃?文杨万里如果一家公司股价年线连跌6年,你会不会拿着键盘去砸电脑?这是一个什么时间概念呢,当年轻小白变成老股民,炒股依然没赚到钱。俗话说,一寸光阴一寸金,投资最难受的……爱丽丝ALICE与W。Reflex合作,全新力作闪耀纽约时装汇聚顶尖设计师、时尚名流的2018年春夏纽约时装周于9月8日正式盛大开幕!这场久负盛名的超级时尚盛典吸引了来自全球顶级明星观秀团,共同见证世界最新潮流的诞生。纽约一时间成为众星……lenbspsaundanbsp40周年幸福序幕正式揭开LoveforLife幸福的陪伴不知不觉,lesaunda走进了第40个年头,在这投机炒作的年代,我们不忘初衷,从一而终地坚持着品质的传承,用心为顾客制作最合适的鞋子,这……ParticlenbspFevernbsp用身体去思考nbsParticleFever(粒子狂热)是国内第一个设计师高端运动品牌,名字来源于几位主创都很喜欢的一部纪录片《粒子狂热》,讲述的是1000多个科学家试图通过巨大的对撞机寻找一个……奚梦瑶的最爱,时尚圣经vogue联合推荐,淘宝一千零一夜的b微博讨论top2,微信上时尚大号联合推荐,淘宝上搜索量疯长,一天狂加购近5万件,这里说的不是什么明星街拍同款,大牌力推秀款,而是一款之前不为人所知的内衣品类Bralette。……德国瑞士奥地利游记(15)列支敦士登公国欧洲中部的袖珍小国我们离开瑞士琉森(卢塞恩),前往列支敦士登公国首都瓦杜兹。从琉森到瓦杜兹约100公里。沿途经过瑞士的阿尔卑斯山区,空气纯净,风光优美。特别使我印象深刻的是公路沿线到处可见……艾莱依x变形金刚城市快闪店,跨界联合新营销今年7月初,借着《变形金刚5:最后的骑士》上映档期,艾莱依先后在西安大明宫万达广场、大连高新万达广场、大连柏威年购物中心和烟台大悦城举办了艾莱依x变形金刚城市快闪店。活动现场如……
海盗船发布新款4K144Hz2K240Hz显示器IT之家7月19日消息,今晚,海盗船发布了新款CORSAIRXENEON系列游戏显示器,包括CORSAIRXENEON32UHD144和XENEON32QHD240两款,分别为……B费C罗的确在处理家庭问题,我们必须给他一些尊重的空间在31战胜水晶宫后,曼联取得了季前赛的三连胜,此前球队分别战胜了利物浦以及墨尔本胜利队。在接受采访时,球队中场B费谈到了新教练滕哈格给球队带来的变化。对此,他表示滕哈格给球队带……比Windows更轻量级的系统,PrimeOS,让旧电脑起死对于安卓系统很多人是非常熟悉的,毕竟安卓系统占据了国内手机的半壁江山。但对于Androidx86版,不少人应该是陌生的,之前主要用在intel的Win安卓双合一平板。……书香云南丨一起领略名家笔下的七彩云南今天是第27个世界读书日1972年,联合国教科文组织向全世界发出走向阅读社会的召唤并于1995年宣布4月23日为世界读书日人间四月天,……高血压,源于胃热,一张方,清除邪热,清胃除烦降血压今天和大家聊聊和肠胃有关的高血压。肠胃又不是血压计,调治肠胃就能把血压降下来么?别急,几分钟带大家看看是怎么一回事:这是我之前接诊过的一个高血压患者自己量的时候最高……中医科普I皮肤屏障到底是什么?我们通常所说的皮肤屏障一个是角质层,一个是皮脂膜。角质层是皮肤的最外层,有三个重要的功能。保湿功能角质层就是皮肤的大水库,它能够锁住水分,防止水分丧失。如果没有角质……重走长征路,其实一点儿也不高尚经过46天的长途跋涉,郭叔的我的重走长征路终于画上了并不完善的句号。自从2月26日启程的那一天,就有不同的声音在耳畔回荡。有人认为高大上,选了一个绝对政治正确的主题……魅族春季新品发布会开始预热IT之家4月13日消息,魅族科技今天开始预热春季发布会,但发布会日期需要等到明天才会揭晓。徐徐清风,滟滟随波。春海生活,明天见。当然,从目前的爆料来看魅族19系列基……装备不荒废,pick一波居家露营新潮疫情,偷走了春天,也让一大波人开始伤春悲秋,在四月里继续着春愁。。。。。。从早到晚的居家式办公、睁眼就上班、令人捉急的网速和龟速运转的电脑,似乎又给浮躁的心点了一把火。……华泰金工林晓明团队FADT组合上周绝对收益3。67人工智能选林晓明S0570516010001研究员SFCNo。BPY421何康S0570520080004研究员SFCNo。BRB318李子钰S057051911……积极向上的短句文案1。每天都要好好生活2。知足上进不负野心3。慢慢变好我是你也是。4。爱会来的,在对的时候。5。偷偷厉害,万事尽可期待。6。只有输得起的人,才配赢。……7点43分,赵继伟发文暴露位置,辽篮多人已抵达海南,高诗岩惊目前CBA进入到了休赛期,每支俱乐部都会在此期间积极进行调整,以此来更好的备战新赛季。而近日最先公布重磅消息的便是青岛男篮,他们将前浙江稠州主教练刘维伟招募队中,相信随着时间的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网