java日志Log4j

一、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 指定具有潜在危害的情况
对于标准级别它们关系如下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
常用的级别有: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的日志信息
5、PatternLayout也是一个简单的布局对象,它提供下列Bean属性,可以通过配置文件进行设置:
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 滚动每个星期取决于区域设置时的第一天
下面是一个示例配置文件 log4j.properties 的 FileAppender。
# 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、定位性能问题,在耗时间的代码块前后打印日志,算时间

猜你喜欢

转载自blog.csdn.net/qq_29837161/article/details/80752065