使用log4j大概涉及3个主要概念:
- 公共类 Logger
Logger 负责处理日志记录的大部分操作。 - 公共接口 Appender
Appender 负责控制日志记录操作的输出。 - 公共抽象类Layout
Layout 负责格式化Appender的输出。
3.1.Logger
日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。 日志记录器(Logger)的可用级别Level (不包括自定义级别 Level), 以下内容就是摘自log4j API (http://jakarta.apache.org/log4j/docs/api/index.html):
- static Level DEBUG
DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。 - static Level INFO
INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。 - static Level WARN
WARN level表明会出现潜在错误的情形。 - static Level ERROR
ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。 - static Level FATAL
FATAL level指出每个严重的错误事件将会导致应用程序的退出。
另外,还有两个可用的特别的日志记录级别: (以下描述来自log4j API http://jakarta.apache.org/log4j/docs/api/index.html):
- static Level ALL
ALL Level是最低等级的,用于打开所有日志记录。 - static Level OFF
OFF Level是最高等级的,用于关闭所有日志记录。
日志记录器(Logger)的行为是分等级的。
日志记录器(Logger)将只输出那些级别高于或等于它的级别的信息。如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。因此,如果在包com.foo.bar中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包com.foo中创建的日志记录器(Logger)的级别。如果在com.foo中没有创建日志记录器(Logger)的话,那么在com.foo.bar中创建的日志记录器(Logger)将继承root 日志记录器(Logger)的级别,root日志记录器(Logger)经常被实例化而可用,它的级别为DEBUG。
有很多方法可以创建一个日志记录器(Logger),下面方法可以取回root日志记录器:
Logger logger = Logger.getRootLogger(); |
还可以这样创建一个新的日志记录器:
Logger logger = Logger.getLogger("MyLogger"); |
比较常用的用法,就是根据类名实例化一个静态的全局日志记录器:
static Logger logger = Logger.getLogger(test.class); |
所有这些创建的叫"logger"的日志记录器都可以用下面方法设置级别:
logger.setLevel((Level)Level.WARN); |
可以使用7个级别中的任何一个; Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.ALL and Level.OFF.
3.2.Appender
Appender 控制日志怎样输出。下面列出一些可用的Appender(log4j API中所描述的 http://jakarta.apache.org/log4j/docs/api/index.html):
- ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out。
- DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。
- FileAppender 把日志事件写入一个文件
- RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。
- WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。
- SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。
- SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。
- SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。
- SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。
- TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender。
还可以实现 Appender 接口,创建以自己的方式进行日志输出的Appender。
3.2.1.使用ConsoleAppender
ConsoleAppender可以用这种方式创建:
ConsoleAppender appender = new ConsoleAppender(new PatternLayout()); |
创建了一个控制台appender,具有一个默认的PatternLayout。它使用了默认的System.out 输出。
3.2.2.使用FileAppender
FileAppender可以用这种方式创建:
FileAppender appender = null;try {appender = new FileAppender(new PatternLayout(),"filename");} catch(Exception e) {} |
上面用到的构造函数:
FileAppender(Layout layout, String filename)实例化一个FileAppender并且打开变量"filename"指定的文件。 |
另一个有用的构造函数是:
FileAppender(Layout layout, String filename, boolean append)实例化一个FileAppender并且打开变量"filename"指定的文件。 |
这个构造函数还可以选择是否对指定的文件进行追加的方式输出。如果没有指定值,那么默认的方式就是追加。
3.2.3.使用WriterAppender
WriterAppender可以用这种方式创建:
WriterAppender appender = null;try {appender = new WriterAppender(new PatternLayout(),new FileOutputStream("filename"));} catch(Exception e) {} |
这个WriterAppender使用的构造函数带有PatternLayout和OutputStream参数,在这种情况下, FileOutputStream用于向一个文件输出。当然,它还具有其他可用的构造函数。
3.3.Layout
Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。当前,log4j具有三种类型的Layout:
- HTMLLayout 格式化日志输出为HTML表格。
- PatternLayout 根据指定的 转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式。
- SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息。