Log4J 是 Apache 的一个开放源代码项目,通过使用 Log4J ,可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接字服务器、NT 的事件记录器和 UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。te
Log4J 由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。
- 日志信息的优先级从高到低有OFF、FETAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL(见源码 org.apache.log4j.Level),分别用来指定这条日志信息的重要程度;
- 日志信息的输出目的地指定了日志将打印到控制台还是文件中;
- 日志信息的输出格式则控制了日志信息的显示内容格式。
1 配置文件
Log4J 的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,通过配置,可以创建出Log4J的运行环境。
Log4J支持两种配置文件格式,一种是XML格式的文件,一种是properties格式(key=value 格式)的文件。
例如:
Log4J使用properties格式做为配置文件的基本格式如下:
1.1 配置根记录器(Root Logger)
根记录器的配置语法为:
其中,[level] 是日志记录的优先级,分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL 或者自定义的级别。Log4J 建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了 INFO 级别,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。
appenderNameN 就是指定日志信息输出到哪个地方,可以同时指定多个输出目的地。
1.2 配置日志信息输出目的地(Appenders)
日志输出目的地(Appender)的配置语法为:
其中,Log4J 提供的 appender 主要有以下几种:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
- org.apache.log4j.SocketAppender (Socket)
- org.apache.log4j.NtEventLogAppender (NT的 Event Log)
- org.apache.log4j.JMSAppender (电子邮件)
1.2.1 ConsoleAppender 选项
- Threshold=WARN:指定日志消息的输出最低层次。
- ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
- Target=System.err:默认情况下是System.out,指定输出控制台。
1.2.2 FileAppender 选项
- Threshold=WARN:指定日志消息的输出最低层次。
- ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
- File=mylog.txt:指定消息输出到 mylog.txt 文件。
- Append=false:默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
1.2.3 DailyRollingFileAppender 选项
- Threshold=WARN:指定日志消息的输出最低层次。
- ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
- File=mylog.txt:指定消息输出到 mylog.txt 文件。
- Append=false:默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
- DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
(1) ’.'yyyy-MM: 每月
(2) ’.'yyyy-ww: 每周
(3) ’.'yyyy-MM-dd: 每天
(4) ’.'yyyy-MM-dd-a: 每天两次
(5) ’.'yyyy-MM-dd-HH: 每小时
(6) ’.'yyyy-MM-dd-HH-mm: 每分钟
1.2.4 RollingFileAppender 选项
- Threshold=WARN:指定日志消息的输出最低层次。
- ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
- File=mylog.txt:指定消息输出到 mylog.txt 文件。
- Append=false:默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
- MaxFileSize=100KB:后缀可以是KB、MB 或 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到 mylog.log.1 文件。
- MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
1.3 配置日志信息布局(Layouts)
日志信息布局(Layouts)的配置语法为:
其中,Log4J 提供的 layout 主要有以下几种:
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
1.4 输出格式设置
在配置文件中可以通过log4j.appender.A1.layout.ConversionPattern设置日志输出格式。
参数:
- %p:输出日志信息优先级,即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:输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4j.main(TestLog4j.java:10)
- %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
- %%:输出一个”%”字符
- %F:输出日志消息产生时所在的文件名称
- %L:输出代码中的行号
- %m:输出代码中指定的消息,产生的日志具体信息
- %n:输出一个回车换行符,Windows平台为”/r/n”,Unix平台为”/n”,Mac平台为"/r" 输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
(1) %20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
(2) %-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
(3) %.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
(4) %20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
2 程序中使用 Log4J
在程序中使用 Log4J 之前,首先要将 logging-log4j-1.2.16.jar 导入到classpath中,并将 log4j.properties 放于src根目录中,接下来就可以使用了。
2.1 得到记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:
注:推荐使用commons-logging(需要导入commons-logging.jar)结合 Log4J 进行日志记录
2.2 插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
2.3 程序中初始化 Logger
- 在程序中调用 BasicConfigurator.configure() 方法:给根记录器增加一个 ConsoleAppender;
- 输出格式通过 PatternLayout 可设为 "%-4r [%t] %-5p %c %x - %m%n";
- 根记录器的默认级别是 Level.DEBUG;
- 配置放在文件里,通过命令行参数传递文件名字,通过 PropertyConfigurator.configure(args[x]) 解析并配置;
- 配置放在文件里,通过环境变量传递文件名等信息,利用 Log4J 默认的初始化过程解析并配置;
- 配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的 Servlet 来完成配置。
例如:
例如:
3 Log4J 比较全面的配置
Log4J 的配置之简单使它遍及于越来越多的应用中了:Log4J 配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能,任意择其一二使用就够用了。