日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

log4j/slf4j

發(fā)布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log4j/slf4j 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

log4j的使用

  • 引入log4j.jar包
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency>
  • 配置log4j.properties
log4j.rootLogger=INFO,Console,OneFile,errFile #輸出到控制臺 log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.encoding=utf-8 log4j.appender.Console.Target=System.out log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n#輸出到文件級別為info log4j.appender.OneFile=org.apache.log4j.RollingFileAppender log4j.appender.OneFile.encoding=utf-8 log4j.appender.OneFile.File=../logs/test-map/info.log log4j.appender.OneFile.MaxFileSize=10MB log4j.appender.OneFile.MaxBackupIndex=50 log4j.appender.OneFile.Threshold=INFO ## 只輸出INFO級別以上的日志!!! log4j.appender.OneFile.layout=org.apache.log4j.PatternLayout log4j.appender.OneFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n#輸出到文件級別為error log4j.appender.errFile=org.apache.log4j.RollingFileAppender log4j.appender.errFile.encoding=utf-8 log4j.appender.errFile.File=../logs/test-map/error.log log4j.appender.errFile.MaxFileSize=10MB log4j.appender.errFile.MaxBackupIndex=50 log4j.appender.errFile.Threshold=ERROR ## 只輸出ERROR級別以上的日志!!! log4j.appender.errFile.layout=org.apache.log4j.PatternLayout log4j.appender.errFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
  • 使用方法
private static final Logger LOGGER = Logger.getLogger(Test.class); LOGGER.info("message");

slf4j的使用

  • 引入slf4j.jar
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version> </dependency>
  • 配置log4j.properties(通log4j)

  • 使用方法
    slf4j與log4j最大的區(qū)別在于,slf4j可以使用占位符,好處是可以防止字符串注入
    private static final Logger logger = LoggerFactory.getLogger(Test.class);

slf4j整合log4j

為什么要整合,我不知道

  • 引入maven依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency>

note:如果不用maven依賴,需要導入log4j.jar、slf4j.jar、slf4j-log4j.jar三個jar包

  • 配置log4j.properties(同上)

  • 可以使用log4j,也可以使用slf4j

log4j.properties日志內容解析

  • 輸入日志的級別level
    log4j.rootLogger=INFO,Console,OneFile,errFile中的info為總的輸出日志的級別;后面幾個參數為輸出位置的標識
    日志級別有五級,越向下級別越低:
FATAL 0 ERROR 3 為嚴重錯誤 主要是程序的錯誤 WARN 4 為一般警告,比如session丟失 INFO 6 為一般要顯示的信息,比如登錄登出 DEBUG 7 為程序的調試信息
  • 輸出日志的位置appender
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    日志輸出的目的地有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件), org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件), org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
  • 輸出日志的格式layout
org.apache.log4j.PatternLayout(可以靈活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串), org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
  • 設置日志輸出級別Threshold
    log4j.appender.OneFile.Threshold=INFO ## 只輸出INFO級別以上的日志!!!

  • 日志信息格式ConversionPattern
    log4j.appender.OneFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
    符號含義為:
    -X號: X信息輸出時左對齊;
    %p: 輸出日志信息優(yōu)先級,即DEBUG,INFO,WARN,ERROR,FATAL,
    %d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
    %r: 輸出自應用啟動到輸出該log信息耗費的毫秒數
    %c: 輸出日志信息所屬的類目,通常就是所在類的全名
    %t: 輸出產生該日志事件的線程名
    %l: 輸出日志事件的發(fā)生位置,相當于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數。舉例:Testlog4.main (TestLog4.java:10)
    %x: 輸出和當前線程相關聯的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應用中。
    %%: 輸出一個"%"字符
    %F: 輸出日志消息產生時所在的文件名稱
    %L: 輸出代碼中的行號
    %m: 輸出代碼中指定的消息,產生的日志具體信息
    %n: 輸出一個回車換行符,Windows平臺為"/r/n",Unix平臺為"/n"輸出日志信息換行
    Threshold=DEBUG:指定日志消息的輸出最低層次。
    ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
    Target=System.err:默認情況下是:System.out,指定輸出控制臺
    FileAppender 選項
    Threshold=DEBUF:指定日志消息的輸出最低層次。
    ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
    File=mylog.txt:指定消息輸出到mylog.txt文件。
    Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
    RollingFileAppender 選項
    Threshold=DEBUG:指定日志消息的輸出最低層次。
    ImmediateFlush=true:默認值是true,意謂著所有的消息都會被立即輸出。
    File=mylog.txt:指定消息輸出到mylog.txt文件。
    Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
    MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
    MaxBackupIndex=2:指定可以產生的滾動文件的最大數。
    log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n

spring中l(wèi)og4j.properties位置問題

  • 默認放在classpath路徑下,即src/main/resources下

  • log4j.properties的路徑改變,或者名稱改變
    需要在web.xml中指定
<context-param><param-name>log4jConfigLocation</param-name><param-value>classpath*:log4j.properties</param-value></context-param>

