日志技术-Log4j
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志技术-Log4j相关的知识,希望对你有一定的参考价值。
- 目录:
- 一、Log4j简单了解
- 二、Log4j快速入门
- 三、Log4j自定义配置
1、LogManager类
2、PropertyConfigurator类
3、RootLogger顶级元素的配置
4、ConsoleAppender的配置-输出到控制台
5、FileAppender的配置-输出为文件
6、RollingFileAppender的配置-输出为文件,并按文件大小拆分
7、DailyRollingFileAppender的配置-输出为文件,并按设置时间拆分
8、JDBCAppender的配置-输出到mysql数据库
9、自定义Logger类输出级别&appender - 四、conversionPattern属性详细解读
- 五、log4j.properties配置文件完整内容
一、Log4j简单了解
Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。
二、Log4j快速入门
1、添加maven依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、测试代码
①初始化配置信息,暂不使用配置文件
②获取日志记录器对象
③日志记录输出
//①初始化配置信息,暂不使用配置文件
BasicConfigurator.configure();
//②获取日志记录器对象
Logger logger = Logger.getLogger(Log4jTest.class);
//③日志记录输出
//日志级别
logger.fatal("fatal");// 严重错误,一般会造成系统错误并终止运行
logger.error("error");// 错误信息,不会影响系统运行
logger.warn("warn");// 警告信息,可能会发生问题
logger.info("info");// 运行信息,数据连接、网络连接、IO 操作等
logger.debug("debug");// 调试信息,一般在开发中使用,记录程序变量参数传递信息等
logger.trace("trace");// 追踪信息,记录程序所有的流程信息
- 日志级别: fatal// 严重错误,一般会造成系统错误并终止运行
- error// 错误信息,不会影响系统运行
- warn// 警告信息,可能会发生问题
- info// 运行信息,数据连接、网络连接、IO 操作等
- debug// 调试信息,一般在开发中使用,记录程序变量参数传递信息等
- trace// 追踪信息,记录程序所有的流程信息
三、Log4j自定义配置
1、LogManager类
通过跟踪源码,我们发现getLogger方法的底层实现是LogManager的对应方法。LogManager类在类加载阶段会在resources资源路径下读取log4j.properties文件。
//row:53
static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
//row:109
url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
//row:127-128
OptionConverter.selectAndConfigure(url, configuratorClassName,
LogManager.getLoggerRepository());
2、PropertyConfigurator类
然后PropertyConfigurator类会根据我们做的配置,来完成日志的相应实现。
//row:102-114
static final String CATEGORY_PREFIX = "log4j.category.";
static final String LOGGER_PREFIX = "log4j.logger.";
static final String FACTORY_PREFIX = "log4j.factory";
static final String ADDITIVITY_PREFIX = "log4j.additivity.";
static final String ROOT_CATEGORY_PREFIX = "log4j.rootCategory";
static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
static final String APPENDER_PREFIX = "log4j.appender.";
static final String RENDERER_PREFIX = "log4j.renderer.";
static final String THRESHOLD_PREFIX = "log4j.threshold";
private static final String THROWABLE_RENDERER_PREFIX = "log4j.throwableRenderer";
private static final String LOGGER_REF = "logger-ref";
private static final String ROOT_REF = "root-ref";
private static final String APPENDER_REF_TAG = "appender-ref";
3、RootLogger顶级元素的配置
配置顶级元素的属性,此处注意appender是我们自己命名的。
- ①指定RootLogger的:日志级别+appender类型(appender多个用","隔开);
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别为 trace,使用的 appender 为 console
log4j.rootLogger = fatal,console
4、ConsoleAppender的配置-输出到控制台
通过命名不难看出是输出到控制台的处理类。
- ①配置对应的appender属性:信息格式layout+信息内容conversionPattern;
另外此处须留意:log4j.appender.console 内的 console 是我们给 appender 的命名,不是固定的。
# 指定控制台日志输出的 appender ,命名为 console
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
5、FileAppender的配置-输出为文件
相比于ConsoleAppender,FileAppender的配置我们会关心文件保存路径和字符集设置。
- ①根据FileAppender#setFile(String file)方法确认属性为file;
- ②根据父类WriterAppender#setEncoding(String value)方法确认属性为encoding;
# 指定文件日志输出的 appender ,命名为 file
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 指定日志文件保存路径
log4j.appender.file.file = D:/logs/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8
6、RollingFileAppender的配置-输出为文件,并按文件大小拆分
RollingFileAppender类我们会额外设置2个属性,如下:
- ①RollingFileAppender#setMaxFileSize(String value)方法设置文件大小,单位为KB、MB、GB,如果没设置默认大小为10MB;
- ②RollingFileAppender#setMaxBackupIndex(int maxBackups)设置文件数量,默认为1个;
# 按照文件大小拆分的 appender 对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = D:/logs/log4j-rollingFile.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件的内容大小
log4j.appender.rollingFile.maxFileSize = 1MB
# 搞定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10
7、DailyRollingFileAppender的配置-输出为文件,并按设置时间拆分
DailyRollingFileAppender我们会额外设置一个属性,如下:
- ①DailyRollingFileAppender#setDatePattern(String pattern)方法设置分割时间,如果没有设置,默认为".yyyy-MM-dd",表示每天;
# 按照时间规则拆分的 appender 对象
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyRollingFile.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 指定日志文件保存路径
log4j.appender.dailyRollingFile.file = D:/logs/log4j-dailyRollingFile.log
# 指定日志文件的字符集
log4j.appender.dailyRollingFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyRollingFile.datePattern = .yyyy-MM-dd HH-mm-ss
8、JDBCAppender的配置-输出到mysql数据库
JDBCAppender的配置比较特殊,需要我们提供MySQL连接相关的依赖,所以我们添加如下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
另外,需要我们在对应的数据库内设置相应的表格,如下:
CREATE TABLE `log` (
`log_id` INT(11) NOT NULL AUTO_INCREMENT,
`project_name` VARCHAR(255) DEFAULT NULL COMMENT 目项名,
`create_date` VARCHAR(255) DEFAULT NULL COMMENT 创建时间,
`level` VARCHAR(255) DEFAULT NULL COMMENT 优先级,
`category` VARCHAR(255) DEFAULT NULL COMMENT 所在类的全名,
`file_name` VARCHAR(255) DEFAULT NULL COMMENT 输出日志消息产生时所在的文件名称 ,
`thread_name` VARCHAR(255) DEFAULT NULL COMMENT 日志事件的线程名,
`line` VARCHAR(255) DEFAULT NULL COMMENT 号行,
`all_category` VARCHAR(255) DEFAULT NULL COMMENT 日志事件的发生位置,
`message` VARCHAR(4000) DEFAULT NULL COMMENT 输出代码中指定的消息,
PRIMARY KEY (`log_id`)
);
做好以上准备工作其余就是我们熟悉的操作了,配置JDBCAppender相应的属性即可,如下:
- ①JDBCAppender#setDriver(String driverClass)设置数据库相应驱动;
- ②JDBCAppender#setURL(String url)设置访问URL;
- ③JDBCAppender#setUser(String user)设置数据库登录账号;
- ④JDBCAppender#setPassword(String password)设置数据库对应密码;
- ⑤JDBCAppender#setSql(String s)编写注入sql;
# 输出日志到 mysql 的 appender 对象
log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
# 指定数据库连接驱动
log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
# 指定数据库连接url
log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/test
# 指定数据库连接用户名
log4j.appender.logDB.User = root
# 指定数据库连接密码
log4j.appender.logDB.Password = root
# 指定消息格式的内容,以及对应的 sql 语句
log4j.appender.logDB.Sql = INSERT INTO log\\
(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) \\
values(itcast,%dyyyy-MM-dd HH:mm:ss,%p,%c,%F,%t,%L,%l,%m)
注意:properties配置文件中"\\"符号的作用是单行内容过长,做换行用。
9、自定义Logger类输出级别&appender
依据父子关系去设置对应的自定义配置,如下:
- ①Logger.getLogger(Log4jTest.class);获取Logger对象时,命名上取值为"com.stone.Log4jTest",所以我们定义名为"com.stone.Log4jTest"的Logger对象的日志配置时,可以使用log4j.logger.com.stone = info,logDB或者log4j.logger.com.stone.Log4jTest = info,logDB的形式,颗粒度可根据实际业务需求做调整;
- ②父子关系设置的实现上:如果子元素未设置,则向上继承属性(父/顶级元素),如com.stone和org.apache不存在父子关系,此处org.apache未配置的属性会继承使用顶级元素的配置属性;
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别为 trace,使用的 appender 为 console
log4j.rootLogger = fatal,console
# 自定义 log 输出级别
log4j.logger.com.stone = info,logDB
log4j.logger.org.apache = error
四、conversionPattern属性详细解读
详细的内容其实org.apache.log4j.PatternLayout源文件内有做英文的说明,如果觉得英文阅读不太方便的话,可以参考以下解读:
- %m 输出代码中指定的日志信息
- %p 输出优先级,及 DEBUG、INFO 等
- %n 换行符(Windows平台的换行符为 "\\n",Unix 平台为 "\\n")
- %r 输出自应用启动到输出该 log 信息耗费的毫秒数
- %c 输出打印语句所属的类的全名
- %t 输出产生该日志的线程全名
- %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%dyyyy年MM月dd日 HH:mm:ss
- %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
- %F 输出日志消息产生时所在的文件名称
- %L 输出代码中的行号
- %% 输出一个 "%" 字符
五、log4j.properties配置文件完整内容
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别为 trace,使用的 appender 为 console
log4j.rootLogger = fatal,console
# 指定控制台日志输出的 appender ,命名为 console
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 自定义 log 输出级别
log4j.logger.com.stone.Log4jTest = info,logDB
log4j.logger.org.apache = error
# %m 输出代码中指定的日志信息
# %p 输出优先级,及 DEBUG、INFO 等
# %n 换行符(Windows平台的换行符为 "\\n",Unix 平台为 "\\n")
# %r 输出自应用启动到输出该 log 信息耗费的毫秒数
# %c 输出打印语句所属的类的全名
# %t 输出产生该日志的线程全名
# %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%dyyyy年MM月dd日 HH:mm:ss
# %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
# %F 输出日志消息产生时所在的文件名称
# %L 输出代码中的行号
# %% 输出一个 "%" 字符
# 指定文件日志输出的 appender ,命名为 file
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 指定日志文件保存路径
log4j.appender.file.file = D:/logs/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8
# 按照文件大小拆分的 appender 对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = D:/logs/log4j-rollingFile.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件的内容大小
log4j.appender.rollingFile.maxFileSize = 1MB
# 搞定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10
# 按照时间规则拆分的 appender 对象
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyRollingFile.layout.conversionPattern = [%-5p]%r %l %dyyyy-MM-dd HH:mm:ss.SSS %m%n
# 指定日志文件保存路径
log4j.appender.dailyRollingFile.file = D:/logs/log4j-dailyRollingFile.log
# 指定日志文件的字符集
log4j.appender.dailyRollingFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyRollingFile.datePattern = .yyyy-MM-dd HH-mm-ss
# 输出日志到 mysql 的 appender 对象
log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
# 指定消息格式 layout 为 PatternLayout
log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
# 指定数据库连接驱动
log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
# 指定数据库连接url
log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/test
# 指定数据库连接用户名
log4j.appender.logDB.User = root
# 指定数据库连接密码
log4j.appender.logDB.Password = root
# 指定消息格式的内容,以及对应的 sql 语句
log4j.appender.logDB.Sql = INSERT INTO log\\
(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) \\
values(itcast,%dyyyy-MM-dd HH:mm:ss,%p,%c,%F,%t,%L,%l,%m)
六、结尾
以上即为Log4j技术入门的相应内容
以上是关于日志技术-Log4j的主要内容,如果未能解决你的问题,请参考以下文章