之前,對於log4j使用過但並沒有過多了解,朋友問我如何讓日志按照日期去生成,琢磨了一下記錄下來。
log4j.jar 包,可以直接在官方下載到:http://logging.apache.org/log4j/1.2/download.html
log4j-extr包,主要是立即生成自定義的文件名(原始的log4j生成的文件后綴名只能在第二天名稱才會變)
URL http://www.apache.org/dyn/closer.cgi/logging/log4j/companions/extras/1.1/apache-log4j-extras-1.1.zip
簡單說明:
Log4j配置中有5個重要的概念:日志記錄器(Logger)、根記錄器(rootLogger)、類別(category)、輸出地(Appender)以及日志格式化器(Layout)。其中,Logger負責記錄日志;rootLogger是所有記錄器的父親,任何記錄器都可繼承rooLogger的配置;category可以設置類別下所有的Logger,類似於java中的包,效果與Logger名字等價;Appender負責輸出到什么地方;Layout負責以什么格式輸出、輸出哪些附加信息(比如:時間、類名、方法名、所在行數等)。在log4j.properties配置中,log4j.logger后面配置的是Logger,log4j.appender后面配置的是Appender,rootLogger直接用log4j.rootLogger配置。
再說下說下log4j的幾種log級別的等級:
日志記錄器(Logger)的行為是分等級的。如下表所示:
分 為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別,這些級別是從高到低的級別。Log4j建議只使用四個級別,優先級從高到低分別是 ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了INFO級別, 則應用程序中所有DEBUG級別的日志信息將不被打印出來
使用方式:
1、引入jar
2、web.xml配置路徑,如果默認在根目錄下,則不需要,請忽略這一步(非必要)
3、編寫log4j.properties或者log4j.xml文件
# priority :debug<info<warn<error #you cannot specify every priority with different file for log4j log4j.rootLogger=debug,stdout,info,debug,warn,error #console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n #info log log4j.logger.info=info log4j.appender.info=org.apache.log4j.DailyRollingFileAppender log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.info.File=${catalina.base}/logs/info.log log4j.appender.info.Append=true log4j.appender.info.Threshold=INFO log4j.appender.info.layout=org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n #debug log log4j.logger.debug=debug log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.debug.File=${catalina.base}/logs/debug.log log4j.appender.debug.Append=true log4j.appender.debug.Threshold=DEBUG log4j.appender.debug.layout=org.apache.log4j.PatternLayout log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n #warn log log4j.logger.warn=warn log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.warn.File=${catalina.base}/logs/warn.log log4j.appender.warn.Append=true log4j.appender.warn.Threshold=WARN log4j.appender.warn.layout=org.apache.log4j.PatternLayout log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n #error log4j.logger.error=error log4j.appender.error = org.apache.log4j.DailyRollingFileAppender log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log' log4j.appender.error.File = ${catalina.base}/logs/error.log log4j.appender.error.Append = true log4j.appender.error.Threshold = ERROR log4j.appender.error.layout = org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
發現問題:要第二天才會出現帶有日期的格式,當天的文件不帶有日期格式(測試手動修改機子時間)
另外,不足:log4j.properties較log4j.xml是有缺陷的,就是里面的日志等級可能都會輸出到一個文件中,高級別的日志信息也會在低級別的日志文件中出現,有點混亂。
踩雷到此其實就結束了。
補充:log4j在web.xml中的配置
way1:
<!-- webAppRootKey:值缺省為webapp.root,當tomcat下部署多個應用時(每個都用到了log4j), 每個應用的web.xml中都要配置該參數,該參數與Log4j.xml文件中的${webapp.root} 否則每個應用的webAppRootKey值都相同,就會引起沖突 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>webapp.root</param-value> </context-param> <!-- log4jConfigLocation:log4j配置文件存放路徑 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/conf/log4j.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
way2:
public void init() { String prefix = getServletContext().getRealPath("/"); String file = getInitParameter("log4jConfigLocation"); if (file != null) { PropertyConfigurator.configure(prefix + file); } }
====================================================================
<servlet> <servlet-name>your servlet</servlet-name> <servlet-class>your servelt class</servlet-class> <init-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>