log4j日志组件

来源:互联网 发布:java中interface用法 编辑:程序博客网 时间:2024/05/17 19:14

Log4j日志操作组件:

特点:

通过配置多文件灵活配置,不需要过修改代码。
控制日志输出:控制台,文件,数据库,甚至socket等。

package:

log4j-1.2.8.jar

config:

log4j.properties
或log4j.xml

使用步骤:

1.导包:

log4j-x.x.x.jar导入项目中。

commons-logging.jar导入项目中 [可选]。

2.配置:

配置日志记录方式[log4j.properties或log4j.xml],放在项目的src文件夹的根目录下。

3.加载配置:

启动时加载配置文件:

a.加载xml:

DOMConfigurator.configure(url);
b.加载properties:

PropertyConfigurator.configure(url);

*url=".\log4j.properties"或".\log4j.xml"

4.记录器:

给需要日志的类配置Logger记录器:

public class MyClass{static Logger log = Logger.getLogger(MyClass.class.getName());...}

5.开始记录:

记录方法,分别对应配置文件中的数个记录优先级,下文中将有详细介绍:
public void debug(Object message);public void info(Object message);public void warn(Object message);public void error(Object message);public void fatal(Object message);
实际例子:
try{...log.debug(someMsg);}catch(Exception e){log.error(e.getMessage());log.fatal(e.getCause().getMessage());}


log4j的的每一个logger需要三种配置:根logger或logger配置、输出布局配置、输出目的地配置。

根logger配置:

#log4j.properties#set log level# #设置log等级#log4j.rootLogger=[记录优先级],[输出名1],[输出名2]...

实际例子:

log4j.rootLogger=DEBUG,stdout,file
log4j.rootLogger=INFO,myOut1,myOut2 #自定义输出名

记录优先级:

顺序:

按信息的全面性排列,前面的相当于后面的子集:

OFF < FATAL < ERROR < WARN < INFO < DEBUG < ALL

原则:

不输出更高优先级的信息,如定义了优先级为INFO,则DEBUG等级(更高,更全面)的log将不输出。

输出名:

可以随意定义,如stdout, file等,其所代表的输出方式在后面两部分配置中设置。

输出布局配置:

log4j.appender.[输出名].layout=[输出布局类型]

实际例子:

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.myOut1.layout=org.apache.log4j.SimpleLayout

可选布局类型:

HTMLLayout:

org.apache.log4j.HTMLLayout:HTML表格形式

特有选项:
LocationInfo=true #默认为false,输出java文件名及行号Title=my title #默认为Log4J Log Messages

XMLLayout:

org.apache.log4j.XMLLayout:XML表格形式

特有选项:
LocationInfo=true #默认为false,输出java文件名及行号

PatternLayout:

org.apache.log4j.PatternLayout:灵活指定输出格式

特有选项:
ConversionPattern=%m %n #自定义输出布局格式#参数:#   %m java代码指定的消息【log.error(指定内容);】#   %p 优先级,DEBUG,INFO,FATAL等#   %r 启动日志记录到输出这条信息时的毫秒数#   %c 所在类的类名#   %t 当前线程名#   %n 换行#   %d{yyyyMMdd HH:mm:ss,SSS} 日期,SSS为毫秒#   %l 类名+线程+java代码行数#   %F log产生时所在文件名#   - 指定左对齐,默认右对齐,如%-20c#   . 指定右对齐,如%20.c#   %[数字][参数] 设置参数最小长度,不足则补空格,如%20c#   %[数字][.][数字][参数] 设置参数最小及最大长度,不足则补空格,超出则截掉左边的多余部分,如%20.30c

输出目的地配置:

输出目的地类型:

log4j.appender.[输出名]=[输出类型]

实际例子:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.myOut1=org.apache.log4j.FileAppender

可选类型:

通用选项:
Threshold=WARN #指定日志信息的输出最低优先级ImmediateFlush=true #默认为true,立即输出
ConsoleAppender:

org.apache.log4j.ConsoleAppender:控制台

特有选项:
Target=System.err #默认为System.out
FileAppender:

org.apache.log4j.FileAppender:log文件

特有选项:
File=mylog.txt #指定输出文件位置Append=false #默认为true,追加模式;false为每次覆盖
DailyRollingFileAppender:

org.apache.log4j.DailyRollingFileAppender:每隔一段时间产生一个新log文件

特有选项:
File=mylog.txt #指定输出文件位置#从第二个文件起文件名为mylog.txt.1 mylog.txt.2 ...Append=false #默认为true,追加模式;false为每次覆盖DatePattern=.yyyy-ww #每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分,对应的格式如下:#   .yyyy-MM: 每月#   .yyyy-ww: 每周#   .yyyy-MM-dd: 每天#   .yyyy-MM-dd-a: 每天两次#   .yyyy-MM-dd-HH: 每小时#   .yyyy-MM-dd-HH-mm: 每分钟
RollingFileAppender:

org.apache.log4j.RollingFileAppender:依次产生指定大小的log文件,或通过socket发送

特有选项:

写入log文件:

File=mylog.txt #指定输出文件位置#从第二个文件起文件名为mylog.txt.1 mylog.txt.2 ...Append=false #默认为true,追加模式;false为每次覆盖MaxFileSize=100KB #每个文件的最大大小,单位可以为KB,MB,GBMaxBackupIndex=2 #最大的滚动文件数目,设置为2时日志只能在mylog.txt与mylog.txt.1之间输出

