隨筆 - 13  文章 - 47  trackbacks - 0
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          個人博客

          參考文檔

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

               摘要:   閱讀全文
          posted @ 2007-03-11 18:58 西紅柿(tomato) 閱讀(1054) | 評論 (0)編輯 收藏
          ?Acegi安全系統(tǒng)的配置

          ????????
          Acegi 的配置看起來非常復(fù)雜,但事實上在實際項目的安全應(yīng)用中我們并不需要那么多功能,清楚的了解Acegi配置中各項的功能,有助于我們靈活的運用Acegi于實踐中。

          2.1 在Web.xml中的配置

          1)? FilterToBeanProxy
            Acegi通過實現(xiàn)了Filter接口的FilterToBeanProxy提供一種特殊的使用Servlet Filter的方式,它委托Spring中的Bean -- FilterChainProxy來完成過濾功能,這好處是簡化了web.xml的配置,并且充分利用了Spring IOC的優(yōu)勢。FilterChainProxy包含了處理認證過程的filter列表,每個filter都有各自的功能。

          ? ? <filter>
          ??????? <filter-name>Acegi Filter Chain Proxy</filter-name>
          ??????? <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
          ??????? <init-param>
          ??????????? <param-name>targetClass</param-name>
          ??????????? <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
          ??????? </init-param>
          ??? </filter>

          2) filter-mapping
            <filter-mapping>限定了FilterToBeanProxy的URL匹配模式,只有*.do和*.jsp和/j_acegi_security_check 的請求才會受到權(quán)限控制,對javascript,css等不限制。

          ?? <filter-mapping>
          ????? <filter-name>Acegi Filter Chain Proxy</filter-name>
          ????? <url-pattern>*.do</url-pattern>
          ??? </filter-mapping>
          ???
          ??? <filter-mapping>
          ????? <filter-name>Acegi Filter Chain Proxy</filter-name>
          ????? <url-pattern>*.jsp</url-pattern>
          ??? </filter-mapping>
          ???
          ??? <filter-mapping>
          ????? <filter-name>Acegi Filter Chain Proxy</filter-name>
          ????? <url-pattern>/j_acegi_security_check</url-pattern>
          </filter-mapping>

          3) HttpSessionEventPublisher
            <listener>的HttpSessionEventPublisher用于發(fā)布HttpSessionApplicationEvents和HttpSessionDestroyedEvent事件給spring的applicationcontext。

          ??? <listener>
          ??????? <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>
          ??? </listener>


          2.2 在applicationContext-acegi-security.xml中

          2.2.1 FILTER CHAIN

            FilterChainProxy會按順序來調(diào)用這些filter,使這些filter能享用Spring ioc的功能, CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON定義了url比較前先轉(zhuǎn)為小寫, PATTERN_TYPE_APACHE_ANT定義了使用Apache ant的匹配模式

              <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
          ??????? <property name="filterInvocationDefinitionSource">
          ??????????? <value>
          ??????????????? CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
          ??????????????? PATTERN_TYPE_APACHE_ANT
          ?????????????? /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,
          basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,
          exceptionTranslationFilter,filterInvocationInterceptor
          ??????????? </value>
          ??????? </property>
          ??? </bean>

          2.2.2 基礎(chǔ)認證

          1) authenticationManager
            起到認證管理的作用,它將驗證的功能委托給多個Provider,并通過遍歷Providers, 以保證獲取不同來源的身份認證,若某個Provider能成功確認當前用戶的身份,authenticate()方法會返回一個完整的包含用戶授權(quán)信息的Authentication對象,否則會拋出一個AuthenticationException。
          Acegi提供了不同的AuthenticationProvider的實現(xiàn),如:
          ??????? DaoAuthenticationProvider 從數(shù)據(jù)庫中讀取用戶信息驗證身份
          ??????? AnonymousAuthenticationProvider 匿名用戶身份認證
          ??????? RememberMeAuthenticationProvider 已存cookie中的用戶信息身份認證
          ??????? AuthByAdapterProvider 使用容器的適配器驗證身份
          ??????? CasAuthenticationProvider 根據(jù)Yale中心認證服務(wù)驗證身份, 用于實現(xiàn)單點登陸
          ??????? JaasAuthenticationProvider 從JASS登陸配置中獲取用戶信息驗證身份
          ??????? RemoteAuthenticationProvider 根據(jù)遠程服務(wù)驗證用戶身份
          ??????? RunAsImplAuthenticationProvider 對身份已被管理器替換的用戶進行驗證
          ??????? X509AuthenticationProvider 從X509認證中獲取用戶信息驗證身份
          ??????? TestingAuthenticationProvider 單元測試時使用

          ??????? 每個認證者會對自己指定的證明信息進行認證,如DaoAuthenticationProvider僅對UsernamePasswordAuthenticationToken這個證明信息進行認證。

          <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
          ??????? <property name="providers">
          ??????????? <list>
          ??????????????? <ref local="daoAuthenticationProvider"/>
          ??????????????? <ref local="anonymousAuthenticationProvider"/>
          ??????????????? <ref local="rememberMeAuthenticationProvider"/>
          ??????????? </list>
          ??????? </property>
          </bean>


          2) daoAuthenticationProvider
            進行簡單的基于數(shù)據(jù)庫的身份驗證。DaoAuthenticationProvider獲取數(shù)據(jù)庫中的賬號密碼并進行匹配,若成功則在通過用戶身份的同時返回一個包含授權(quán)信息的Authentication對象,否則身份驗證失敗,拋出一個AuthenticatiionException。

          ??? <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
          ??????? <property name="userDetailsService" ref="jdbcDaoImpl"/>
          ??????? <property name="userCache" ref="userCache"/>
          ??????? <property name="passwordEncoder" ref="passwordEncoder"/>
          ?? </bean>


          3) passwordEncoder
            使用加密器對用戶輸入的明文進行加密。Acegi提供了三種加密器:
          PlaintextPasswordEncoder—默認,不加密,返回明文.
          ShaPasswordEncoder—哈希算法(SHA)加密
          Md5PasswordEncoder—消息摘要(MD5)加密

          <bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>


          4) jdbcDaoImpl
            用于在數(shù)據(jù)中獲取用戶信息。 acegi提供了用戶及授權(quán)的表結(jié)構(gòu),但是您也可以自己來實現(xiàn)。通過usersByUsernameQuery這個SQL得到你的(用戶ID,密碼,狀態(tài)信息);通過authoritiesByUsernameQuery這個SQL得到你的(用戶ID,授權(quán)信息)

           <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
          ??????? <property name="dataSource" ref="dataSource"/>
          ??????? <property name="usersByUsernameQuery">
          ??????????? <value>select loginid,passwd,1 from users where loginid = ?</value>
          ??????? </property>
          ??????? <property name="authoritiesByUsernameQuery">
          ??????????? <value>select u.loginid,p.name from users u,roles r,permissions p,user_role ur,role_permis rp where u.id=ur.user_id and r.id=ur.role_id and p.id=rp.permis_id and
          ??????????????? r.id=rp.role_id and p.status='1' and u.loginid=?</value>
          ??????? </property>
          </bean>

          5) userCache &? resourceCache
            緩存用戶和資源相對應(yīng)的權(quán)限信息。每當請求一個受保護資源時,daoAuthenticationProvider就會被調(diào)用以獲取用戶授權(quán)信息。如果每次都從數(shù)據(jù)庫獲取的話,那代價很高,對于不常改變的用戶和資源信息來說,最好是把相關(guān)授權(quán)信息緩存起來。(詳見 2.6.3 資源權(quán)限定義擴展 )
          userCache提供了兩種實現(xiàn): NullUserCache和EhCacheBasedUserCache, NullUserCache實際上就是不進行任何緩存,EhCacheBasedUserCache是使用Ehcache來實現(xiàn)緩功能。

          ??? <bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
          ??????? <property name="cacheManager" ref="cacheManager"/>
          ??????? <property name="cacheName" value="userCache"/>
          ??? </bean>
          ??? <bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache" autowire="byName">
          ??????? <property name="cache" ref="userCacheBackend"/>
          ??? </bean>
          ??? <bean id="resourceCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
          ??????? <property name="cacheManager" ref="cacheManager"/>
          ??????? <property name="cacheName" value="resourceCache"/>
          ??? </bean>
          ??? <bean id="resourceCache" class="org.springside.modules.security.service.acegi.cache.ResourceCache" autowire="byName">
          ??????? <property name="cache" ref="resourceCacheBackend"/>
          ??? </bean>


          6) basicProcessingFilter
            用于處理HTTP頭的認證信息,如從Spring遠程協(xié)議(如Hessian和Burlap)或普通的瀏覽器如IE,Navigator的HTTP頭中獲取用戶信息,將他們轉(zhuǎn)交給通過authenticationManager屬性裝配的認證管理器。如果認證成功,會將一個Authentication對象放到會話中,否則,如果認證失敗,會將控制轉(zhuǎn)交給認證入口點(通過authenticationEntryPoint屬性裝配)

          ??? <bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
          ??????? <property name="authenticationManager" ref="authenticationManager"/>
          ??????? <property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/>
          ??? </bean>

          7) basicProcessingFilterEntryPoint
            通過向瀏覽器發(fā)送一個HTTP401(未授權(quán))消息,提示用戶登錄。
          處理基于HTTP的授權(quán)過程, 在當驗證過程出現(xiàn)異常后的"去向",通常實現(xiàn)轉(zhuǎn)向、在response里加入error信息等功能。

           <bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
          ??????? <property name="realmName" value="SpringSide Realm"/>
          </bean>

          8) authenticationProcessingFilterEntryPoint
            當拋出AccessDeniedException時,將用戶重定向到登錄界面。屬性loginFormUrl配置了一個登錄表單的URL,當需要用戶登錄時,authenticationProcessingFilterEntryPoint會將用戶重定向到該URL

           <bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
          ??????? <property name="loginFormUrl">
          ??????????? <value>/security/login.jsp</value>
          ??????? </property>
          ??????? <property name="forceHttps" value="false"/>
          </bean>

          2.2.3 HTTP安全請求

          1) httpSessionContextIntegrationFilter
            每次request前 HttpSessionContextIntegrationFilter從Session中獲取Authentication對象,在request完后, 又把Authentication對象保存到Session中供下次request使用,此filter必須其他Acegi filter前使用,使之能跨越多個請求。

          <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"></bean>
          ??? <bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
          ??????? <property name="allowIfAllAbstainDecisions" value="false"/>
          ??????? <property name="decisionVoters">
          ??????????? <list>
          ??????????????? <ref bean="roleVoter"/>
          ??????????? </list>
          ??????? </property>
          </bean>


          2) httpRequestAccessDecisionManager
            經(jīng)過投票機制來決定是否可以訪問某一資源(URL或方法)。allowIfAllAbstainDecisions為false時如果有一個或以上的decisionVoters投票通過,則授權(quán)通過。可選的決策機制有ConsensusBased和UnanimousBased

          ??? <bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
          ??????? <property name="allowIfAllAbstainDecisions" value="false"/>
          ??????? <property name="decisionVoters">
          ??????????? <list>
          ??????????????? <ref bean="roleVoter"/>
          ??????????? </list>
          ??????? </property>
          ??? </bean>


          3) roleVoter
          ?  必須是以rolePrefix設(shè)定的value開頭的權(quán)限才能進行投票,如AUTH_ , ROLE_

          ??? <bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
          ??????? <property name="rolePrefix" value="AUTH_"/>
          ?? </bean>

          4)exceptionTranslationFilter
            異常轉(zhuǎn)換過濾器,主要是處理AccessDeniedException和AuthenticationException,將給每個異常找到合適的"去向"?

          ?? <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
          ??????? <property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"/>
          ??? </bean>

          5) authenticationProcessingFilter
            和servlet spec差不多,處理登陸請求.當身份驗證成功時,AuthenticationProcessingFilter會在會話中放置一個Authentication對象,并且重定向到登錄成功頁面
          ???????? authenticationFailureUrl定義登陸失敗時轉(zhuǎn)向的頁面
          ???????? defaultTargetUrl定義登陸成功時轉(zhuǎn)向的頁面
          ???????? filterProcessesUrl定義登陸請求的頁面
          ???????? rememberMeServices用于在驗證成功后添加cookie信息

          ??? <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
          ??????? <property name="authenticationManager" ref="authenticationManager"/>
          ??????? <property name="authenticationFailureUrl">
          ??????????? <value>/security/login.jsp?login_error=1</value>
          ??????? </property>
          ??????? <property name="defaultTargetUrl">
          ??????????? <value>/admin/index.jsp</value>
          ??????? </property>
          ??????? <property name="filterProcessesUrl">
          ??????????? <value>/j_acegi_security_check</value>
          ??????? </property>
          ??????? <property name="rememberMeServices" ref="rememberMeServices"/>
          ??? </bean>

          6) filterInvocationInterceptor
            在執(zhí)行轉(zhuǎn)向url前檢查objectDefinitionSource中設(shè)定的用戶權(quán)限信息。首先,objectDefinitionSource中定義了訪問URL需要的屬性信息(這里的屬性信息僅僅是標志,告訴accessDecisionManager要用哪些voter來投票)。然后,authenticationManager掉用自己的provider來對用戶的認證信息進行校驗。最后,有投票者根據(jù)用戶持有認證和訪問url需要的屬性,調(diào)用自己的voter來投票,決定是否允許訪問。

          ??? <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
          ??????? <property name="authenticationManager" ref="authenticationManager"/>
          ??????? <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
          ??????? <property name="objectDefinitionSource" ref="filterDefinitionSource"/>
          ??? </bean>


          7) filterDefinitionSource (詳見 2.6.3 資源權(quán)限定義擴展)
            自定義DBFilterInvocationDefinitionSource從數(shù)據(jù)庫和cache中讀取保護資源及其需要的訪問權(quán)限信息?

          <bean id="filterDefinitionSource" class="org.springside.modules.security.service.acegi.DBFilterInvocationDefinitionSource">
          ??????? <property name="convertUrlToLowercaseBeforeComparison" value="true"/>
          ??????? <property name="useAntPath" value="true"/>
          ??????? <property name="acegiCacheManager" ref="acegiCacheManager"/>
          </bean>

          2.2.4 方法調(diào)用安全控制

          (詳見 2.6.3 資源權(quán)限定義擴展)

          1) methodSecurityInterceptor
            在執(zhí)行方法前進行攔截,檢查用戶權(quán)限信息
          2) methodDefinitionSource
            自定義MethodDefinitionSource從cache中讀取權(quán)限

          ?? <bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
          ??????? <property name="authenticationManager" ref="authenticationManager"/>
          ??????? <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
          ??????? <property name="objectDefinitionSource" ref="methodDefinitionSource"/>
          ??? </bean>
          ??? <bean id="methodDefinitionSource" class="org.springside.modules.security.service.acegi.DBMethodDefinitionSource">
          ??????? <property name="acegiCacheManager" ref="acegiCacheManager"/>
          ??? </bean>

          2.3 Jcaptcha驗證碼

          采用 http://jcaptcha.sourceforge.net?作為通用的驗證碼方案,請參考SpringSide中的例子,或網(wǎng)上的:
          http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse

          差沙在此過程中又發(fā)現(xiàn)acegi logout filter的錯誤,進行了修正。

          另外它默認提供的圖片比較難認,我們custom了一個美觀一點的版本。

          posted @ 2007-02-02 20:31 西紅柿(tomato) 閱讀(462) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-02-02 20:28 西紅柿(tomato) 閱讀(940) | 評論 (0)編輯 收藏
          Subscriber:www.1cn.biz
          Subscriber Code: jLR8ZC-444-55-4467865481680090

          Subscriber:www.1cn.biz
          Subscriber Code: jLR8ZC-444-55-4467865481680090
          posted @ 2006-12-14 15:54 西紅柿(tomato) 閱讀(585) | 評論 (0)編輯 收藏
          格式化輸出NumberFormat

          相關(guān)內(nèi)容:Local,?DataFormat,?MessageFormat,?SimpleDateFormat,?Format

          ---------------------------------------------------------------
          java.text.NumberFormat類有三個方法可以產(chǎn)生下列數(shù)據(jù)的標準格式化器:
          數(shù)字
          貨幣
          百分數(shù)

          ---------------------------------------------------------------
          創(chuàng)建格式化器(默認地區(qū)Local格式):
          NumberFormat.getNumberInstance();
          NumberFormat.getCurrencyInstance();
          NumberFormat.getPercentInstance();

          ---------------------------------------------------------------
          例題:
          double?dbl=10000.0/3;
          NumberFormat?formatter=NumberFormat.getNumberInstance();
          String?s=formatter.format(x);
          System.out.println(s);

          ---------------------------------------------------------------
          設(shè)定整數(shù)或小數(shù)部分所顯示的最少和最多位數(shù),可以使用NumberFormat類
          的方法:
          setMinimumIntegerDigits(int)
          setMinimumFractionDigits(int)
          setMaximumIntegerDigits(int)
          setMaximumFractionDigits(int)

          設(shè)定小數(shù)部分的最多位很有用處。如果小數(shù)部分丟失的第一位數(shù)字大于等于5,
          那么顯示的最后一位會增1(四舍五入)。如果要顯示尾隨的零,可以把小數(shù)部分的最少位等于最多位。
          如果不想顯示,可以把小數(shù)部分的最少位設(shè)定為0或不設(shè)定。

          指定最多位整數(shù)相當危險,顯示值將會被截斷,產(chǎn)生一個錯誤的值。

          ---------------------------------------------------------------
          測試例題:

          文件名TestNumberFormat.java
          --------------------------------------------------------
          import?java.text.NumberFormat;

          public?class?TestNumberFormat
          {
          ????public?static?void?main(String[]?args)?{

          ????????????NumberFormat?nFormat=NumberFormat.getNumberInstance();
          ????????????nFormat.setMinimumIntegerDigits(3);//設(shè)置整數(shù)部分至少為3位
          ????????????nFormat.setMaximumFractionDigits(5);//設(shè)置小數(shù)點后面尾數(shù)為5
          ????????System.out.println("Format?Out?3.2128345="+nFormat.format(3.2128345));

          ????????????NumberFormat?cFormat=NumberFormat.getCurrencyInstance();
          ????????????cFormat.setMaximumFractionDigits(3);
          ????????System.out.println("Format?Out?321283.47656="+cFormat.format(321283.47656));

          ????????????NumberFormat?pFormat=NumberFormat.getPercentInstance();
          ????????????pFormat.setMaximumFractionDigits(4);
          ????????System.out.println("Format?Out?3.2128345="+pFormat.format(3.2128345));

          ????????System.out.println("Format?Out?null="+nFormat.format(null));//參數(shù)是null,出現(xiàn)異常
          ????????//Throws??IllegalArgumentException
          ????}
          }

          //=================?運行結(jié)果如下?=======================
          Format?Out?3.2128345=003.21283
          Format?Out?321283.47656=¥321,283.477
          Format?Out?3.2128345=321.2834%
          Exception?in?thread?"main"?java.lang
          posted @ 2006-12-14 15:50 西紅柿(tomato) 閱讀(15686) | 評論 (1)編輯 收藏
          Log4j由三個重要的組件構(gòu)成:日志信息的優(yōu)先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優(yōu)先級從高到低有ERROR、WARN、INFO、DEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制臺還是文件中;而輸出格式則控制了日志信息的顯示內(nèi)容。

            一、定義配置文件

            其實您也可以完全不使用配置文件,而是在代碼中配置Log4j環(huán)境。但是,使用配置文件將使您的應(yīng)用程序更加靈活。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面我們介紹使用Java特性文件做為配置文件的方法:

            1.配置根Logger,其語法為:

            log4j.rootLogger = [ level ] , appenderName, appenderName, …

            其中,level 是日志記錄的優(yōu)先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。比如在這里定義了INFO級別,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來。 appenderName就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。

            2.配置日志信息輸出目的地Appender,其語法為:

            log4j.appender.appenderName = fully.qualified.name.of.appender.class
            log4j.appender.appenderName.option1 = value1
            …
            log4j.appender.appenderName.option = valueN

            其中,Log4j提供的appender有以下幾種:
            org.apache.log4j.ConsoleAppender(控制臺),
            org.apache.log4j.FileAppender(文件),
            org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個日志文件),
            org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產(chǎn)生一個新的文件),
            org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)

            3.配置日志信息的格式(布局),其語法為:

            log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
            log4j.appender.appenderName.layout.option1 = value1
            …
            log4j.appender.appenderName.layout.option = valueN

            其中,Log4j提供的layout有以下幾種:
            org.apache.log4j.HTMLLayout(以HTML表格形式布局),
            org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
            org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
            org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間、線程、類別等等信息)

            Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下: %m 輸出代碼中指定的消息

            %p 輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
            %r 輸出自應(yīng)用啟動到輸出該log信息耗費的毫秒數(shù)
            %c 輸出所屬的類目,通常就是所在類的全名
            %t 輸出產(chǎn)生該日志事件的線程名
            %n 輸出一個回車換行符,Windows平臺為“\r\n”,Unix平臺為“\n”
            %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
            %l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)

            二、在代碼中使用Log4j

            1.得到記錄器

            使用Log4j,第一步就是獲取日志記錄器,這個記錄器將負責控制日志信息。其語法為:

            public static Logger getLogger( String name)

            通過指定的名字獲得記錄器,如果必要的話,則為這個名字創(chuàng)建一個新的記錄器。Name一般取本類的名字,比如:

            static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

            2.讀取配置文件

            當獲得了日志記錄器之后,第二步將配置Log4j環(huán)境,其語法為:

            BasicConfigurator.configure (): 自動快速地使用缺省Log4j環(huán)境。
            PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。
            DOMConfigurator.configure ( String filename ) :讀取XML形式的配置文件。

            3.插入記錄信息(格式化日志信息)

            當上兩個必要步驟執(zhí)行完畢,您就可以輕松地使用不同優(yōu)先級別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:

            Logger.debug ( Object message ) ;
            Logger.info ( Object message ) ;
            Logger.warn ( Object message ) ;
            Logger.error ( Object message ) ;

          posted @ 2006-12-14 15:48 西紅柿(tomato) 閱讀(350) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 德州市| 叙永县| 宝应县| 印江| 香格里拉县| 太康县| 容城县| 孝感市| 霍邱县| 方正县| 赞皇县| 庆阳市| 定日县| 周口市| 武强县| 巫山县| 江山市| 寻甸| 双桥区| 柳河县| 黎平县| 海淀区| 湖南省| 邵武市| 叙永县| 辽中县| 洞头县| 仁寿县| 德昌县| 保亭| 三都| 承德县| 马边| 满城县| 乐亭县| 灵寿县| 遵义县| 北碚区| 祁门县| 青冈县| 隆尧县|