log4j按照日期分割

Posted kaspar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j按照日期分割相关的知识,希望对你有一定的参考价值。

之前,对于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>

 

以上是关于log4j按照日期分割的主要内容,如果未能解决你的问题,请参考以下文章

log4j 支持同时按日期和文件大小分割日志

logback按天生成日志系统重启之后还会生成吗

运维实战一次linux日志分割之路——将日志按照每小时进行分割,并按照“日期-小时”格式保存

nginx 日志按照日期分割

LogBack 日志压缩产生上百G的tmp文件问题 logback同时按照日期和大小分割日志

常用python日期日志获取内容循环的代码片段