一、Log4j是什么?
Log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。Log4j是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX系统日志等。
Log4j中有三个主要组成部分:loggers: 负责捕获记录信息。appenders : 负责发布日志信息,以不同的首选目的地。layouts: 负责格式化不同风格的日志信息。
最新log4j的版本,包括完整的源代码,类文件和文档可以在这里找到 http://logging.apache.org/log4j/.
二、使用log4j记录日志步骤:
1、在项目中加入log4j的jar文件:log4j-x.jar和commons-logging-x.jar (jar包下载地址:http://mvnrepository.com/)
2、创建log4j.properties文件,文件名只能是这个,放在src下面。
3、配置日志信息
4、使用log4j记录日志信息
三、配置日志文件log4j.properties
###设置logger输出级别和输出目的地###
log4j.rootLogger = [level], appenderName1...appenderNamen
###配置日志信息输出目的地Appender###
log4j.appender.appenderName=org.apache.log4j.X
log4j.appender.appenderName.option=value
###把日志信息输出到控制台###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
###把日志信息输出到文件:zr.log###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=zr.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
......
......
1、org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别:
Level | 描述 |
---|---|
ALL | 各级包括自定义级别 |
DEBUG | 指定细粒度信息事件是最有用的应用程序调试 |
ERROR | 错误事件可能仍然允许应用程序继续运行 |
FATAL | 指定非常严重的错误事件,这可能导致应用程序中止 |
INFO | 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息 |
OFF | 这是最高等级,为了关闭日志记录 |
TRACE | 指定细粒度比DEBUG更低的信息事件 |
WARN | 指定具有潜在危害的情况 |
常用的级别有:DEBUG < INFO < WARN < ERROR < FATAL,日志级别高的会过滤日志级别低的。
使用setLevel(Level.X)方法来设置所需的日志记录级别
2、日志输出目的地有:
org.apache.log4j.ConsoleAppender(控制台、对应stdout),org.apache.log4j.FileAppender(文件、对应logfile),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
AppenderSkeleton、AsyncAppender、ExternallyRolledFileAppender、JDBCAppender、JMSAppender、LF5Appender、NTEventLogAppender、NullAppender、SMTPAppender、SocketAppender、SocketHubAppender、SyslogAppender、TelnetAppender
addAppender()方法添加一个appender到Logger对象,可以添加很多Appender对象到记录器在逗号分隔的列表,每个打印日志信息分离目的地。
每个Appender对象具有与之相关联的不同的属性,并且这些属性表明对象的行为
属性 | 描述 |
---|---|
layout | Appender使用布局Layout 对象和与之相关的格式化的日志记录信息转换模式 |
target | 目标可以是一个控制台,一个文件,或根据附加器的另一个项目 |
level | 级别是必需的,以控制日志消息的过滤 |
threshold | Appender会忽略具有级别低于threshold定义的级别的任何日志消息 |
filter | Filter 对象可以分析超出级别的匹配记录信息,并决定是否记录的请求应该由一个特定 Appender 或忽略处理 |
3、日志输出格式,log4j提供的layout类型有:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
DateLayout、XMLLayout
在层次结构中的顶级类是抽象类是org.apache.log4j.Layout,这是 log4j 的 API 中的所有其他布局类的基类。布局类定义为抽象在应用程序中,不要直接使用这个类; 相反,使用它的子类来工作。
4、HTMLLayout是一个非常简单的布局对象,它提供以下方法:
S.N. | 方法 & 描述 |
---|---|
1 | setContentType(String) 设置 text/html 为 HTML内容的内容类型。默认为 text/html |
2 | setLocationInfo(String) 设置位置信息记录事件。默认为 false |
3 | setTitle(String) 设置为HTML文件的标题。默认值是Log4j的日志信息 |
S.N. | 属性和说明 |
---|---|
1 | conversionPattern 设置转换模式。默认为 %r [%t] %p %c %x - %m%n |
模式转换字符:
下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:
转换字符 | 表示的意思 |
---|---|
c | 用于输出的记录事件的类别。例如,对于类别名称"a.b.c" 模式 %c{2} 会输出 "b.c" |
C | 用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass". |
d | 用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}. |
F | 用于输出被发出日志记录请求,其中的文件名 |
l | 用于将产生的日志事件调用者输出位置信息 |
L | 用于输出从被发出日志记录请求的行号 |
m | 用于输出使用日志事件相关联的应用程序提供的消息 |
M | 用于输出发出日志请求所在的方法名称 |
n | 输出平台相关的行分隔符或文字 |
p | 用于输出的记录事件的优先级 |
r | 用于输出毫秒从布局的结构经过直到创建日志记录事件的数目 |
t | 用于输出生成的日志记录事件的线程的名称 |
x | 用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文) |
X | 在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息 |
% | 文字百分号 %%将打印%标志 |
格式修饰符:
默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。
下表涵盖了各种各样的修饰符的情况:
Format modifier | left justify | minimum width | maximum width | 注释 |
---|---|---|---|---|
%20c | false | 20 | none | 用空格左垫,如果类别名称少于20个字符长 |
%-20c | true | 20 | none | 用空格右垫,如果类别名称少于20个字符长 |
%.30c | NA | none | 30 | 从开始截断,如果类别名称超过30个字符长 |
%20.30c | false | 20 | 30 | 用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。 |
%-20.30c | true | 20 | 30 | 用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。 |
四、log4j日志记录到文件:
要写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender。有以下FileAppender的配置参数:
属性 | 描述 |
---|---|
immediateFlush | 标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作 |
encoding | 它可以使用任何字符编码。默认情况下是特定于平台的编码方案 |
threshold | 这个 appender 阈值级别 |
File | 日志文件的路径+名称 |
Append | 默认设置为true,这意味着记录的信息被附加到同一文件的末尾 |
bufferedIO | 此标志表示是否需要写入缓存启用。默认设置为false |
bufferSize | 如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB |
maxFileSize | 上述的文件的回滚临界尺寸。默认值是10MB |
maxBackupIndex | 此属性表示要创建的备份文件的数量。默认值是1 |
DatePattern | 这表示在滚动的文件,并按命名惯例来执行。默认情况下,在每天午夜滚动 |
DatePattern | 描述 |
---|---|
'.' yyyy-MM | 滚动在每个月的结束和下一个月初 |
'.' yyyy-MM-dd | 这是默认值,每天午夜滚动 |
'.' yyyy-MM-dd-a | 滚动每一天的午夜和中午 |
'.' yyyy-MM-dd-HH | 滚动在每一个小时 |
'.' yyyy-MM-dd-HH-mm | 滚动在每一个分钟 |
'.' yyyy-ww | 滚动每个星期取决于区域设置时的第一天 |
# Define the root logger with appender file log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.FileAppender # Set the name of the file log4j.appender.FILE.File=${log}/log.out # Set the immediate flush to true (default) log4j.appender.FILE.ImmediateFlush=true # Set the threshold to debug mode log4j.appender.FILE.Threshold=debug # Set the append to false, overwrite log4j.appender.FILE.Append=false # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.conversionPattern=%m%n
如果喜欢相当于上述log4j.properties文件的XML配置文件,在这里是xml配置文件的内容:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration> <appender name="FILE" class="org.apache.log4j.FileAppender"> <param name="file" value="${log}/log.out"/> <param name="immediateFlush" value="true"/> <param name="threshold" value="debug"/> <param name="append" value="false"/> <layout class="org.apache.log4j.PatternLayout"> <param name="conversionPattern" value="%m%n"/> </layout> </appender> <logger name="log4j.rootLogger" additivity="false"> <level value="DEBUG"/> <appender-ref ref="FILE"/> </logger> </log4j:configuration>
生成日志文件的两种常用策略:
1、每一天产生1个日志文件
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
2、按照最大值分文件输出
log4j.appender.debug=org.apache.log4j.RollingFileAppender
#设置日志文件的大小
log4j.appender.debug.MaxFileSize=100M
关于文件路径的问题:
如果只写了文件名,而没有给路径,这个日志文件则保存在这个工程的根目录下。
如果将日志文件保存在:根目录\112\z.out
使用绝对路径:比如C:/Users/wyp/eclipse-workspace1/111/112/z.out
使用相对路径:比如:112/z.out或./112/z.out
五、log4j日志记录到数据库:
log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库。
Property | 描述 |
---|---|
bufferSize | 设置缓冲区的大小。默认大小为1 |
driver | 设置驱动程序类为指定的字符串。如果没有指定驱动程序类,默认为sun.jdbc.odbc.JdbcOdbcDriver |
layout | 设置要使用的布局。默认布局是org.apache.log4j.PatternLayout |
password | Sets the database password. |
sql | 指定SQL语句在每次记录事件发生的时间执行。这可能是INSERT,UPDATE或DELETE |
URL | 设置JDBC URL |
user | 设置数据库用户名 |
六、使用log4j记录日志信息:
Logger类提供了多种方法来处理日志活动。 Logger类不允许实例化一个新的记录器实例,但它提供了两个静态方法获得一个 Logger 对象:public static Logger getRootLogger(); public static Logger getLogger(String name);记录器名称是可以传递任何字符串,通常是类或包的名称。
我们得到了一个名为记录器的实例之后,可以使用记录的几种方法来记录消息。 Logger类有专门用于打印日志信息下面的方法如下。导入import org.apache.log4j.Logger;包才行。
SN | 方法及描述 |
---|---|
1 | public void debug(Object message) 这种方法打印使用 Level.DEBUG 消息级别 |
2 | public void error(Object message) 这种方法打印使用 Level.ERROR 消息级别 |
3 | public void fatal(Object message); 这种方法打印使用 Level.FATAL 消息级别 |
4 | public void info(Object message); 这种方法打印使用 Level.INFO 消息级别 |
5 | public void warn(Object message); 这种方法打印使用 Level.WARN 消息级别 |
6 | public void trace(Object message); 这种方法打印使用Level.TRACE消息级别 |
七、打印日志的主要场景:
1、在程序出现意料之外的情况时,要打印日志2、开发员人员可以打印内存中的对象信息,帮助定位问题
3、定位性能问题,在耗时间的代码块前后打印日志,算时间