最新消息:深度思考

log4j配置详解及多路径输出配置

Java liuxuecheng 3947浏览 0评论

版权申明:转载请注明出处。
文章来源:大数据随笔

前言

连续做了两个月的项目,发现很久没有更新博客了,项目中遇到的很多东西都没时间记录下来。最近在搞ESB,对,现在不仅仅是大数据工程师了,什么都开搞了。以前没怎么深入了解过log4j,趁这次机会了解一下,写篇博文记录下来。

1.log4j中的三大组成要素

  1. Loggers(记录器)。定义了日志的级别。
  2. Appenders(输出源)。定义了日志以何种方式输出,一般有控制台,文件,甚至可以写入数据库。
  3. Layouts(日志布局)。简单理解就是日志所包含的信息以及日志格式。

2.Loggers

Log4j的日志级别有DEBUG,INFO,WARN,ERROR,FATAL,它们的重要程度依次为DEBUG<INFO<WARN<ERROR<FATAL,同时log4j只会输出比定义级别高的日志,比如定义的输出级别是INFO,则INFO级别以上的日志也会被输出。

3.Appenders

Appender应该是log4j最强大的地方,它可以把日志以各种形式输出,经常使用的Appender有如下几个:
org.apache.log4j.ConsoleAppender:把日志输出到控制台。
org.apache.log4j.FileAppender:输出到文件。
org.apache.log4j.DailyRollingFileAppender:滚动输出,每天产生一个新文件。
org.apache.log4j.RollingFileAppender:滚动输出,当文件大小达到指定大小时产生一个新文件。
org.apache.log4j.WriterAppender:将日志以流的形式发送到指定的地方。

3.1 ConsoleAppender可配置项

  • Threshold:日志输出的最低级别默认为debug。
  • ImmediateFlush:表示日志是否会被立即输出,true表示会,false表示不会。
  • Target:输出目的地,默认为System.out,可选System.err

3.2 FileAppender可配置项

  • Threshold:日志输出的最低级别默认为debug。
  • ImmediateFlush:表示日志是否会被立即输出,true表示会,false表示不会。
  • Append:表示日志是否会追加,false表示不会。
  • File:指定输出日志的文件的路径,如:/home/work/logs/app.log

3.3 DailyRollingFileAppender可配置项

  • Threshold:日志输出的最低级别默认为debug。
  • ImmediateFlush:表示日志是否会被立即输出,true表示会,false表示不会。
  • Append:表示日志是否会追加,false表示不会。
  • File:指定输出日志的文件的路径,如:/home/work/logs/app.log
  • DatePattern:配置文件多长时间滚动一次,若要一天滚动一次则为’.’yyyy-MM-dd,每天两次为’.’yyyy-MM-dd-a 其余以时间格式定义。

3.4 RollingFileAppender可配置项

  • Threshold:日志输出的最低级别默认为debug。
  • ImmediateFlush:表示日志是否会被立即输出,true表示会,false表示不会。
  • Append:表示日志是否会追加,false表示不会。
  • File:指定输出日志的文件的路径,如:/home/work/logs/app.log
  • MaxFileSize:表示滚动文件的最大大小,当达到该大小时会生成一个新的文件,比如100M。
  • MaxBackupIndex:指定可产生的滚动文件的最大个数。

4.Layout

可使用的Layout有如下几个:
org.apache.log4j.HTMLLayout:以Html形式布局。
org.apache.log4j.PatternLayout:灵活布局,使用较多。
org.apache.log4j.SimpleLayout:较为简单的布局,包含日志级别,时间和日志信息。
org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等信息。

4.1 HtmlLayout可配置选项

  • LocationInfo=true:输出java文件名称和行号,默认值是false。
  • Title=My Logging: 默认值是Log4J Log Messages。

4.2 PatternLayout可配置项

ConversionPattern=%m%n:设定以怎样的格式显示消息。
格式化符号说明:
%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为”rn”,Unix平台为”n”。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个”%”字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
%-20c:”-“号表示左对齐。
%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

5.多日志输出配置

在实际使用中会产生多种日志,比如说业务日志,系统操作日志,我们希望将这两种日志分开打印,此时就需要多路径输出日志。比如将点击日志以每天滚动的方式存放在文件中,将配置中的异常信息以邮件的形式发送,同时再调试的时候需要将信息打印到控制台,上线后不打印到控制台只打印到文件。则log4j.properties文件可以这配:

#根logger
log4j.rootLogger=INFO,console

#自定义输出的同时输出到根logger,为false则只输出到子logger
#调试时候为true,上线后改为false
log4j.additivity.org.apache=true

#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%p\:%d{yyyyMMdd HH\:mm\:ss} %c\: %m%n

#自定义每天滚动输出到文件的logger,默认日志级别为INFO,stdout相当于别名,用于在代码中识别
log4j.logger.stdout=INFO,stdout
log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.File=/home/work/liuxuecheng/logs/stdout/log
log4j.appender.stdout.Append=true
log4j.appender.stdout.encoding=utf-8
log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

#自定义发送到邮件的logger,日志级别为INFO ,别名为mail
log4j.logger.mail=INFO,mail
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

对应的java代码如下:

public class Loggers {

    static {
        String path =  PathUtils.getConfigPath()+"/log4j.properties";
        PropertyConfigurator.configure(path);
    }

    public final static Logger stdout = Logger.getLogger("stdout");

    public final static Logger mail = Logger.getLogger("mail");
}

调用Loggers打印代码:

class LogTest{
    public static void main(String args[]){
        Loggers.stdout.info("write to file");
        Loggers.mail.info("send to mail");
    }
}

转载请注明:大数据随笔 » log4j配置详解及多路径输出配置

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址