学习笔记,为了加强记忆和深入理解在此记录备忘。如有错误和理解不当之处,还望指正。万分感谢!
另外,实例和内容有些是参照网络其他博文,如有侵权可联系删掉。
参考地址:https://blog.csdn.net/u011781521/article/details/55002553
目录
7.2 src同级创建并设置log4j.properties
一、概念
Log4j是什么?Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
二、为什么要使用Log4j
参考:https://www.cnblogs.com/godtrue/p/6442273.html
三、组成组件
Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。
- Logger: 控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制
- Appenders : 指定了日志将打印到控制台还是文件中
- Layout : 控制日志信息的显示格式
四、日志级别
Log4j中将要输出的Log信息定义了几种级别,当输出时,只有级别高过配置中规定的级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码,这点实在是方便啊。
例如,如果使用了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。
- off 最高等级,用于关闭所有日志记录。
- fatal 指出每个严重的错误事件将会导致应用程序的退出。
- error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
- warm 表明会出现潜在的错误情形。
- info 一般和在粗粒度级别上,强调应用程序的运行全程。
- debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
- all 最低等级,用于打开所有日志记录。
建议使用以下四种:DEBUG、INFO、WARN、ERROR
五、必须的包
- log4j-1.2-api-2.11.1.jar
六、配置文件
6.1 日志输出目的地
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
6.2 指定特定包的输出特定的级别
可以特定输出很多其他框架的日志,这里列举一个
-
log4j.logger.org.springframework=DEBUG
6.3 日志输出格式
- org.apache.log4j.HTMLLayout(以HTML表格形式布局),
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
6.4 打印参数
- %m 输出代码中指定的消息
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
- %r 输出自应用启动到输出该log信息耗费的毫秒数
- %c 输出所属的类目,通常就是所在类的全名
- %t 输出产生该日志事件的线程名
- %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
- 如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921
- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
- 如:Testlog.main(TestLog.java:10)
- %F 输出日志消息产生时所在的文件名称
- %L 输出代码中的行号
- %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中
- %% 输出一个"%"字符
6.5 配置文件xml格式
有一点要注意,xml文件优先级要比properties文件优先级高。所以,如果两种日志方式同时存在,只有xml方式有用
log4j 2则已经弃用了properties这种方式,采用的是.xml,.json或者.jsn这种方式来做
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 日志输出到控制台 -->
<appender name="C" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="INFO" />
<!-- 日志输出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n" />
</layout>
</appender>
<!-- 输出日志到文件 -->
<appender name="F" class="org.apache.log4j.FileAppender">
<!-- 输出文件全路径名 -->
<param name="File" value="/data/applogs/own/fileAppender.log" />
<!--是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件 -->
<param name="Append" value="false" />
<!--过滤器设置输出的级别 -->
<param name="Threshold" value="INFO" />
<!-- 编码格式 -->
<param name="Encoding" value="UTF-8" />
<!-- 日志输出格式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n" />
</layout>
</appender>
<!-- 选择上边定义的输出器 -->
<logger name="logTest" additivity="false">
<!--
1. 指定logger的设置,additivity是否遵循缺省的继承机制
2. 当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
3. 代码中使用Logger.getLogger("logTest")获得此输出器,且不会使用根输出器
-->
<level value="INFO" />
<appender-ref ref="C" />
<appender-ref ref="F" />
</logger>
<!-- 根logger的设置,若代码中未找到指定的logger,则会根据继承机制,使用根logger -->
<root>
<appender-ref ref="C" />
<appender-ref ref="F" />
</root>
</log4j:configuration>
6.6 配置文件property格式
log4j.properties和上边的xml是等价的,就是格式不一样
# 定义rootLogger,格式是level,输出器名称1,输出器名称2,输出器名称3
# 可同时指定多个输出目的
log4j.rootLogger = INFO,C,F
# 设置控制台输出
log4j.appender.C = org.apache.log4j.ConsoleAppender
# 默认值System.out,输出到控制台(err为红色,out为黑色)
log4j.appender.stdout.Target = System.out
# 定义日志级别
log4j.appender.C.Threshold = INFO
# 定义输出类型
log4j.appender.C.layout = org.apache.log4j.PatternLayout
# 定义输出格式
log4j.appender.C.layout.ConversionPattern = [%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n
# 设置输出到文件
log4j.appender.F = org.apache.log4j.FileAppender
# 指定路径
log4j.appender.F.File = /data/applogs/own/fileAppender.log
# 定义是否追加
log4j.appender.F.Append = true
# 日志编码
log4j.appender.F.Encoding = UTF-8
# 定义日志级别,输出这个级别及其以上的
log4j.appender.F.Threshold = DEBUG
# 定义输出类型
log4j.appender.F.layout = org.apache.log4j.PatternLayout
# 定义输出格式
log4j.appender.F.layout.ConversionPattern = [%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n
七、使用
7.1 新建项目并导入jar包
7.2 src同级创建并设置log4j.properties
7.3 创建测试类
package com.mucfc;
import org.apache.log4j.Logger;
public class Test {
private static Logger logger = Logger.getLogger(Test.class);
public static void main(String[] args) {
System.out.println("This is println message.");
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
}
八、常用配置文件
# 定义输出器
# OFF(不打印日志)
# ALL(打印所有文件)
# systemOut:输出到控制台
# logFile:输出到文件
# logDailyFile:按DatePattern输出到文件,一天一个文件
# logRollingFile:设定文件大小输出到文件,达到设定大小换一个文件
# logMail:日志输入到邮箱发送
# logDB:日志写到数据库表
log4j.rootLogger =ALL,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB
#输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.systemOut.Threshold = DEBUG
log4j.appender.systemOut.ImmediateFlush = TRUE
log4j.appender.systemOut.Target = System.out
#输出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logFile.Threshold = DEBUG
log4j.appender.logFile.ImmediateFlush = TRUE
log4j.appender.logFile.Append = TRUE
log4j.appender.logFile.File = ../Struts2/WebRoot/log/File/log4j_Struts.log
log4j.appender.logFile.Encoding = UTF-8
#按DatePattern输出到文件
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logDailyFile.Threshold = DEBUG
log4j.appender.logDailyFile.ImmediateFlush = TRUE
log4j.appender.logDailyFile.Append = TRUE
log4j.appender.logDailyFile.File = ../Struts2/WebRoot/log/DailyFile/log4j_Struts
log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log'
# '.'yyyy-ww:每周
# '.'yyyy-MM:每月
# '.'yyyy-ww:每周
# '.'yyyy-MM-dd:每天
# '.'yyyy-MM-dd-a:每天两次
# '.'yyyy-MM-dd-HH:每小时
# '.'yyyy-MM-dd-HH-mm:每分钟
log4j.appender.logDailyFile.Encoding = UTF-8
#设定文件大小输出到文件
log4j.appender.logRollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.logRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logRollingFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logRollingFile.Threshold = DEBUG
log4j.appender.logRollingFile.ImmediateFlush = TRUE
log4j.appender.logRollingFile.Append = TRUE
log4j.appender.logRollingFile.File = ../Struts2/WebRoot/log/RollingFile/log4j_Struts.log
log4j.appender.logRollingFile.MaxFileSize = 1MB
log4j.appender.logRollingFile.MaxBackupIndex = 10
log4j.appender.logRollingFile.Encoding = UTF-8
#用Email发送日志
log4j.appender.logMail = org.apache.log4j.net.SMTPAppender
log4j.appender.logMail.layout = org.apache.log4j.HTMLLayout
log4j.appender.logMail.layout.LocationInfo = TRUE
log4j.appender.logMail.layout.Title = Struts2 Mail LogFile
log4j.appender.logMail.Threshold = DEBUG
log4j.appender.logMail.SMTPDebug = FALSE
log4j.appender.logMail.SMTPHost = SMTP.163.com
log4j.appender.logMail.From = xly3000@163.com
log4j.appender.logMail.To = xly3000@gmail.com
#log4j.appender.logMail.Cc = xly3000@gmail.com
#log4j.appender.logMail.Bcc = xly3000@gmail.com
log4j.appender.logMail.SMTPUsername = xly3000
log4j.appender.logMail.SMTPPassword = 1234567
log4j.appender.logMail.Subject = Log4j Log Messages
#log4j.appender.logMail.BufferSize = 1024
#log4j.appender.logMail.SMTPAuth = TRUE
#将日志登录到MySQL数据库
log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
log4j.appender.logDB.URL = jdbc:mysql://127.0.0.1:3306/xly
log4j.appender.logDB.User = root
log4j.appender.logDB.Password = 123456
log4j.appender.logDB.Sql = INSERT INTOT_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('Struts2','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')