web容器啟動加載順序問題:

引用博客家國之戀https://www.cnblogs.com/jiaguozhilian/p/5819032.html

  • 啟動一個WEB項目的時候,容器(如:Tomcat)會去讀它的配置文件web.xml.讀兩個節(jié)點: 和

  • 緊接著,容器創(chuàng)建一個ServletContext(上下文),這個WEB項目所有部分都將共享這個上下文.

  • 容器將轉化為鍵值對,并交給ServletContext.

  • 容器創(chuàng)建中的類實例,即創(chuàng)建監(jiān)聽

  • 在監(jiān)聽中會有contextInitialized(ServletContextEvent args)初始化方法,在這個方法中獲得ServletContext = ServletContextEvent.getServletContext();
    context-param的值 = ServletContext.getInitParameter("context-param的鍵");

  • 得到這個context-param的值之后,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比所有的Servlet都要早.換句話說,這個時候,你對中的鍵值做的操作,將在你的WEB項目完全啟動之前被執(zhí)行.

  • 舉例.你可能想在項目啟動之前就打開數據庫.
    那么這里就可以在中設置數據庫的連接方式,在監(jiān)聽類中初始化數據庫的連接.

  • 這個監(jiān)聽是自己寫的一個類,除了初始化方法,它還有銷毀方法.用于關閉應用前釋放資源.比如說數據庫連接的關閉.

    • 例1:
    <!-- 加載spring的配置文件 --> <context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB- INF/jason-servlet.xml</param-value> </context-param> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
    • 例2:自定義context-param,且自定義listener來獲取這些信息
    <context-param><param-name>urlrewrite</param-name><param-value>false</param-value> </context-param> <context-param><param-name>cluster</param-name><param-value>false</param-value> </context-param> <context-param><param-name>servletmapping</param-name><param-value>*.bbscs</param-value> </context-param> <context-param><param-name>poststoragemode</param-name><param-value>1</param-value> </context-param> <listener><listener-class>com.laoer.bbscs.web.servlet.SysListener</listener-class> </listener> public class SysListener extends HttpServlet implements ServletContextListener { private static final Log logger = LogFactory.getLog(SysListener.class); public void contextDestroyed(ServletContextEvent sce) {//用于在容器關閉時,操作 } //用于在容器開啟時,操作 public void contextInitialized(ServletContextEvent sce) {String rootpath = sce.getServletContext().getRealPath("/");System.out.println("-------------rootPath:"+rootpath);if (rootpath != null) {rootpath = rootpath.replaceAll("\\\\", "/");} else {rootpath = "/";}if (!rootpath.endsWith("/")) {rootpath = rootpath + "/";}Constant.ROOTPATH = rootpath;logger.info("Application Run Path:" + rootpath);String urlrewrtie = sce.getServletContext().getInitParameter("urlrewrite");boolean burlrewrtie = false;if (urlrewrtie != null) {burlrewrtie = Boolean.parseBoolean(urlrewrtie);}Constant.USE_URL_REWRITE = burlrewrtie;logger.info("Use Urlrewrite:" + burlrewrtie);其它略之....} }/*最終輸出-------------rootPath:D:\tomcat_bbs\webapps\BBSCS_8_0_3\2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO] Application Run Path:D:/tomcat_bbs/webapps/BBSCS_8_0_3/2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO] Use Urlrewrite:true2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO] Use Cluster:false2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO] SERVLET MAPPING:*.bbscs2009-06-09 21:51:46,573 [com.laoer.bbscs.web.servlet.SysListener]-[INFO] Post Storage Mode:1*/

context-param和init-param區(qū)別

web.xml里面可以定義兩種參數:

  • application范圍內的參數,存放在servletcontext中,在web.xml中配置如下:
<context-param><param-name>context/param</param-name><param-value>avalible during application</param-value> </context-param>
  • servlet范圍內的參數,只能在servlet的init()方法中取得,在web.xml中配置如下:
<servlet><servlet-name>MainServlet</servlet-name><servlet-class>com.wes.controller.MainServlet</servlet-class><init-param><param-name>param1</param-name><param-value>avalible in servlet init()</param-value></init-param><load-on-startup>0</load-on-startup> </servlet>

在servlet中可以通過代碼分別取用:

package com.wes.controller; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; public class MainServlet extends HttpServlet ...{public MainServlet() ...{super();}public void init() throws ServletException ...{System.out.println("下面的兩個參數param1是在servlet中存放的");System.out.println(this.getInitParameter("param1"));System.out.println("下面的參數是存放在servletcontext中的");System.out.println(getServletContext().getInitParameter("context/param"));} }

第一種參數在servlet里面可以通過getServletContext().getInitParameter("context/param")得到
第二種參數只能在servlet的init()方法中通過this.getInitParameter("param1")取得.

轉載于:https://www.cnblogs.com/nwu-edu/p/9416577.html

總結

以上是生活随笔為你收集整理的log4j/slf4j的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。