|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.Java天下里,日记库就和很多其他库[1]一样,你有多个选择,多个还不错的选择,好比log4j,java.util.logging,logback,别的另有一些一致的logapi,好比slf4j,common-logging等。而C++感到开源的好用的有口碑的日记库并非那末丰厚[2]。
选择
Java的日记库分为两种,一种是供应一致的api,如slf4j,common-logging;一种是供应真实的完成,如log4j,java.util.logging和logback。前者能够自在搭配前面真实的完成库。
会呈现这类情形的缘故原由是java日记库万马齐喑,这会有这么一个成绩:假定我的程序利用到两个库,第一个利用了log4j,而第二个利用了java.util.logging,两个log库同时事情,一定不是功德:
- 日记输入格局大概纷歧致,增添浏览,剖析难度;
- 加载两份一样功效的库对classpath的整齐和内存利用会发生影响;
- 乃至另有大概二者没法兼容,运转时呈现成绩。
- 限定了我的程序对日记库的选择-我依附的库已用了A日记库了,我最好也是用A吧,固然我很喜好B
以是呈现了供应一致api的日记库(不外这玩意多了,仍是会回到本来的成绩),供公用的库写日记都要这些一致的api,用户程序也是用这些一致的api,然后用户能够部署本人喜好的实践功效日记库,供应真正写日记的功效。
我选择利用slf4j+logback的组合,固然我写的不是一个公用库,但这类利用体例使我未来能够十分简单的交换日记库完成。
由于我的使用临时还没有甚么特别的请求,以是选择绝对来说不是很仔细,也许是:
- 选择slf4j而不是common-logging,由于slf4j更新更酷,且办理了选择性情式化输入[3]与classloader[4]的成绩。
- 选择logback,由于log4j将被logback替换;由于logback和slf4j是统一个作者写的(即log4j的作者),信任他们会集作的更好
设置
起首是在ivy中到场对slf4j和logback的依附:
- <dependencyorg="org.slf4j"name="slf4j-api"rev="1.6.6"conf="runtime->default"/><dependencyorg="ch.qos.logback"name="logback-classic"rev="1.0.6"conf="runtime->default"/><dependencyorg="ch.qos.logback"name="logback-core"rev="1.0.6"conf="runtime->default"/>
复制代码 由于logback内置了与slf4j的binder,你无需像利用log4j大概java.util.Logging时那样供应分外的binderjar包。
然后,对logback做一些设置,供应一个logback的设置文件:
<br>- <?xmlversion="1.0"encoding="UTF-8"?><configurationdebug="true"><contextName>interviewerportal</contextName><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><target>System.out</target><!--denyalleventswithalevelbelowINFO,thatisTRACEandDEBUG--><filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><encoder><pattern>%d{ISO8601}[%thread]%-5level%logger{20}-%msg%n</pattern></encoder></appender><appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>output/logs/interviewerportal.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>output/logs/interviewerportal.%i.log</fileNamePattern><minIndex>1</minIndex><maxIndex>9</maxIndex></rollingPolicy><triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><!--allowalllogmessagestobewrittentologfile--><filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>TRACE</level></filter><encoder><pattern>%d{ISO8601}[%thread]%-5level%logger{20}-%msg%n</pattern></encoder></appender><!--globallogger:tobothconsole&file--><rootlevel="trace"><appender-refref="STDOUT"/><appender-refref="FILE"/></root></configuration>
复制代码
<br>
这里设置了两个输入:一个尺度输入,一个文件输入,尺度输入只显现INFO及以下级其余log;而文件输入显现一切级其余log。关于文件输入,同时还界说了文件交换战略:铛铛前日记文件年夜于某个数值时,入手下手写到一个新的日记文件中往。
把这个文件放到classpath的根目次下,见(https://github.com/lzprgmr/interviewerportal/blob/master/interviewerportal/src/logback.xml),logback在启动时会主动读取该文件并使用设置。
利用十分复杂:
<br>- packageinterviewerportal.domain;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassSLF4JTest{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(SLF4JTest.class);publicstaticvoidmain(String[]args){logger.error("Hello,error");logger.warn("Hello,warn");logger.info("Hello,info");logger.debug("Hello,debug");logger.trace("Hello,trace");logger.info("{}+{}",1,2);}}
复制代码
<br>
[1]好比webMVC框架有Stuts,SpringMVC,JSF(JavaServerFaces,J2EE供应),具体见此;前端显现的有freemarker,jsp(jstl)等;webserver有tomcat,jetty等;applicationserver有GlassFish,JBoss,WebSphere,WebLogic,TomEE等,具体见此。
[2]C++的日记库实在也很多,有google的glog,apache的log4cxx(log4j的兄弟版本),pantheios,和boost.log(该库已被承受进进boost,但今朝还未包括进boost的公布中,大概会在2012岁暮?)
[3]slf4j撑持一种高效的格局化输入字符串:loger.info("{}+{}",1,2)。假如以后的loglevel没有被翻开,则该条信息不会被log,并且该字符串格局化也不会实行,从而进步了效力;而之前,为了不此种情形,你常常必要写出丑恶的if:if(logger.isInfoEnabled())loger.info("{}+{}",1,2)
[4]common-logging是经由过程classloader加载真实的日记库完成的,假如代码中有多份classloader,便可能呈现成绩,具体见此。
但是我同意你的观点,对于大型项目来说,应该是采用框架的一部分,根据功能的不同而改进,欢迎你能再提出些宝贵意见,我会多多学习的。说到jbuilder,我可能是个人感觉,用的时候确实没有vs爽,我最喜欢的IDE是net网页编程beans,谢谢。 |
|