<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <!-- org.apache.log4j.ConsoleAppender (输出到控制台), org.apache.log4j.FileAppender (输出到文件), org.apache.log4j.DailyRollingFileAppender (每天输出产生一个日志文件), org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件), 可通过 log4j.appender.R.MaxFileSize=100KB 设置文件 大小,还可通过 log4j.appender.R.MaxBackupIndex=1 设置为保存一个备份文件。 org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方) --> <!-- 输出通道"STDOUT",输出所有信息到控制台 (也就是System.out.println()) --> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <!--org.apache.log4j.HTMLLayout (以 HTML 表格形式布局), org.apache.log4j.PatternLayout (可以灵活地指定Log内容布局模式), org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息) --> <!-- 输出自定义内容的LOG --> <layout class="org.apache.log4j.PatternLayout"> <!-- %m 输出代码中指定的消息 %p 输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL %r 输出自应用启动到输出该 log 信息耗费的毫秒数 %c 输出打了Log的类名,%c{1}从类名开始输出一个, 例如com.tongshida.Action,{1}时只输出Action, {2}输出 tongshida.Action %C 输出.Error()方法所在的类。 %M 输出生成LOG的类当中的方法名称 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符, Windows 平台为 “rn”,Unix 平台为 “n” %d 输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在 其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,输出类似: 2002 年 10 月 18 日 22 : 10 : 28 , 921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中 的行数。 %[数值]p 输出的%p字符串长度小于[数值]时,补空格,默认右对齐, 前加-号,左对齐,这里也可以是%m等别的 %.[数值]p输出的%p字符串长度大于[数值],后面切掉。 %[数值].[数值]p 就是综合上两行。 --> <!-- 输出时Log内容的具体定义 --> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> </appender> <!-- 输出通道"DEBUG",输出方式是:只输出DEBUG级别的LOG,并文件 大小到达指定大小时产生新的Log文件 --> <appender name="DEBUG" class="org.apache.log4j.RollingFileAppender"> <!-- 输出Log文件的路径和文件名 --> <param name="File" value="logs/debug/debug.log"/> <!-- TOMCAT等WEB服务器重新启动时,是否插入到原有的LOG文件里, true 插入false 新建 --> <param name="Append" value="true"/> <!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 --> <!-- param name="Threshold" value="info"/ --> <!-- 因选择了RollingFileAppender了才有下面两个 MaxFileSize, MaxBackupIndex 选项 --> <!-- MaxFileSize是一个LOG文件的最大的文件大小,当LOG文件超过这个 值时,自动转成 *.log.1的LOG文件 --> <param name="MaxFileSize" value="500KB"/> <!-- MaxBackupIndex生成自动转成 *.log.1的LOG文件的个数,设置3时最多 生成3个LOG备份文件,它们是[*.log.1][*.log.2][*.log.3] --> <param name="MaxBackupIndex" value="2"/> <!-- 输出时Log内容的具体定义 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> <!-- 过滤输出时Log内容,在这里,LevelMin,LevelMax都定义了DEBUG, 所以只输出DEBUG级别LOG的数据 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <!-- 指定输出LOG内容的最低等级 --> <param name="LevelMin" value="DEBUG"/> <!-- 指定输出LOG内容的最高等级 --> <param name="LevelMax" value="DEBUG"/> </filter> </appender> <!-- 输出通道"INFO",输出方式是:只输出INFO级别的LOG,并文件大小 到达指定大小时产生新的Log文件 --> <appender name="INFO" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/info/info.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO"/> <param name="LevelMax" value="INFO" /> </filter> </appender> <!-- 输出通道"WARN",输出方式是:只输出WARN级别的LOG,并文件 大小到达指定大小时产生新的Log文件 --> <appender name="WARN" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/warn/warn.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="WARN"/> <param name="LevelMax" value="WARN"/> </filter> </appender> <!-- 输出通道"ERROR",输出方式是:只输出ERROR级别的LOG,并文件 大小到达指定大小时产生新的Log文件 --> <appender name="ERROR" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/error/error.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="ERROR"/> <param name="LevelMax" value="ERROR"/> </filter> </appender> <!-- 输出通道"FATAL",输出方式是:只输出INFO级别的LOG,并文件大小 到达指定大小时产生新的Log文件 --> <appender name="FATAL" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/fatal/fatal.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="FATAL"/> <param name="LevelMax" value="FATAL"/> </filter> </appender> <!-- 输出通道"ALL",输出方式是:输出所有级别的LOG,并文件大小到达 指定大小时产生新的Log文件 --> <appender name="ALL" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/all/all.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="2"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG"/> <param name="LevelMax" value="FATAL"/> </filter> </appender> <!-- 输出通道"EVERYDAY",输出方式是:输出所有级别的LOG,并每天一个 日志文件 --> <appender name="EVERYDAY" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="logs/ereryday/ereryday.log"/> <param name="Append" value="true"/> <!-- param name="Threshold" value="DEBUG"/ --> <!-- 以日为单位输出LOG文件,每日输出一个LOG文件--> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <!-- 以时为单位输出LOG文件,每小时输出一个LOG文件 <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/> --> <layout class="org.apache.log4j.PatternLayout"> <!-- The default pattern: Date Priority [Category] Message --> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/> <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/> --> </layout> <!-- 过滤输出时Log内容,在这里,LevelMin是DEBUG,LevelMax都FATAL, 所以输出DEBUG级别到FATAL级别的LOG数据 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG"/> <param name="LevelMax" value="FATAL"/> </filter> </appender> <!-- 输出通道"DATABASE",输出方式是:输出所有级别的LOG到数据库 --> <appender name="DATABASE" class="org.apache.log4j.jdbc.JDBCAppender"> <!--数据库的驱动,这里用的是MSSQL--> <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/> <!--这是Oracle用的驱动,在这里用MSSQL所以屏蔽掉了 <param name="driver" value="oracle.jdbc.driver.OracleDriver" /> --> <!--要连接的数据库--> <param name="URL" value="jdbc:microsoft:sqlserver://192.168.0.120: 1433;DatabaseName=test" /> <!--连接数据库的用户名--> <param name="user" value="sa" /> <!--连接数据库的密码--> <param name="password" value="sa" /> <!--向MSSQL数据库表LOG中插入数据的sql语句--> <param name="sql" value=" INSERT INTO LOG (LOGDATE,LOGLEVEL,LOGCLASS,LOGLOGGER,LOGMESSAGE) values ('%d{yyyy-MM-dd HH:mm:ss}','%.50p', '%.50c', '%.50l', '%.1000m')"/> <!-- Oracle 的 insert 语句 <param name="sql" value=" insert into logrecord (id,packageid,userid,syscodeid,info,logtime,loglevel) values(?,?,?,?,?,to_date('%d{yyyy-MM-dd HH:mm:ss}', 'yyyy-MM-dd HH24:mi:ss'),'%p')" /> --> <!-- 过滤输出时Log内容,在这里,LevelMin是ERROR,LevelMax都 FATAL,所以输出DEBUG级别到FATAL级别的LOG数据 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="ERROR"/> <param name="LevelMax" value="FATAL"/> </filter> </appender> <!-- 输出通道"HTML",输出方式是:输出所有级别的LOG到数据库 --> <appender name="HTML" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/html/htmllog.html" /> <param name="Append" value="true" /> <!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 --> <!-- param name="Threshold" value="info"/ --> <param name="MaxFileSize" value="50KB"/> <param name="MaxBackupIndex" value="2"/> <!-- 好像现在只有固定输出格式 --> <!-- 输出的HTML都缺少</table></body>等代码,log4j的Bug? 我建议是不要使用 --> <layout class="org.apache.log4j.HTMLLayout"> <param name="Title" value="TSD HP HTML LOG" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="DEBUG"/> <param name="LevelMax" value="FATAL"/> </filter> </appender> <!-- 设置域名限制,即com.tongshida域及以下的日志均输出到下面 对应的通道中, 虽然下面<roo>的<priority value="ERROR">设置 成ERROR,但com.tongshida下面的程序中的LOG要输出 level="DEBUG"的 DEBUG级别以上的LOG--> <!--给客户交货时要把它屏蔽--> <logger name="com.tongshida"> <!-- 设置com.tongshida以下函数输出LOG的级别 --> <level value="DEBUG"/> <!-- 好像是指定输出通道,因为下面root里指定了所以这里屏蔽掉了 <appender-ref ref="DEBUG"/> --> </logger> <root> <!-- 设置输出范围,在这里光输出ERROR以上的,ERROR级别, FATAL级别的LOG --> <priority value="ERROR"/> <!-- 上边设置的输出通道,使用的在这里定义 --> <appender-ref ref="STDOUT"/> <appender-ref ref="DEBUG"/> <appender-ref ref="INFO"/> <appender-ref ref="WARN"/> <appender-ref ref="ERROR"/> <appender-ref ref="FATAL"/> <appender-ref ref="ALL"/> <appender-ref ref="EVERYDAY"/> <appender-ref ref="DATABASE"/> <appender-ref ref="HTML"/> </root> </log4j:configuration>
6.Log4j在Java程序里的使用。
Logger log = Logger.getLogger(inputClass);
//输出到数据库时有"'"会出错所以把它换成全角
String outmessage = message.replaceAll("'", "’");
log.debug(outmessage);log.error(outmessage);log.warn(outmessage);
如想要动态输出LOG(更改输出目录和文件名),也就是强制改变读到
内存中的[Log4j.xml]里的相应输出目录和文件名。鉴于篇幅没能写下。
7.MSSQL_log_table_Creater.sql
CREATE TABLE [LOG] (
ID INTEGER NOT NULL PRIMARY KEY,
LOGDATE DATETIME,
LOGTIME TIMESTAMP,
LOGTHREAD VARCHAR(50),
LOGLEVEL VARCHAR(50),
LOGCLASS VARCHAR(50),
LOGLOGGER VARCHAR(200),
LOGMESSAGE VARCHAR(2000)
)