Java的常用日志技术详解(一)
日志文件
日志文件是用于记录系统操作事件的文件集合。
日志文件它具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要的作用。
日志种类
调试日志
调试程序,或者做一些状态的输出,便于我们查询程序的运行状况。为了让我们能够更加灵活且方便的控制这些调试信息,我们肯定是需要更加专业的日志技术。我们平时在调试程序的过程中所使用的肯定就是专业开发工具自带的debug 功能,可以实时查看程序运行情况,不能够有效保存运行情况的信息。调试日志是能够更加方便的去“重现”这些问题。
系统日志
系统日志是用来记录系统中硬件、软件和系统相关问题的信息。同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找收到攻击是留下的痕迹。
系统日志包括系统日志、应用日志和安全日志这几种分类。
日志框架及作用
日志作用
- 控制日志输出的内容和格式。
- 控制日志输出的位置。
- 日志文件相关的优化,如异步操作、归档、压缩
- 日志系统的维护
- 面向接口开发-日志的门面
目前日志框架
日志门面:为了将各个服务框架中自带的日志进行统一门面处理,使用门面技术。
- JCL (Jakarta Commons Logging)
- slf4j ( Simple Logging Facade for Java)
日志实现:
- JUL--JDK自带的原生日志框架,不需要导入第三方依赖。在java.util.logging
- Log4j--Apache开源项目,性能问题,Apache公司已经停止维护
- logback--与Log4j同一人开发,吸收Log4j优点,且可靠、通用,灵活,springboot2.0以后默认使用
- log4j2--利用logback优势特征,在log4j基础上改进为log4j2版本,springboot1.4以后支持log4j2,目前性能最好的日志框架
日志门面与日志实现区别:
- 日志框架技术:JUL、Log4j、log4j2、logback,用来记录日志信息
- 日志门面技术:JCL、slf4j,用来解决 应用程序 在使用各种日志框架对应API时候导致的耦合性,因此提出一套门面技术,开发人员只需调用门面接口即可。
JUL(了解)
1、简介
全程Java Util Logging,它是java原生的日志框架,使用时不需要另外引用第三方的类库,相对其他的框架使用方便,学习简单,主要是使用在小型应用中。
2、组件及介绍
- Logger:被称为记录器,应用程序通过获取Logger对象,抵用其API来发布日志信息。Logger通常被认为是访问日志系统的入口程序。
- Handler:处理器,每个Logger都会关联一个或者是一组 Handler,Logger 会将日志交给关联的Handler去做处理,由Handler 负责将日志做记录。Handler具体实现了日志的输出位置,比如可以输出到控制台或者是文件中等等。
- Filter:过滤器,根据需要定制哪些信息会被记录,哪些信息会被略过。
- Formatter:格式化组件,它负责对日志中的数据和信息进行转换和格式化,所以它决定了我们输出日志最终的形式。
- Level:日志的输出级别,每条日志消息都有一个关联的级别。我们根据输出级别的设置,用来展现最终所呈现的日志信息。根据不同的需求,去设置不同的级别。
3、入门代码
public class TestJUL {public static void main(String[] args) {/*** 日志入口程序* Java.util.logging.Logger*///Logger对象的创建方式,不能直接new对象//取符对象的方法参数,需要引入当前类的全路径字符串(当前我们先这么用,以后根据包结构有Logger父子关系,以后详细介绍)Logger logger = Logger.getLogger("com.hweadee.logger.TestJUL");/*** 日志输出的两种方式*/// 方式一:使用info方法logger.info("hello JUL");// 方式二:使用log方法logger.log(Level.INFO, "hello JUL");logger.log(Level.INFO, "user info id={0},name={1}", new Object[]{"xiatain", 32});}
}
Log4j
1、简介
Log4j是Apache下的一款开源的日志框架,通过在项目中使用Log4J,我们可以控制日志信息输出到控制台、文件、数据库、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog 守护进程等;
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2、日志级别
日志的输出都是分级别的,当一条日志信息的级别大于或等于配置文件的级别时,就对这条日志进行记录。常见的日志级别如下(优先级依次升高)。
序号 | 日志级别 | 说明 |
---|---|---|
1 | trace | 追踪,指明程序运行轨迹。迫踪信息,记录程序所有的流程信息 |
2 | debug | 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用,一般在开发中使用,记录程序变量参数传递信息等等 |
3 | info | 输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多 |
4 | warn | 警告信息,可能会发生问题,使用较多 |
5 | error | 错误信息,不会影响系统运行,使用较多 |
6 | fatal |
严重错误,一般会造成系统崩溃并终止运行,很少使用 |
3、入门案例
在pom文件中引入Junit的jar包和log4j的jar包
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>
public class Log4jTest {@Testpublic void test() {//初始化配置信息,在入门案例中暂不使用配置文件BasicConfigurator.configure();//获取日志记录器对象Logger logger = Logger.getLogger(String.valueOf(Log4jTest.class));//日志级别logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行logger.error("error"); // 错误信息,不会影响系统运行logger.warn("warn");//警告信息,可能会发生问题logger.info("info");// 运行信息,数据连接、网络连接、I0操作等等logger.debug("debug");// 调试信息,一般在开发中使用,记录程序变量参数传递信息等等logger.trace("trace"); //追踪信息,记录程序所有的流程信息}
}
4、组件介绍
Log4j主要由Loggers、Appenders、Layout组成。
- Loggers(日志记录器):控制日志的输出以及输出级别;
- Appenders(输出控制器):指定日志的输出方式(输出到控制台、文件等);
- Layout(日志格式化器):控制日志信息的输出格式。
01、Loggerse
- 日志记录器,负责收集处理日志记录,实例的命名就是类的全限定名,如com.bjpowernode.log4j.XX;
- Logger的名字大小写敏感,其命名有继承机制:例如: name为com.bjpowernode.log4j 的 logger会继承name为 com.bjpowernode。
- Log4J中有一个特殊的 logger 叫做"root",他是所有 logger 的根,也就意味着其他所有的 logger都会直接或者间接地继承自root。
- root logger可以用Logger.getRootLogger()方法获取。
- 自 log4j1.2 版以来,Logger类已经取代了Category类。对于熟悉早期版本的log4j的人来说,Logger类可以被视为Category类的别名。
Logger root = Logger.getRootLogger();
Logger log = Logger.getLogger("root");
System.out.println(log==root); //false 说明root无法通过name获取
Logger log2 = Logger.getLogger("root");
System.out.println(log==log2); //true,说明一个name唯一对应一个logger
02、Appender
用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。Log4j常用的输出目的地有以下几种:
输出端类型 | 作用 |
---|---|
ConspleAppender |
将日志输出到控制台 |
FileAppender | 将日志输出到文件中 |
DailyRollingFileAppender | 将日志输出到一个日志文件,并且每天输出到一个新的文件 |
RollingFileAppender |
将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定 尺寸时,会自动把文件改名,同时产生一个新的文件 |
JDBCAppender | 把日志信息保存到数据库中 |
03、Layouts
布局器Layouts用于控制日志输出内容的格式,让我们可以使用各种需要的格式输出日志。Log4j常用的Lavouts:
格式化器类型 | 作用 |
---|---|
HTMLLayout | 格式化日志输出为HTML表格形式 |
SimpleLayout | 简单的日志输出格式化,打印的默认info级别消息,日志格式为(info - message) |
PatternLayout |
最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式 |
XMLlLayout | 格式化日志输出为XML表格形式 |
ConversionPattern参数的格式含义:
格式名 含义
%c 输出日志信息所属的类目,通常就是所在类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%f 输出日志消息产生时所在的文件名称
%l 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%m 输出代码中指定的消息,产生的日志具体信息
%n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该log信息耗费的毫秒数
%t 输出产生该日志事件的线程名
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
04、使用log4j.properties配置文件
001、测试代码
public class Log4jTest {@Testpublic void test() {// 设置内置日志启动,默认是falseLogLog.setInternalDebugging(true);//获取日志记录器对象Logger logger = Logger.getLogger(Log4jTest.class);//日志级别logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行logger.error("error"); // 错误信息,不会影响系统运行logger.warn("warn");//警告信息,可能会发生问题logger.info("info");// 运行信息,数据连接、网络连接、I0操作等等logger.debug("debug");// 调试信息,一般在开发中使用,记录程序变量参数传递信息等等logger.trace("trace"); //追踪信息,记录程序所有的流程信息}
}
002、配置log4j.properties
在resources下面创建一个log4j.properties,以输出到 控制台 为例,
- 输出消息格式为:SimpleLayout , 配置内容 及 运行结果 如下:
# 配置 Root 顶级父元素
# 指定日志输出级别为=debug ,使用的appender即输出目标为=console
log4j.rootLogger = debug,console
# 指定 控制台日志 输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定 消息格式
log4j.appender.console.layout = org.apache.log4j.SimpleLayout
- 输出消息格式为:XMLLayout , 配置内容 及 运行结果 如下:
# 配置 Root 顶级父元素
# 指定日志输出级别为=debug ,使用的appender即输出目标为=console
log4j.rootLogger = debug,console
# 指定 控制台日志 输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定 消息格式
log4j.appender.console.layout = org.apache.log4j.XMLLayout
- 输出消息格式为:HTMLLayout , 配置内容 及 运行结果 如下:
# 配置 Root 顶级父元素
# 指定日志输出级别为=debug ,使用的appender即输出目标为=console
log4j.rootLogger = debug,console
# 指定 控制台日志 输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定 消息格式
log4j.appender.console.layout = org.apache.log4j.HTMLLayout
- 输出消息格式为:自定义 PatternLayout , 配置内容 及 运行结果 如下:
# 配置 Root 顶级父元素
# 指定日志输出级别为=debug ,使用的appender即输出目标为=console
log4j.rootLogger = debug,console
# 指定 控制台日志 输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定 消息格式
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定 消息格式的内容 %p:消息级别、%r:消息用的时间、
# %c:类全名、%t:线程名、%F:文件名 %L:行号
# [%p]%r %c %t %F %L %d{yyyy-MM-dd HH:mm:ss} = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss}
log4j.appender.console.layout.conversionPattern= [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n
#日志立即输出,不用缓冲,默认为true
log4j.appender.rollingFile.ImmediateFlush=true
#因为是文件,所以会有追加的动作,控制是否追加,还是覆盖,默认为true
log4j.appender.rollingFile.Append=true
003、配置输出到文件
在resources下面创建一个log4j.properties,代码如下:
# 配置 Root 顶级父元素 # 指定日志输出级别为=debug ,使用的appender为=console、file、 log4j.rootLogger = debug,console,file# 指定 控制台日志 输出的 appender log4j.appender.console = org.apache.log4j.ConsoleAppender # 指定 消息格式 log4j.appender.console.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 %p:消息级别、%r:消息用的时间、 # %c:类全名、%t:线程名、%F:文件名 %L:行号 # [%p]%r %c %t %F %L %d{yyyy-MM-dd HH:mm:ss} = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} log4j.appender.console.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n# 指定 日志文件 输出的 appender log4j.appender.file = org.apache.log4j.FileAppender # 指定 消息格式 log4j.appender.file.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 log4j.appender.file.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n # 指定 消息日志文件保存的路径 log4j.appender.file.file = ./logs/log4j.log # 指定 消息日志文件的字符集 log4j.appender.file.encoding = UTF-8
运行结果如图:
004、配置输出到数据库
添加数据库依赖:
<dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.17</version></dependency></dependencies>
在resources下面创建一个log4j.properties,代码如下:
# 配置 Root 顶级父元素 # 指定日志输出级别为=debug ,使用的appender为=console、file、 log4j.rootLogger = debug,console,file,logDB# 指定 控制台日志 log4j.appender.console = org.apache.log4j.ConsoleAppender # 指定 消息格式 log4j.appender.console.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 %p:消息级别、%r:消息用的时间、 # %c:类全名、%t:线程名、%F:文件名 %L:行号 # [%p]%r %c %t %F %L %d{yyyy-MM-dd HH:mm:ss} = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} log4j.appender.console.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n# 指定 日志文件 输出的 appender log4j.appender.file = org.apache.log4j.FileAppender # 指定 消息格式 log4j.appender.file.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 log4j.appender.file.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n # 指定 消息日志文件保存的路径 log4j.appender.file.file = ./logs/log4j.log # 指定 消息日志文件的字符集 log4j.appender.file.encoding = UTF-8# 指定 日志文件 输出到数据库Mysql log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender log4j.appender.logDB.layout = org.apache.log4j.PatternLayout log4j.appender.logDB.Driver = com.mysql.cj.jdbc.Driver log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/cqyddx?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai log4j.appender.logDB.User = root log4j.appender.logDB.Password = root log4j.appender.logDB.Sql = INSERT INTO log(project_name, create_date, LEVEL, category, file_name, thread_name, line, all_category, message) \VALUES ('itcast', '%d{yyyy-MM-dd HH:mm:ss}', '%p', '%c', '%F', '%t', '%L', '%l', '%m');
创建数据库表格:
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 )
);
运行结果如图:
005、按频率(时间)生成日志文件
ailyRollingFileAppender是日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件。DatePattern选项的有效值为:
- '.'yyyy-MM,对应monthly(每月)
- '.'yyyy-ww,对应weekly(每周)
- '.'yyyy-MM-dd,对应daily(每天)
- '.'yyyy-MM-dd-a,对应half-daily(每半天)
- '.'yyyy-MM-dd-HH,对应hourly(每小时)
- '.'yyyy-MM-dd-HH-mm,对应minutely(每分钟)
在resources下面创建一个log4j.properties,代码如下:
# 配置 Root 顶级父元素 # 指定日志输出级别为=debug ,使用的appender为=console、file、dailyFile log4j.rootLogger = debug,console,file,logDB,dailyFile# 指定 控制台日志 log4j.appender.console = org.apache.log4j.ConsoleAppender # 指定 消息格式 log4j.appender.console.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 %p:消息级别、%r:消息用的时间、 # %c:类全名、%t:线程名、%F:文件名 %L:行号 # [%p]%r %c %t %F %L %d{yyyy-MM-dd HH:mm:ss} = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} log4j.appender.console.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n# 指定 日志文件 输出的 appender log4j.appender.file = org.apache.log4j.FileAppender # 指定 消息格式 log4j.appender.file.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 log4j.appender.file.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n # 指定 消息日志文件保存的路径 log4j.appender.file.file = ./logs/log4j.log # 指定 消息日志文件的字符集 log4j.appender.file.encoding = UTF-8# 指定 日志文件 输出到数据库Mysql log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender log4j.appender.logDB.layout = org.apache.log4j.PatternLayout log4j.appender.logDB.Driver = com.mysql.cj.jdbc.Driver log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/cqyddx?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai log4j.appender.logDB.User = root log4j.appender.logDB.Password = root log4j.appender.logDB.Sql = INSERT INTO log(project_name, create_date, LEVEL, category, file_name, thread_name, line, all_category, message) \VALUES ('itcast', '%d{yyyy-MM-dd HH:mm:ss}', '%p', '%c', '%F', '%t', '%L', '%l', '%m');#按照时间规则拆分的appender对象 log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender #指定消息格式layout log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout #指定消息格式的内容 log4j.appender.dailyFile.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS] %m%n #指定日志文件保存路径 log4j.appender.dailyFile.file = ./logs/dailyFile.log #指定日志文件的字符集 log4j.appender.dailyFile.encoding = UTF-8 #指定日期拆分规则,按照指定格式拆分(即按月、周、天、小时等拆封,并文件命名也以此方式命名,此处以秒为案例。实际过程中都是以天或周以上的为主) log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ssy运行结果截图:
测试代码:
public class Log4jTest {@Testpublic void test() {//获取日志记录器对象Logger logger = Logger.getLogger(Log4jTest.class);for (int i = 0; i < 100000; i++) {//日志级别logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行logger.error("error"); // 错误信息,不会影响系统运行logger.warn("warn");//警告信息,可能会发生问题logger.info("info");// 运行信息,数据连接、网络连接、I0操作等等logger.debug("debug");// 调试信息,一般在开发中使用,记录程序变量参数传递信息等等logger.trace("trace"); //追踪信息,记录程序所有的流程信息}}
}
运行结果截图
006、磁盘文件滚动输出日志
测试代码:
public class Log4jTest {@Testpublic void test() {//获取日志记录器对象Logger logger = Logger.getLogger(Log4jTest.class);for (int i = 0; i < 100000; i++) {//日志级别logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行logger.error("error"); // 错误信息,不会影响系统运行logger.warn("warn");//警告信息,可能会发生问题logger.info("info");// 运行信息,数据连接、网络连接、I0操作等等logger.debug("debug");// 调试信息,一般在开发中使用,记录程序变量参数传递信息等等logger.trace("trace"); //追踪信息,记录程序所有的流程信息}}
}
在resources下面创建一个log4j.properties,代码如下:配置文件
# 配置 Root 顶级父元素 # 指定日志输出级别为=debug ,使用的appender为=console、file、dailyFile,rollingFile # log4j.rootLogger = debug,console,file,logDB,dailyFile,rollingFilelog4j.rootLogger = debug,rollingFile# 指定 控制台日志 log4j.appender.console = org.apache.log4j.ConsoleAppender # 指定 消息格式 log4j.appender.console.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 %p:消息级别、%r:消息用的时间、 # %c:类全名、%t:线程名、%F:文件名 %L:行号 # [%p]%r %c %t %F %L %d{yyyy-MM-dd HH:mm:ss} = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} log4j.appender.console.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n# 指定 日志文件 输出的 appender log4j.appender.file = org.apache.log4j.FileAppender # 指定 消息格式 log4j.appender.file.layout = org.apache.log4j.PatternLayout # 指定 消息格式的内容 log4j.appender.file.layout.conversionPattern = [%p]%r %l %d{yyyy-MM-dd HH:mm:ss} %m%n # 指定 消息日志文件保存的路径 log4j.appender.file.file = ./logs/log4j.log # 指定 消息日志文件的字符集 log4j.appender.file.encoding = UTF-8# 指定 日志文件 输出到数据库Mysql log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender log4j.appender.logDB.layout = org.apache.log4j.PatternLayout log4j.appender.logDB.Driver = com.mysql.cj.jdbc.Driver log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/cqyddx?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai log4j.appender.logDB.User = root log4j.appender.logDB.Password = root log4j.appender.logDB.Sql = INSERT INTO log(project_name, create_date, LEVEL, category, file_name, thread_name, line, all_category, message) \VALUES ('itcast', '%d{yyyy-MM-dd HH:mm:ss}', '%p', '%c', '%F', '%t', '%L', '%l', '%m');#按照时间规则拆分的appender对象 log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender #指定消息格式layout log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout #指定消息格式的内容 log4j.appender.dailyFile.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS] %m%n #指定日志文件保存路径 log4j.appender.dailyFile.file = ./logs/dailyFile.log #指定日志文件的字符集 log4j.appender.dailyFile.encoding = UTF-8 #指定日期拆分规则 log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss#按照日志大小拆分文件 log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender #指定消息格式 layout log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout log4j.appender.rollingFile.layout.conversionPa #指定消息格式的内容 ttern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS] %m%n #指定日志文件保存路径 log4j.appender.rollingFile.file = ./logs/rollingFile.log #指定日志文件的字符集 log4j.appender.rollingFile.encoding = UTF-8 #指定日志文件内容大小 #配置日志文件拆分的阈值,超过了这个值就会生成一个新的文件,默认10M log4j.appender.rollingFile.maxFileSize = 1MB #配置拆分文件的个数,默认1个1MB就拆分一个,如果超过阈值,保留最新的,覆盖最旧的 #指定日志文件数量,例如满足 log4j.appender.rollingFile.maxBackupIndex = 3 #指定输出级别为debug,优先级最高 log4j.appender.rollingFile.Threshold=DEBUG #日志立即输出,不用缓冲,默认为true log4j.appender.rollingFile.ImmediateFlush=true #因为是文件,所以会有追加的动作,控制是否追加,还是覆盖,默认为true log4j.appender.rollingFile.Append=true
运行结果如图
日志门面详解
Java的常用日志技术详解(一)相关推荐
- Java Garbage Collection基础详解------Java 垃圾回收机制技术详解
最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面试官问的时候也不存在问题,直到那天该公司一个做搜索的面试官问了我GC的问题,具体就是:老年代使用的是哪中垃圾 ...
- JAVA spring 常用包作用详解(转)
转载地址:https://www.cnblogs.com/Tmc-Blog/p/6093162.html <project xmlns="http://maven.apache.org ...
- Java之IO流技术详解
何为IO? 首先,我们看看百度给出的解释. I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分. i是写入,Input的首字母.o是输出,Output的首字母. IO 也称为 ...
- JVM调优系列--Java命令选项(参数)--大全/详解/常用
原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...
- java技术详解_Java反射技术详解及实例解析
前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...
- java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
资源名称:Java数据库技术详解(李刚) PDF 第一篇 数据库基础篇 第1章 Java和数据库 2 1.1 Java概述 2 1.1.1 跨平台性 2 1.1.2 面向对象 2 1.1.3 安全性 ...
- 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了
摘自:https://mp.weixin.qq.com/s/OZnnuA31tEaVt0vnDOy5hQ 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了 原创 小翼 飞思实验室 今天 基 ...
- java 编程 pdf linux_Linux编程技术详解.pdf
Linux编程技术详解全面介绍了linux编程相关的知识,内容涵盖linux基本知识.如何建立linux开发环境.linux开发工具.linux文件系统.文件i/o操作.设备文件.进程与进程环境.守护 ...
- java canvas详解_HTML5的canvas绘图技术详解
原标题:HTML5的canvas绘图技术详解 本篇教程探讨了HTML5的canvas绘图技术详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < canvas ...
最新文章
- Require.js
- Docker + gunicron + supervisord 部署python应用
- gitlab 自动推送代码到gitee_Gitlab 利用 Webhook+jenkins 实现自动构建与部署
- 电子版,材料获取说明
- 爬虫神器:超炫酷的自动化工具 Selenium
- 安卓学习 之 bitmap用法
- 使用JDK自带的VisualVM进行Java程序的性能分析
- pyautogui 打包 运行 窗口_试试动态窗口管理器 dwm 吧
- 3不能安装库_不锈钢水槽如何安装?3个细节要注意,不能忽视,别被套路了
- 她被“誉为”中科院最美女院士,52岁依然貌美如花?气质不输女星
- 输入法画面_搜狗输入法:用AI技术谱写诗意生活
- php 生成随机数组,利用php如何获取随机数组列表
- 使用matlab生成正弦波、三角波、方波的COE文件
- 单片机c语言编程乘法运算符,单片机C语言编程常用的运算符介绍
- (三十七)java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案
- 查询-SPJ练习1参考答案
- 红孩儿编辑器的模块设计3
- 一文看懂推荐系统:概要01:推荐系统的基本概念
- uni-app 快速集成 IM 即时通信的方法——TUIKit 来啦
- winusb —— 不再为你的usb设备编写驱动
热门文章
- Linux CentOS中按tab键不能自动补全解决办法
- Redis使用场景【java】
- 【花雕】青少年机器人教育等级评测模拟题_20200715(一级)
- 2023年二建报考条件是什么?考试考什么?来考网
- 关于 那些年啊,那些事——一个程序员的奋斗史 ——24提到的鼻炎治疗方法
- 计算机弹奏新年快乐图片大全,2020新年快乐图文素材:抖音跨年图片文字精选集[多图]...
- 关于error handling的一些理解
- 腾讯云 yum mysql_详解腾讯云CentOS7.0使用yum安装mysql及使用遇到的问题
- MQTT客户端工具介绍
- 什么是涉密信息系统?