写入socket:

RemoteHost=localhost #套接字hostport=5001 #套接字端口LocationInfo=true #产生日志信息的java文件位置,行号等
JDBCAppender:

org.apache.log4j.JDBCAppender:写入数据库

特有选项:
Driver=com.mysql.jdbc.Driver #JDBC DriverURL=jdbc:mysql://localhost:3306/someDB #数据库连接URLuser=someUserName #用户名password=noUserPwd #密码sql=INSERT INTO log4jtable VALUES('%d{yyyy-MM-dd}') #SQL语句
WriterAppender:

org.apache.log4j.WriterAppender:流形式发送log到指定位置

配置实例:

写入控制台:

#Root Logger Config,配置根Logger#log4j.rootLogger=INFO,myConsole#Appender Config,配置Appender#log4j.appender.myConsole=org.apache.log4j.ConsoleFileAppenderlog4j.appender.myConsole.Threshold=WARNlog4j.appender.myConsole.ImmediateFlush=truelog4j.appender.myConsole.Target=System.err#Layout Config,配置布局#log4j.appender.myConsole.layout=org.apache.log4j.PatternLayoutlog4j.appender.myConsole.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

写入文件:

#Root Logger Config,配置根Logger#log4j.rootLogger=INFO,myFile#Appender Config,配置Appender#log4j.appender.myFile=org.apache.log4j.FileAppenderlog4j.appender.myFile.Threshold=WARNlog4j.appender.myFile.ImmediateFlush=truelog4j.appender.myFile.File=d:/loginfo/somelog.txtlog4j.appender.myFile.Append=false#Layout Config,配置布局#log4j.appender.myFile.layout=org.apache.log4j.PatternLayoutlog4j.appender.myFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

写入滚动文件:

#Root Logger Config,配置根Logger#log4j.rootLogger=INFO,myRFile#Appender Config,配置Appender#log4j.appender.myRFile=org.apache.log4j.RollingFileAppenderlog4j.appender.myRFile.Threshold=WARNlog4j.appender.myRFile.ImmediateFlush=truelog4j.appender.myRFile.File=d:/loginfo/myrlog.txtlog4j.appender.myDRFile.MaxFileSize=100KBlog4j.appender.myDRFile.MaxBackupIndex=5log4j.appender.myRFile.Append=true#Layout Config,配置布局#log4j.appender.myRFile.layout=org.apache.log4j.PatternLayoutlog4j.appender.myRFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

写入按时滚动文件:

#Root Logger Config,配置根Logger#log4j.rootLogger=INFO,myDRFile#Appender Config,配置Appender#log4j.appender.myDRFile=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.myDRFile.Threshold=WARNlog4j.appender.myDRFile.ImmediateFlush=truelog4j.appender.myDRFile.File=d:/loginfo/myrlog.txtlog4j.appender.myDRFile.Append=truelog4j.appender.myDRFile.DatePattern=.yyyy-MM-dd-HH#Layout Config,配置布局#log4j.appender.myDRFile.layout=org.apache.log4j.PatternLayoutlog4j.appender.myDRFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

写入套接字:

#Root Logger Config,配置根Logger#log4j.rootLogger=INFO,mySocket#Appender Config,配置Appender#log4j.appender.mySocket=org.apache.log4j.RollingFileAppenderlog4j.appender.mySocket.RemoteHost=localhostlog4j.appender.mySocket.Port=5001log4j.appender.mySocket.LocationInfo=true#Layout Config,配置布局#log4j.appender.mySocket.layout=org.apache.log4j.PatternLayoutlog4j.appender.mySocket.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

写入数据库:

#Root Logger Config,配置根Logger#log4j.rootLogger=INFO,myDB#Appender Config,配置Appender#log4j.appender.myDB=org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.myDB.URL=jdbc:mysql://localhost:3306/someDBlog4j.appender.myDB.driver=com.mysql.jdbc.Driverlog4j.appender.myDB.user=rootlog4j.appender.myDB.password=123456log4j.appender.myDB.sql=INSERT INTO logtable VALUES('%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n')#Layout Config,配置布局#log4j.appender.myDB.layout=org.apache.log4j.PatternLayoutlog4j.appender.myDB.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

MDC:

作用:

类似于Servlet的ServletContext,MDC在java代码和log4j配置文件之间能够存储和传递全局变量,存储的格式为Map。

方法:

log4j MDC提供如下三个静态方法:
public static void put(Object key, Object value);public static void remove(Object key);public static void get(Object key);

实例:

以下面这个例子来说明如何将java代码里的变量传递到log4j配置文件中:
//user.javapublic class User{private String userName;private String userId;private String userPwd;public User(String userName, String userId, String userPwd){this.userName = userName;this.userId = userId;this.userPwd = userPwd;}public String getUserName(){return userName;}public String getUserId(){return userId;}public String getUserPwd(){return userPwd;}}
//Test.javapublic static void main(String[] args){public static final Logger logger = Logger.getLogger(this.getClass().getName());User user = new User("Someone","SomeId","NoPwd");MDC.put("userName",user.getUserName());...}
//log4j.properties...log4j.appender.someappender.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss SSS} Msg:%x{userName}
原创粉丝点击