CXC0 2020-04-20
之前,对于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中的配置
<!-- 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>
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>