Log4j配置总结 分别配置控制台、写文件、发邮件、存数据库
log4j-1.2.17.jar
sqljdbc4.jar
Log4j 有3个主要组件:
- Loggers(日志类别)
- Appenders(日志要输出的地方)
- Layouts(日志以何种形式输出)
Loggers 五个级别:
DEBUG < INFO < WARN < ERROR < FATAL
使用:
Logger logger =Logger.getLogger(实体类.class.getName());
Appenders 设置日志要输出的地方
日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
语法:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Layouts 格式化日志输出
Log4j可以在Appenders的后面附加Layouts来完成这个功能。
Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等
语法:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j配置实例
控制台、写文件、发邮件、存数据库
#配置根Logger
#log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
#level:Logger优先级,appenderName是日志信息的输出地,可以同时指定多个输出地。如:log4j.rootLogger= INFO,A1,A2
log4j.rootLogger=debug,Log4jConsole,Log4jFile,LogSendEmail,LogDB
#配置日志信息输出目的地
#log4j.appender.appenderName=fully.qualified.name.of.appender.class
log4j.appender.Log4jConsole=org.apache.log4j.ConsoleAppender
#System.out用于正常的输出,也就是程序真正想输出的内容。而System.err用于出错信息的输出,也就是你本来不期待看到的东西。
log4j.appender.Log4jConsole.Target = System.out
#配置日志信息的格式,其语法为:
log4j.appender.Log4jConsole.layout = org.apache.log4j.PatternLayout
log4j.appender.Log4jConsole.encoding=UTF-8
#log4j.appender.Log4jConsole.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%t:%rms - %l ] - %m %n
log4j.appender.Log4jConsole.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %c - %m %n
#这里需要说明的就是日志信息格式中几个符号所代表的含义:
# -X号: X信息输出时左对齐;
# %p: 日志信息级别 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
# %d{}: 日志信息产生时间 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
# 比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
# %c: 日志信息所在地(类名) 输出所属的类目,通常就是所在类的全名
# %m: 产生的日志具体信息 输出代码中指定的消息
# %n: 输出日志信息换行 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
# %r 输出自应用启动到输出该log信息耗费的毫秒数
# %t 输出产生该日志事件的线程名
# %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4
#RollingFileAppender按log文件最大长度限度生成新文件,DailyRollingFileAppender按日期生成新文件。
log4j.appender.Log4jFile= org.apache.log4j.DailyRollingFileAppender
log4j.appender.Log4jFile.File = WebRoot/logfiles/Log4jFile
log4j.appender.Log4jFile.DatePattern = '_'yyyy-MM-dd-HH'.log'
log4j.appender.Log4jFile.encoding=UTF-8
# ' . ' yyyy - MM: 每个月更新一个log日志
# ' . ' yyyy - ww: 每个星期更新一个log日志
# ' . ' yyyy - MM - dd: 每天更新一个log日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一个log日志
# ' . ' yyyy - MM - dd - HH: 每小时更新一个log日志
# ' . ' yyyy - MM - dd - HH - mm: 每分钟更新一个log日志
#DatePattern中配置的'_'yyyy-MM-dd-HH-mm'.log' 意思是根据这个时间来定时生成文件,并且把'_'yyyy-MM-dd-HH-mm'.log'附加在原文件的后面,
#即:logcase_'yyyy-MM-dd-HH-mm'.log', 由于定义到mm所以就每分钟生成一次
#false:表示Logger不会在父Logger的appender里输出,默认为true。添加到末尾,false在每次启动时进行覆盖
log4j.appender.Log4jFile.Append = true
#表示所有消息都会被立即输出,不进行缓存 设为false则不输出,默认值是true。
log4j.appender.Log4jFile.ImmediateFlush = true
log4j.appender.Log4jFile.Threshold = ERROR
log4j.appender.Log4jFile.layout = org.apache.log4j.PatternLayout
#log4j.appender.Log4jFile.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%t:%r ms - %l ] - %m %n
log4j.appender.Log4jFile.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %c - %m %n
#为不同的 Appender 设置日志输出级别:
#把不同级别的日志保存在不同的文件中
#log4j.appender.D.Threshold= DEBUG ## 输出DEBUG级别以上的日志
#log 发送邮件
#log4j的邮件发送appender,如果有必要你可以写自己的appender
log4j.appender.LogSendEmail=org.apache.log4j.net.SMTPAppender
#发送邮件的门槛,仅当等于或高于ERROR(比如FATAL)时,邮件才被发送
log4j.appender.LogSendEmail.Threshold=FATAL
#缓存文件大小,日志达到10k时发送Email
log4j.appender.LogSendEmail.BufferSize=10
#发送邮件的邮箱帐号
log4j.appender.LogSendEmail.From=xx@xx.com
#SMTP邮件发送服务器地址
log4j.appender.LogSendEmail.SMTPHost=xx.xx.com
#SMTP发送认证的帐号名
log4j.appender.LogSendEmail.SMTPUsername=xx@xx.com
#SMTP发送认证帐号的密码
log4j.appender.LogSendEmail.SMTPPassword=xxx
#是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息
log4j.appender.LogSendEmail.SMTPDebug=false
#邮件主题
log4j.appender.LogSendEmail.Subject=Log4JErrorMessage
#发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔;
#如果需要发副本给某人,则加入下列行
#log4j.appender.MAIL.Bcc=xxx@xxx.xxx
log4j.appender.LogSendEmail.To=xx@xx.com
#不写入上层即父类logger
log4j.additivity.LogSendEmail=false
#此为输出文字格式
#log4j.appender.LogSendEmail.layout=org.apache.log4j.PatternLayout
#log4j.appender.LogSendEmail.layout.ConversionPattern=[framework]%d - %c -%-4r[%t]%-5p %c %x -%m%n
#此为网页格式
log4j.appender.LogSendEmail.layout=org.apache.log4j.HTMLLayout
#此为输出html格式重写 HTMLLayout 类,根据自身需要输出不同列
#log4j.appender.LogSendEmail.layout=com.log.FormatHTMLLayout
#log4j.appender.LogSendEmail.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
###LogDB
#下面是配置将日志信息插入数据库,
log4j.appender.LogDB=org.apache.log4j.jdbc.JDBCAppender
#配置输出目标为数据库,当然你也可以自己扩展org.apache.log4j.jdbc.JDBCAppender
log4j.appender.LogDB.BufferSize=1
#设置缓存大小,就是当有10条日志信息是才忘数据库插一次
#
log4j.appender.LogDB.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#设置要将日志插入到数据库的驱动
log4j.appender.LogDB.URL=jdbc:sqlserver://xx:xxxxx; DatabaseName=xxx
log4j.appender.LogDB.user=xx
log4j.appender.LogDB.password=xxxxx
log4j.appender.LogDB.sql=insert into WDZLOG (LogName,UserName,Class,Mothod,createTime,LogLevel,MSG) values ('%X{userId}','%X{userName}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')
#设置要插入日志信息的格式和内容,%X{userId}是置取MDC中的key值,因为我们在过滤器中是将用户id和用户姓名放入MDC中,所有在这里可以用%X{userId}和%X{userName}取出用户的ID和用户姓名;'%C'表示日志信息是来自于那个类;%M表示日志信息来自于那个方法中;%d{yyyy-MM-dd HH:mm:ss}表示日志信息产生的时间,{yyyy-MM-dd HH:mm:ss}表示一种时间格式,你也可以直接写成%d;%p表示日志信息的级别(debug info warn error);
#%m表示你写入的日志信息
log4j.appender.LogDB.layout=org.apache.log4j.PatternLayout
传参数到log4j配置文件中
log4j.appender.LogDB.sql=insert into WDZLOG (LogName,UserName,Class,Mothod,createTime,LogLevel,MSG) values ('%X{userId}','%X{userName}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.apache.log4j.PropertyConfigurator;
public class LogDB{
public static Logger log=Logger.getLogger(LogDB.class);
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
MDC.put("userId", "qqq");
MDC.put("userName", "eee");
log.debug("abbbb");
}
}