日志技术-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】_日志文件

五、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的主要内容,如果未能解决你的问题,请参考以下文章

Log4j.xml 详解

Mybatis09 日志工厂配置 & Log4J

log4j日志

如何关闭log4j中配置的spring或者hibernate的日志信息

日志技术-Log4j

Java--log4j